All of lore.kernel.org
 help / color / mirror / Atom feed
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [PATCH 12 of 12] xenpaging: implement stopping of pager by sending SIGTERM/SIGINT
Date: Tue, 07 Jun 2011 11:53:14 +0200	[thread overview]
Message-ID: <168eef309cc99a5bebed.1307440394@probook.site> (raw)
In-Reply-To: <patchbomb.1307440382@probook.site>

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1307437222 -7200
# Node ID 168eef309cc99a5bebed230a54f337b6692c112d
# Parent  9484d35ec6e802aa3727cb6332e649b41e80a615
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 9484d35ec6e8 -r 168eef309cc9 tools/xenpaging/Makefile
--- a/tools/xenpaging/Makefile	Tue Jun 07 11:00:21 2011 +0200
+++ b/tools/xenpaging/Makefile	Tue Jun 07 11:00:22 2011 +0200
@@ -9,6 +9,7 @@ POLICY    = default
 SRC      :=
 SRCS     += file_ops.c xc.c xenpaging.c policy_$(POLICY).c
 SRCS     += watch.c
+SRCS     += pagein.c
 
 CFLAGS   += -Werror
 CFLAGS   += -Wno-unused
diff -r 9484d35ec6e8 -r 168eef309cc9 tools/xenpaging/pagein.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/xenpaging/pagein.c	Tue Jun 07 11:00:22 2011 +0200
@@ -0,0 +1,68 @@
+/* Trigger a page-in in a separate thread-of-execution to avoid deadlock */
+#include <pthread.h>
+#include "xc.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 9484d35ec6e8 -r 168eef309cc9 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c	Tue Jun 07 11:00:21 2011 +0200
+++ b/tools/xenpaging/xenpaging.c	Tue Jun 07 11:00:22 2011 +0200
@@ -585,6 +585,9 @@ int main(int argc, char *argv[])
     /* watch for shutdown of domain_id */
     create_watch_thread(paging->mem_event.domain_id, set_interrupted_quit);
 
+    /* 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++ )
     {
@@ -600,7 +603,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 = xc_wait_for_event_or_timeout(xch, paging->mem_event.xce_handle, 100);
@@ -663,8 +666,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
             {
@@ -691,6 +698,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 9484d35ec6e8 -r 168eef309cc9 tools/xenpaging/xenpaging.h
--- a/tools/xenpaging/xenpaging.h	Tue Jun 07 11:00:21 2011 +0200
+++ b/tools/xenpaging/xenpaging.h	Tue Jun 07 11:00:22 2011 +0200
@@ -57,6 +57,9 @@ typedef struct xenpaging_victim {
 
 extern void create_watch_thread(domid_t domain_id, void (*fn)(void));
 
+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-07  9:53 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-07  9:53 [PATCH 00 of 12] xenpaging fixes for xen-unstable Olaf Hering
2011-06-07  9:53 ` [PATCH 01 of 12] xenpaging: correct dropping of pages to avoid full ring buffer Olaf Hering
2011-06-07  9:53 ` [PATCH 02 of 12] xenpaging: do not bounce p2mt to xenpaging Olaf Hering
2011-06-07  9:53 ` [PATCH 03 of 12] xenpaging: remove srand call Olaf Hering
2011-06-07  9:53 ` [PATCH 04 of 12] xenpaging: remove return values from functions that can not fail Olaf Hering
2011-06-07  9:53 ` [PATCH 05 of 12] xenpaging: catch xc_mem_paging_resume errors Olaf Hering
2011-06-07  9:53 ` [PATCH 06 of 12] xenpaging: remove local domain_id variable Olaf Hering
2011-06-07  9:53 ` [PATCH 07 of 12] xenpaging: move num_pages into xenpaging struct Olaf Hering
2011-06-07  9:53 ` [PATCH 08 of 12] xenpaging: start paging in the middle of gfn range Olaf Hering
2011-06-07  9:53 ` [PATCH 09 of 12] xenpaging: pass integer to xenpaging_populate_page Olaf Hering
2011-06-07  9:53 ` [PATCH 10 of 12] xenpaging: add helper function for unlinking pagefile Olaf Hering
2011-06-07  9:53 ` [PATCH 11 of 12] xenpaging: add watch thread to catch guest shutdown Olaf Hering
2011-06-07 10:23   ` Ian Campbell
2011-06-07 19:07     ` Olaf Hering
2011-06-07  9:53 ` Olaf Hering [this message]
2011-06-07 12:27 ` [PATCH 00 of 12] xenpaging fixes for xen-unstable Keir Fraser
2011-06-07 13:38   ` Olaf Hering
2011-06-08 16:01     ` Keir Fraser
2011-06-10  7:28     ` Keir Fraser
2011-06-10 11:27       ` Olaf Hering
2011-06-10 12:52         ` Keir Fraser

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=168eef309cc99a5bebed.1307440394@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.