This change reverses the task of xenpaging. Before this change a fixed number of pages was paged out. With this change the guest will not have access to more than the given number of pages at the same time. The xenpaging= config option is replaced by actmem= A new xm mem-swap-target is added. The xenpaging binary is moved to /usr/lib/xen/bin/ xenpaging.HVMCOPY_gfn_paged_out.patch xenpaging.XEN_PAGING_DIR.patch xenpaging.add_evict_pages.patch xenpaging.bitmap_clear.patch xenpaging.cmdline-interface.patch xenpaging.encapsulate_domain_info.patch xenpaging.file_op-return-code.patch xenpaging.guest-memusage.patch xenpaging.install-to-libexec.patch xenpaging.low_target_policy_nomru.patch xenpaging.main-loop-exit-handling.patch xenpaging.misleading-comment.patch xenpaging.page_in-munmap-size.patch xenpaging.print-gfn.patch xenpaging.record-numer-paged-out-pages.patch xenpaging.reset-uncomsumed.patch xenpaging.stale-comments.patch xenpaging.target-tot_pages.patch xenpaging.use-PERROR.patch xenpaging.watch-target-tot_pages.patch xenpaging.watch_event-DPRINTF.patch xenpaging.xc_interface_open-comment.patch - xen.spec: update filelist package /usr/lib*/xen with wildcard to pickup new files remove duplicate /usr/sbin/xen-list from filelist OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=157
121 lines
3.8 KiB
Diff
121 lines
3.8 KiB
Diff
# HG changeset patch
|
|
# Parent 0d872bf1203dd36200477f688908797875035b50
|
|
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 <olaf@aepfle.de>
|
|
|
|
---
|
|
tools/xenpaging/xenpaging.c | 51 +++++++++++++++++++++++++++++++++++++++++++-
|
|
1 file changed, 50 insertions(+), 1 deletion(-)
|
|
|
|
Index: xen-4.1.2-testing/tools/xenpaging/xenpaging.c
|
|
===================================================================
|
|
--- xen-4.1.2-testing.orig/tools/xenpaging/xenpaging.c
|
|
+++ xen-4.1.2-testing/tools/xenpaging/xenpaging.c
|
|
@@ -19,8 +19,10 @@
|
|
*/
|
|
|
|
#define _XOPEN_SOURCE 600
|
|
+#define _GNU_SOURCE
|
|
|
|
#include <inttypes.h>
|
|
+#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h>
|
|
#include <time.h>
|
|
@@ -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_t
|
|
{
|
|
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_t
|
|
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
|
|
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
|
|
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_
|
|
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 */
|