All of lore.kernel.org
 help / color / mirror / Atom feed
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [PATCH 21 of 22] xenpaging: implement stopping of pager by sending SIGTERM/SIGINT
Date: Fri, 10 Jun 2011 11:13:10 +0200	[thread overview]
Message-ID: <39e5460d899872c96546.1307697190@probook.site> (raw)
In-Reply-To: <patchbomb.1307697169@probook.site>

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1307695648 -7200
# Node ID 39e5460d899872c9654634a24c66160495f4d3c2
# Parent  3446ab4866249018b1611fdfe430cbb2ff2a5b31
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>

diff -r 3446ab486624 -r 39e5460d8998 tools/xenpaging/Makefile
--- a/tools/xenpaging/Makefile	Fri Jun 10 10:47:27 2011 +0200
+++ b/tools/xenpaging/Makefile	Fri Jun 10 10:47:28 2011 +0200
@@ -8,6 +8,7 @@ POLICY    = default
 
 SRC      :=
 SRCS     += file_ops.c xenpaging.c policy_$(POLICY).c
+SRCS     += pagein.c
 
 CFLAGS   += -Werror
 CFLAGS   += -Wno-unused
diff -r 3446ab486624 -r 39e5460d8998 tools/xenpaging/pagein.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/xenpaging/pagein.c	Fri Jun 10 10:47:28 2011 +0200
@@ -0,0 +1,68 @@
+/* Trigger a page-in in a separate thread-of-execution to avoid deadlock */
+#include <pthread.h>
+#include "xc_private.h"
+
+struct page_in_args {
+    domid_t dom;
+    xc_interface *xch;
+};
+
+static struct page_in_args page_in_args;
+static unsigned long page_in_gfn;
+static unsigned int page_in_possible;
+
+static pthread_t page_in_thread;
+static pthread_cond_t page_in_cond = PTHREAD_COND_INITIALIZER;
+static pthread_mutex_t page_in_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static void *page_in(void *arg)
+{
+    struct page_in_args *pia = arg;
+    void *page;
+    xen_pfn_t gfn;
+
+    while (1)
+    {
+        pthread_mutex_lock(&page_in_mutex);
+        while (!page_in_gfn)
+            pthread_cond_wait(&page_in_cond, &page_in_mutex);
+        gfn = page_in_gfn;
+        page_in_gfn = 0;
+        pthread_mutex_unlock(&page_in_mutex);
+
+        /* Ignore errors */
+        page = xc_map_foreign_pages(pia->xch, pia->dom, PROT_READ, &gfn, 1);
+        if (page)
+            munmap(page, PAGE_SIZE);
+    }
+    page_in_possible = 0;
+    pthread_exit(NULL);
+}
+
+void page_in_trigger(unsigned long gfn)
+{
+    if (!page_in_possible)
+        return;
+
+    pthread_mutex_lock(&page_in_mutex);
+    page_in_gfn = gfn;
+    pthread_mutex_unlock(&page_in_mutex);
+    pthread_cond_signal(&page_in_cond);
+}
+
+void create_page_in_thread(domid_t domain_id, xc_interface *xch)
+{
+    page_in_args.dom = domain_id;
+    page_in_args.xch = xch;
+    if (pthread_create(&page_in_thread, NULL, page_in, &page_in_args) == 0)
+        page_in_possible = 1;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End: 
+ */
diff -r 3446ab486624 -r 39e5460d8998 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c	Fri Jun 10 10:47:27 2011 +0200
+++ b/tools/xenpaging/xenpaging.c	Fri Jun 10 10:47:28 2011 +0200
@@ -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);
 
diff -r 3446ab486624 -r 39e5460d8998 tools/xenpaging/xenpaging.h
--- a/tools/xenpaging/xenpaging.h	Fri Jun 10 10:47:27 2011 +0200
+++ b/tools/xenpaging/xenpaging.h	Fri Jun 10 10:47:28 2011 +0200
@@ -53,6 +53,9 @@ typedef struct xenpaging_victim {
 } xenpaging_victim_t;
 
 
+extern void create_page_in_thread(domid_t domain_id, xc_interface *xch);
+extern void page_in_trigger(unsigned long gfn);
+
 #endif // __XEN_PAGING_H__

  parent reply	other threads:[~2011-06-10  9:13 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-10  9:12 [PATCH 00 of 22] xenpaging and libxc fixes for xen-unstable Olaf Hering
2011-06-10  9:12 ` [PATCH 01 of 22] xenpaging: remove unused spinlock in pager Olaf Hering
2011-06-21 16:24   ` Ian Jackson
2011-06-10  9:12 ` [PATCH 02 of 22] tools: merge several bitop functions into xc_bitops.h Olaf Hering
2011-06-21 16:16   ` Ian Jackson
2011-06-21 16:20     ` Olaf Hering
2011-06-21 16:25       ` Ian Jackson
2011-06-21 17:17     ` Olaf Hering
2011-06-21 17:18       ` Ian Jackson
2011-06-22 14:03         ` Ian Jackson
2011-06-10  9:12 ` [PATCH 03 of 22] xenpaging: add xs_handle to struct xenpaging Olaf Hering
2011-06-14 11:05   ` Ian Campbell
2011-06-20  9:58     ` [PATCH 03 of 22 v2] " Olaf Hering
2011-06-21 13:17       ` Ian Campbell
2011-06-21 15:33         ` [PATCH 03 of 22 v3] " Olaf Hering
2011-06-10  9:12 ` [PATCH 04 of 22] xenpaging: drop xc.c, remove ASSERT Olaf Hering
2011-06-10  9:12 ` [PATCH 05 of 22] xenpaging: drop xc.c, remove xc_platform_info_t Olaf Hering
2011-06-10  9:12 ` [PATCH 06 of 22] xenpaging: drop xc.c, remove xc_wait_for_event Olaf Hering
2011-06-10  9:12 ` [PATCH 07 of 22] xenpaging: drop xc.c, move xc_mem_paging_flush_ioemu_cache Olaf Hering
2011-06-10  9:12 ` [PATCH 08 of 22] xenpaging: drop xc.c, move xc_wait_for_event_or_timeout Olaf Hering
2011-06-10  9:12 ` [PATCH 09 of 22] xenpaging: drop xc.c, remove xc files Olaf Hering
2011-06-10  9:12 ` [PATCH 10 of 22] xenpaging: correct dropping of pages to avoid full ring buffer Olaf Hering
2011-06-10  9:13 ` [PATCH 11 of 22] xenpaging: do not bounce p2mt to xenpaging Olaf Hering
2011-06-13 10:48   ` Tim Deegan
2011-06-20  9:57     ` [PATCH 11 of 22 v2] xenpaging: do not bounce p2mt back to the hypervisor Olaf Hering
2011-06-20 10:36       ` Tim Deegan
2011-06-10  9:13 ` [PATCH 12 of 22] xenpaging: remove srand call Olaf Hering
2011-06-10  9:13 ` [PATCH 13 of 22] xenpaging: remove return values from functions that can not fail Olaf Hering
2011-06-10  9:13 ` [PATCH 14 of 22] xenpaging: catch xc_mem_paging_resume errors Olaf Hering
2011-06-10  9:13 ` [PATCH 15 of 22] xenpaging: remove local domain_id variable Olaf Hering
2011-06-10  9:13 ` [PATCH 16 of 22] xenpaging: move num_pages into xenpaging struct Olaf Hering
2011-06-10  9:13 ` [PATCH 17 of 22] xenpaging: start paging in the middle of gfn range Olaf Hering
2011-06-10  9:13 ` [PATCH 18 of 22] xenpaging: pass integer to xenpaging_populate_page Olaf Hering
2011-06-10  9:13 ` [PATCH 19 of 22] xenpaging: add helper function for unlinking pagefile Olaf Hering
2011-06-10  9:13 ` [PATCH 20 of 22] xenpaging: add watch thread to catch guest shutdown Olaf Hering
2011-06-10  9:13 ` Olaf Hering [this message]
2011-06-10  9:13 ` [PATCH 22 of 22] xenpaging: remove private mem_event.h Olaf Hering

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=39e5460d899872c96546.1307697190@probook.site \
    --to=olaf@aepfle.de \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.