From 9377817185248967b71b4083e04c9d76bd65cffd Mon Sep 17 00:00:00 2001 From: Olaf Hering Date: Sun, 20 Nov 2011 17:02:47 +0100 Subject: xenpaging: watch the guests memory/target-tot_pages xenstore value Subsequent patches will use xenstored to store the numbers of pages xenpaging is suppose to page-out. Remove num_pages and use target_pages instead. Signed-off-by: Olaf Hering Committed-by: Ian Jackson --- tools/xenpaging/xenpaging.c | 51 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) (limited to 'tools/xenpaging') diff --git a/tools/xenpaging/xenpaging.c b/tools/xenpaging/xenpaging.c index 656a8b6749..1de57df069 100644 --- a/tools/xenpaging/xenpaging.c +++ b/tools/xenpaging/xenpaging.c @@ -19,8 +19,10 @@ */ #define _XOPEN_SOURCE 600 +#define _GNU_SOURCE #include +#include #include #include #include @@ -35,6 +37,10 @@ #include "policy.h" #include "xenpaging.h" +/* Defines number of mfns a guest should use at a time, in KiB */ +#define WATCH_TARGETPAGES "memory/target-tot_pages" +static char *watch_target_tot_pages; +static char *dom_path; static char watch_token[16]; static char filename[80]; static int interrupted; @@ -72,7 +78,7 @@ static int xenpaging_wait_for_event_or_timeout(xenpaging_t *paging) { xc_interface *xch = paging->xc_handle; xc_evtchn *xce = paging->mem_event.xce_handle; - char **vec; + char **vec, *val; unsigned int num; struct pollfd fd[2]; int port; @@ -111,6 +117,25 @@ static int xenpaging_wait_for_event_or_timeout(xenpaging_t *paging) rc = 0; } } + else if ( strcmp(vec[XS_WATCH_PATH], watch_target_tot_pages) == 0 ) + { + int ret, target_tot_pages; + val = xs_read(paging->xs_handle, XBT_NULL, vec[XS_WATCH_PATH], NULL); + if ( val ) + { + ret = sscanf(val, "%d", &target_tot_pages); + if ( ret > 0 ) + { + /* KiB to pages */ + target_tot_pages >>= 2; + if ( target_tot_pages < 0 || target_tot_pages > paging->max_pages ) + target_tot_pages = paging->max_pages; + paging->target_tot_pages = target_tot_pages; + DPRINTF("new target_tot_pages %d\n", target_tot_pages); + } + free(val); + } + } free(vec); } } @@ -216,6 +241,25 @@ static xenpaging_t *xenpaging_init(domid_t domain_id, int target_tot_pages) goto err; } + /* Watch xenpagings working target */ + dom_path = xs_get_domain_path(paging->xs_handle, domain_id); + if ( !dom_path ) + { + PERROR("Could not find domain path\n"); + goto err; + } + if ( asprintf(&watch_target_tot_pages, "%s/%s", dom_path, WATCH_TARGETPAGES) < 0 ) + { + PERROR("Could not alloc watch path\n"); + goto err; + } + DPRINTF("watching '%s'\n", watch_target_tot_pages); + if ( xs_watch(paging->xs_handle, watch_target_tot_pages, "") == false ) + { + PERROR("Could not bind to xenpaging watch\n"); + goto err; + } + p = getenv("XENPAGING_POLICY_MRU_SIZE"); if ( p && *p ) { @@ -342,6 +386,8 @@ static xenpaging_t *xenpaging_init(domid_t domain_id, int target_tot_pages) free(paging->mem_event.ring_page); } + free(dom_path); + free(watch_target_tot_pages); free(paging->bitmap); free(paging); } @@ -357,6 +403,9 @@ static int xenpaging_teardown(xenpaging_t *paging) if ( paging == NULL ) return 0; + xs_unwatch(paging->xs_handle, watch_target_tot_pages, ""); + xs_unwatch(paging->xs_handle, "@releaseDomain", watch_token); + xch = paging->xc_handle; paging->xc_handle = NULL; /* Tear down domain paging in Xen */ -- cgit v1.2.3