#include "policy.h"
-#define MRU_SIZE (1024 * 16)
+#define DEFAULT_MRU_SIZE (1024 * 16)
-static unsigned long mru[MRU_SIZE];
+static unsigned long *mru;
static unsigned int i_mru;
+static unsigned int mru_size;
static unsigned long *bitmap;
static unsigned long *unconsumed;
static unsigned long current_gfn;
max_pages = paging->domain_info->max_pages;
/* Initialise MRU list of paged in pages */
- for ( i = 0; i < MRU_SIZE; i++ )
+ if ( paging->policy_mru_size > 0 )
+ mru_size = paging->policy_mru_size;
+ else
+ mru_size = DEFAULT_MRU_SIZE;
+
+ mru = malloc(sizeof(*mru) * mru_size);
+ if ( mru == NULL )
+ {
+ rc = -ENOMEM;
+ goto out;
+ }
+
+ for ( i = 0; i < mru_size; i++ )
mru[i] = INVALID_MFN;
/* Don't page out page 0 */
void policy_notify_paged_in(unsigned long gfn)
{
- unsigned long old_gfn = mru[i_mru & (MRU_SIZE - 1)];
+ unsigned long old_gfn = mru[i_mru & (mru_size - 1)];
if ( old_gfn != INVALID_MFN )
clear_bit(old_gfn, bitmap);
- mru[i_mru & (MRU_SIZE - 1)] = gfn;
+ mru[i_mru & (mru_size - 1)] = gfn;
i_mru++;
}
xenpaging_t *paging;
xc_interface *xch;
xentoollog_logger *dbg = NULL;
+ char *p;
int rc;
if ( getenv("XENPAGING_DEBUG") )
paging = malloc(sizeof(xenpaging_t));
memset(paging, 0, sizeof(xenpaging_t));
+ p = getenv("XENPAGING_POLICY_MRU_SIZE");
+ if ( p && *p )
+ {
+ paging->policy_mru_size = atoi(p);
+ DPRINTF("Setting policy mru_size to %d\n", paging->policy_mru_size);
+ }
+
/* Open connection to xen */
paging->xc_handle = xch;