aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xenpaging/pagein.c
diff options
context:
space:
mode:
authorOlaf Hering <olaf@aepfle.de>2011-09-13 10:25:32 +0100
committerOlaf Hering <olaf@aepfle.de>2011-09-13 10:25:32 +0100
commit5b6fdcc0d8817b6b9bd896014784cc89385ed0bb (patch)
treeb906afdfa0bcfd5411f66cf7a12b29a0573428c6 /tools/xenpaging/pagein.c
parentd7d24473958dcf740d2366cbc574cf671e390dcc (diff)
downloadxen-5b6fdcc0d8817b6b9bd896014784cc89385ed0bb.tar.gz
xen-5b6fdcc0d8817b6b9bd896014784cc89385ed0bb.tar.bz2
xen-5b6fdcc0d8817b6b9bd896014784cc89385ed0bb.zip
xenpaging: use batch of pages during final page-in
Map up to RING_SIZE pages in exit path to fill the ring instead of populating one page at a time. Signed-off-by: Olaf Hering <olaf@aepfle.de>
Diffstat (limited to 'tools/xenpaging/pagein.c')
-rw-r--r--tools/xenpaging/pagein.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/tools/xenpaging/pagein.c b/tools/xenpaging/pagein.c
index 93552c0bfa..e2d7840894 100644
--- a/tools/xenpaging/pagein.c
+++ b/tools/xenpaging/pagein.c
@@ -1,14 +1,16 @@
/* Trigger a page-in in a separate thread-of-execution to avoid deadlock */
#include <pthread.h>
-#include "xc_private.h"
+#include <xc_private.h>
+#include "xenpaging.h"
struct page_in_args {
domid_t dom;
+ unsigned long *pagein_queue;
xc_interface *xch;
};
static struct page_in_args page_in_args;
-static unsigned long page_in_gfn;
+static unsigned long page_in_request;
static unsigned int page_in_possible;
static pthread_t page_in_thread;
@@ -19,19 +21,28 @@ static void *page_in(void *arg)
{
struct page_in_args *pia = arg;
void *page;
- xen_pfn_t gfn;
+ int i, num;
+ xen_pfn_t gfns[XENPAGING_PAGEIN_QUEUE_SIZE];
while (1)
{
pthread_mutex_lock(&page_in_mutex);
- while (!page_in_gfn)
+ while (!page_in_request)
pthread_cond_wait(&page_in_cond, &page_in_mutex);
- gfn = page_in_gfn;
- page_in_gfn = 0;
+ num = 0;
+ for (i = 0; i < XENPAGING_PAGEIN_QUEUE_SIZE; i++)
+ {
+ if (!pia->pagein_queue[i])
+ continue;
+ gfns[num] = pia->pagein_queue[i];
+ pia->pagein_queue[i] = 0;
+ num++;
+ }
+ page_in_request = 0;
pthread_mutex_unlock(&page_in_mutex);
/* Ignore errors */
- page = xc_map_foreign_pages(pia->xch, pia->dom, PROT_READ, &gfn, 1);
+ page = xc_map_foreign_pages(pia->xch, pia->dom, PROT_READ, gfns, num);
if (page)
munmap(page, PAGE_SIZE);
}
@@ -39,21 +50,22 @@ static void *page_in(void *arg)
pthread_exit(NULL);
}
-void page_in_trigger(unsigned long gfn)
+void page_in_trigger(void)
{
if (!page_in_possible)
return;
pthread_mutex_lock(&page_in_mutex);
- page_in_gfn = gfn;
+ page_in_request = 1;
pthread_mutex_unlock(&page_in_mutex);
pthread_cond_signal(&page_in_cond);
}
-void create_page_in_thread(domid_t domain_id, xc_interface *xch)
+void create_page_in_thread(xenpaging_t *paging)
{
- page_in_args.dom = domain_id;
- page_in_args.xch = xch;
+ page_in_args.dom = paging->mem_event.domain_id;
+ page_in_args.pagein_queue = paging->pagein_queue;
+ page_in_args.xch = paging->xc_handle;
if (pthread_create(&page_in_thread, NULL, page_in, &page_in_args) == 0)
page_in_possible = 1;
}