From: Ben Guthro <bguthro@virtualiron.com>
To: xen-devel <xen-devel@lists.xensource.com>
Cc: Robert Phillips <rphillips@virtualiron.com>
Subject: [PATCH] scrub pages on guest termination
Date: Fri, 23 May 2008 11:00:18 -0400 [thread overview]
Message-ID: <4836DC02.3050407@virtualiron.com> (raw)
[-- Attachment #1.1: Type: text/plain, Size: 1107 bytes --]
This patch solves the following problem. When a large VS terminates, the node locks
up. The node locks up because the page_scrub_kick routine sends a softirq to
all processors instructing them to run the page scrub code. There they interfere
with each other as they serialize behind the page_scrub_lock.
The patch does two things:
(1) In page_scrub_kick, only a single cpu is interrupted. Some cpu other than
the calling cpu is chosen (if available) because we assume the calling cpu
has other higher priority work to do.
(2) In page_scrub_softirq, if more than one cpu is online, the first cpu
to start scrubbing designates itself as the primary_scrubber. As such
it is dedicated to scrubbing pages until the list is empty. Other cpus
might call page_scrub_softirq but they spend only 1 msec scrubbing before
returning to check for other higher priority work. But, with multiple cpus
online, the node can afford to have one cpu dedicated to scrubbing when
that work needs to be done.
Signed-off-by: Robert Phillips <rphillips@virtualiron.com>
Signed-off-by: Ben Guthro <bguthro@virtualiron.com>
[-- Attachment #1.2: Type: text/html, Size: 1466 bytes --]
[-- Attachment #2: xen-page-scrub.patch --]
[-- Type: text/plain, Size: 2859 bytes --]
diff -r 29dc52031954 xen/common/page_alloc.c
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -984,16 +984,23 @@
void *p;
int i;
s_time_t start = NOW();
+ static int primary_scrubber = -1;
- /* Aim to do 1ms of work every 10ms. */
+ /* Unless SMP, aim to do 1ms of work every 10ms. */
do {
spin_lock(&page_scrub_lock);
if ( unlikely((ent = page_scrub_list.next) == &page_scrub_list) )
{
+ if (primary_scrubber == smp_processor_id())
+ primary_scrubber = -1;
spin_unlock(&page_scrub_lock);
return;
}
+
+ /* If SMP, dedicate a cpu to scrubbing til the job is done */
+ if (primary_scrubber == -1 && num_online_cpus() > 1)
+ primary_scrubber = smp_processor_id();
/* Peel up to 16 pages from the list. */
for ( i = 0; i < 16; i++ )
@@ -1020,7 +1027,7 @@
unmap_domain_page(p);
free_heap_pages(pfn_dom_zone_type(page_to_mfn(pg)), pg, 0);
}
- } while ( (NOW() - start) < MILLISECS(1) );
+ } while ( primary_scrubber == smp_processor_id() || (NOW() - start) < MILLISECS(1) );
set_timer(&this_cpu(page_scrub_timer), NOW() + MILLISECS(10));
}
diff -r 29dc52031954 xen/include/xen/mm.h
--- a/xen/include/xen/mm.h
+++ b/xen/include/xen/mm.h
@@ -90,10 +90,21 @@
if ( !list_empty(&page_scrub_list) ) \
raise_softirq(PAGE_SCRUB_SOFTIRQ); \
} while ( 0 )
-#define page_scrub_kick() \
- do { \
- if ( !list_empty(&page_scrub_list) ) \
- cpumask_raise_softirq(cpu_online_map, PAGE_SCRUB_SOFTIRQ); \
+
+#define page_scrub_kick() \
+ do { \
+ if ( !list_empty(&page_scrub_list) ) { \
+ int cpu; \
+ /* Try to use some other cpu. */ \
+ for_each_online_cpu(cpu) { \
+ if (cpu != smp_processor_id()) { \
+ cpu_raise_softirq(cpu, PAGE_SCRUB_SOFTIRQ); \
+ break; \
+ } \
+ } \
+ if (cpu >= NR_CPUS) \
+ raise_softirq(PAGE_SCRUB_SOFTIRQ); \
+ } \
} while ( 0 )
unsigned long avail_scrub_pages(void);
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
next reply other threads:[~2008-05-23 15:00 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-23 15:00 Ben Guthro [this message]
2008-05-23 16:04 ` [PATCH] scrub pages on guest termination Keir Fraser
2008-05-23 17:01 ` Ben Guthro
2008-05-23 17:19 ` 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=4836DC02.3050407@virtualiron.com \
--to=bguthro@virtualiron.com \
--cc=rphillips@virtualiron.com \
--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.