aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 );