aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xenpaging/xenpaging.c
diff options
context:
space:
mode:
authorOlaf Hering <olaf@aepfle.de>2011-06-10 10:47:28 +0200
committerOlaf Hering <olaf@aepfle.de>2011-06-10 10:47:28 +0200
commit3568b93ad4b6301b8e66668c8e9c8427adcfa2a7 (patch)
treed0507a04c9face28ba058341feeb303c33f6b3e0 /tools/xenpaging/xenpaging.c
parent64816ee56f60b190d4916a80616e28bbc60d19ad (diff)
downloadxen-3568b93ad4b6301b8e66668c8e9c8427adcfa2a7.tar.gz
xen-3568b93ad4b6301b8e66668c8e9c8427adcfa2a7.tar.bz2
xen-3568b93ad4b6301b8e66668c8e9c8427adcfa2a7.zip
xenpaging: implement stopping of pager by sending SIGTERM/SIGINT
Write all paged-out pages back into the guest if the pager is interrupted by ctrl-c or if it receives SIGTERM. Signed-off-by: Olaf Hering <olaf@aepfle.de> Committed-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools/xenpaging/xenpaging.c')
-rw-r--r--tools/xenpaging/xenpaging.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/tools/xenpaging/xenpaging.c b/tools/xenpaging/xenpaging.c
index 55e00e60e3..14b64df968 100644
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -650,6 +650,9 @@ int main(int argc, char *argv[])
sigaction(SIGINT, &act, NULL);
sigaction(SIGALRM, &act, NULL);
+ /* listen for page-in events to stop pager */
+ create_page_in_thread(paging->mem_event.domain_id, xch);
+
/* Evict pages */
for ( i = 0; i < paging->num_pages; i++ )
{
@@ -665,7 +668,7 @@ int main(int argc, char *argv[])
DPRINTF("%d pages evicted. Done.\n", i);
/* Swap pages in and out */
- while ( !interrupted )
+ while ( 1 )
{
/* Wait for Xen to signal that a page needs paged in */
rc = xenpaging_wait_for_event_or_timeout(paging);
@@ -728,8 +731,12 @@ int main(int argc, char *argv[])
goto out;
}
- /* Evict a new page to replace the one we just paged in */
- evict_victim(paging, &victims[i], fd, i);
+ /* 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);
}
else
{
@@ -756,6 +763,28 @@ int main(int argc, char *argv[])
}
}
}
+
+ /* Write all pages back into the guest */
+ if ( interrupted == SIGTERM || interrupted == SIGINT )
+ {
+ for ( i = 0; i < paging->domain_info->max_pages; i++ )
+ {
+ if ( test_bit(i, paging->bitmap) )
+ {
+ page_in_trigger(i);
+ break;
+ }
+ }
+ /* If no more pages to process, exit loop */
+ if ( i == paging->domain_info->max_pages )
+ break;
+ }
+ else
+ {
+ /* Exit on any other signal */
+ if ( interrupted )
+ break;
+ }
}
DPRINTF("xenpaging got signal %d\n", interrupted);