diff options
author | Olaf Hering <olaf@aepfle.de> | 2011-06-10 10:47:28 +0200 |
---|---|---|
committer | Olaf Hering <olaf@aepfle.de> | 2011-06-10 10:47:28 +0200 |
commit | 3568b93ad4b6301b8e66668c8e9c8427adcfa2a7 (patch) | |
tree | d0507a04c9face28ba058341feeb303c33f6b3e0 /tools/xenpaging/xenpaging.c | |
parent | 64816ee56f60b190d4916a80616e28bbc60d19ad (diff) | |
download | xen-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.c | 35 |
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); |