WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] xenpaging: implement stopping of pager by

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] xenpaging: implement stopping of pager by sending SIGTERM/SIGINT
From: Xen patchbot-unstable <patchbot@xxxxxxx>
Date: Tue, 28 Jun 2011 07:44:29 +0100
Delivery-date: Mon, 27 Jun 2011 23:50:30 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Olaf Hering <olaf@xxxxxxxxx>
# Date 1307695648 -7200
# Node ID c49e22648d0ec4723bdbf31e4fce3ca47b21adde
# Parent  389c8bf3168851df6a33e4270d67237455f1bd43
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@xxxxxxxxx>
Committed-by: Ian Jackson <ian.jackson.citrix.com>
---


diff -r 389c8bf31688 -r c49e22648d0e 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 @@
 
 SRC      :=
 SRCS     += file_ops.c xenpaging.c policy_$(POLICY).c
+SRCS     += pagein.c
 
 CFLAGS   += -Werror
 CFLAGS   += -Wno-unused
diff -r 389c8bf31688 -r c49e22648d0e 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 389c8bf31688 -r c49e22648d0e 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 @@
     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 @@
     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 @@
                     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 @@
                 }
             }
         }
+
+        /* 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 389c8bf31688 -r c49e22648d0e 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 @@
 } 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__
 
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] xenpaging: implement stopping of pager by sending SIGTERM/SIGINT, Xen patchbot-unstable <=