[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 21 of 24] xenpaging: use guests tot_pages as working target
# HG changeset patch # User Olaf Hering <olaf@xxxxxxxxx> # Date 1317653622 -7200 # Node ID 8fa2067ed61105a0ae31939f0ca58b8921fc55d4 # Parent 916749c1775b4435629c747afa4b38c8cbb7dd5b xenpaging: use guests tot_pages as working target Signed-off-by: Olaf Hering <olaf@xxxxxxxxx> diff -r 916749c1775b -r 8fa2067ed611 tools/xenpaging/policy_default.c --- a/tools/xenpaging/policy_default.c +++ b/tools/xenpaging/policy_default.c @@ -71,7 +71,6 @@ int policy_init(xenpaging_t *paging) /* Start in the middle to avoid paging during BIOS startup */ current_gfn = max_pages / 2; - current_gfn -= paging->num_pages / 2; rc = 0; out: diff -r 916749c1775b -r 8fa2067ed611 tools/xenpaging/xenpaging.c --- a/tools/xenpaging/xenpaging.c +++ b/tools/xenpaging/xenpaging.c @@ -137,6 +137,21 @@ err: return rc; } +static int xenpaging_get_tot_pages(xenpaging_t *paging) +{ + xc_interface *xch = paging->xc_handle; + xc_domaininfo_t domain_info; + int rc; + + rc = xc_domain_getinfolist(xch, paging->mem_event.domain_id, 1, &domain_info); + if ( rc != 1 ) + { + PERROR("Error getting domain info"); + return -1; + } + return domain_info.tot_pages; +} + static void *init_page(void) { void *buffer; @@ -162,7 +177,7 @@ static void *init_page(void) return NULL; } -static xenpaging_t *xenpaging_init(domid_t domain_id, int num_pages) +static xenpaging_t *xenpaging_init(domid_t domain_id, int target_tot_pages) { xenpaging_t *paging; xc_domaininfo_t domain_info; @@ -294,12 +309,7 @@ static xenpaging_t *xenpaging_init(domid } DPRINTF("max_pages = %d\n", paging->max_pages); - if ( num_pages < 0 || num_pages > paging->max_pages ) - { - num_pages = paging->max_pages; - DPRINTF("setting num_pages to %d\n", num_pages); - } - paging->num_pages = num_pages; + paging->target_tot_pages = target_tot_pages; /* Initialise policy */ rc = policy_init(paging); @@ -649,7 +659,9 @@ int main(int argc, char *argv[]) xenpaging_victim_t *victims; mem_event_request_t req; mem_event_response_t rsp; + int num, prev_num = 0; int i; + int tot_pages; int rc = -1; int rc1; xc_interface *xch; @@ -660,7 +672,7 @@ int main(int argc, char *argv[]) if ( argc != 3 ) { - fprintf(stderr, "Usage: %s <domain_id> <num_pages>\n", argv[0]); + fprintf(stderr, "Usage: %s <domain_id> <tot_pages>\n", argv[0]); return -1; } @@ -673,7 +685,7 @@ int main(int argc, char *argv[]) } xch = paging->xc_handle; - DPRINTF("starting %s %u %d\n", argv[0], paging->mem_event.domain_id, paging->num_pages); + DPRINTF("starting %s %u %d\n", argv[0], paging->mem_event.domain_id, paging->target_tot_pages); /* Open file */ sprintf(filename, "page_cache_%u", paging->mem_event.domain_id); @@ -705,9 +717,6 @@ int main(int argc, char *argv[]) /* listen for page-in events to stop pager */ create_page_in_thread(paging); - i = evict_pages(paging, fd, victims, paging->num_pages); - DPRINTF("%d pages evicted. Done.\n", i); - /* Swap pages in and out */ while ( 1 ) { @@ -772,12 +781,8 @@ int main(int argc, char *argv[]) goto out; } - /* Evict a new page to replace the one we just paged in, - * or clear this pagefile slot on exit */ - if ( interrupted ) - victims[i].gfn = INVALID_MFN; - else - evict_victim(paging, &victims[i], fd, i); + /* Clear this pagefile slot */ + victims[i].gfn = INVALID_MFN; } else { @@ -822,6 +827,43 @@ int main(int argc, char *argv[]) if ( interrupted ) break; + /* Check if the target has been reached already */ + tot_pages = xenpaging_get_tot_pages(paging); + if ( tot_pages < 0 ) + goto out; + + /* Resume all pages if paging is disabled or no target was set */ + if ( paging->target_tot_pages == 0 ) + { + if ( paging->num_paged_out ) + resume_pages(paging, paging->num_paged_out); + } + /* Evict more pages if target not reached */ + else if ( tot_pages > paging->target_tot_pages ) + { + num = tot_pages - paging->target_tot_pages; + if ( num != prev_num ) + { + DPRINTF("Need to evict %d pages to reach %d target_tot_pages\n", num, paging->target_tot_pages); + prev_num = num; + } + /* Limit the number of evicts to be able to process page-in requests */ + if ( num > 42 ) + num = 42; + evict_pages(paging, fd, victims, num); + } + /* Resume some pages if target not reached */ + else if ( tot_pages < paging->target_tot_pages && paging->num_paged_out ) + { + num = paging->target_tot_pages - tot_pages; + if ( num != prev_num ) + { + DPRINTF("Need to resume %d pages to reach %d target_tot_pages\n", num, paging->target_tot_pages); + prev_num = num; + } + resume_pages(paging, num); + } + } DPRINTF("xenpaging got signal %d\n", interrupted); diff -r 916749c1775b -r 8fa2067ed611 tools/xenpaging/xenpaging.h --- a/tools/xenpaging/xenpaging.h +++ b/tools/xenpaging/xenpaging.h @@ -50,7 +50,7 @@ typedef struct xenpaging { /* number of pages for which data structures were allocated */ int max_pages; int num_paged_out; - int num_pages; + int target_tot_pages; int policy_mru_size; unsigned long pagein_queue[XENPAGING_PAGEIN_QUEUE_SIZE]; } xenpaging_t; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |