aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xenpaging
diff options
context:
space:
mode:
authorOlaf Hering <olaf@aepfle.de>2012-02-20 21:18:44 +0100
committerOlaf Hering <olaf@aepfle.de>2012-02-20 21:18:44 +0100
commit7520fdef279e12a9da5de7eab088dc7abc9fa230 (patch)
tree1725b065e3e076372b402b857cfbd6cf04f849be /tools/xenpaging
parentf07d3c043793de26b6c385551256e166e2d356ff (diff)
downloadxen-7520fdef279e12a9da5de7eab088dc7abc9fa230.tar.gz
xen-7520fdef279e12a9da5de7eab088dc7abc9fa230.tar.bz2
xen-7520fdef279e12a9da5de7eab088dc7abc9fa230.zip
xenpaging: reduce number of qemu cache flushes
Currently the command to flush the qemu cache is called alot if there are no more pages to evict. This causes churn in the logfiles, and qemu can not release more pages anyway since the last command. Fix this by remembering the current number of paged-out gfns, if this number did not change since the last flush command then sending another new flush command will not free any more gfns. Remove return code from xenpaging_mem_paging_flush_ioemu_cache() since errors do not matter, and will be handled elsewhere. Also failure to send the flush command is not fatal. Signed-off-by: Olaf Hering <olaf@aepfle.de> Committed-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools/xenpaging')
-rw-r--r--tools/xenpaging/xenpaging.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/tools/xenpaging/xenpaging.c b/tools/xenpaging/xenpaging.c
index e25614063a..6cead5e3c7 100644
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -61,18 +61,15 @@ static void close_handler(int sig)
unlink_pagefile();
}
-static int xenpaging_mem_paging_flush_ioemu_cache(struct xenpaging *paging)
+static void xenpaging_mem_paging_flush_ioemu_cache(struct xenpaging *paging)
{
struct xs_handle *xsh = paging->xs_handle;
domid_t domain_id = paging->mem_event.domain_id;
char path[80];
- bool rc;
sprintf(path, "/local/domain/0/device-model/%u/command", domain_id);
- rc = xs_write(xsh, XBT_NULL, path, "flush-cache", strlen("flush-cache"));
-
- return rc == true ? 0 : -1;
+ xs_write(xsh, XBT_NULL, path, "flush-cache", strlen("flush-cache"));
}
static int xenpaging_wait_for_event_or_timeout(struct xenpaging *paging)
@@ -728,7 +725,7 @@ static int evict_victim(struct xenpaging *paging, int fd, int slot)
{
xc_interface *xch = paging->xc_handle;
unsigned long gfn;
- int j = 0;
+ static int num_paged_out;
int ret;
do
@@ -736,6 +733,17 @@ static int evict_victim(struct xenpaging *paging, int fd, int slot)
gfn = policy_choose_victim(paging);
if ( gfn == INVALID_MFN )
{
+ /* If the number did not change after last flush command then
+ * the command did not reach qemu yet, or qemu still processes
+ * the command, or qemu has nothing to release.
+ * Right now there is no need to issue the command again.
+ */
+ if ( num_paged_out != paging->num_paged_out )
+ {
+ DPRINTF("Flushing qemu cache\n");
+ xenpaging_mem_paging_flush_ioemu_cache(paging);
+ num_paged_out = paging->num_paged_out;
+ }
ret = -ENOSPC;
goto out;
}
@@ -748,12 +756,6 @@ static int evict_victim(struct xenpaging *paging, int fd, int slot)
ret = xc_mem_paging_nominate(xch, paging->mem_event.domain_id, gfn);
if ( ret == 0 )
ret = xenpaging_evict_page(paging, gfn, fd, slot);
- else
- {
- if ( j++ % 1000 == 0 )
- if ( xenpaging_mem_paging_flush_ioemu_cache(paging) )
- PERROR("Error flushing ioemu cache");
- }
}
while ( ret );