|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/2] xen: introduce a no lock version function of free_heap_pages
Function free_heap_pages() needs to get the heap_lock every time. This lock
may become a problem when there are many CPUs trying to free pages in parallel.
This patch introduces a no lock version function __free_heap_pages(), it can be
used to free a batch of pages after grabbing the heap_lock.
Signed-off-by: Bob Liu <bob.liu@xxxxxxxxxx>
---
xen/common/page_alloc.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
index 601319c..56826b4 100644
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -808,8 +808,8 @@ static int reserve_offlined_page(struct page_info *head)
return count;
}
-/* Free 2^@order set of pages. */
-static void free_heap_pages(
+/* No lock version, the caller must hold heap_lock */
+static void __free_heap_pages(
struct page_info *pg, unsigned int order)
{
unsigned long mask, mfn = page_to_mfn(pg);
@@ -819,8 +819,6 @@ static void free_heap_pages(
ASSERT(order <= MAX_ORDER);
ASSERT(node >= 0);
- spin_lock(&heap_lock);
-
for ( i = 0; i < (1 << order); i++ )
{
/*
@@ -894,7 +892,14 @@ static void free_heap_pages(
if ( tainted )
reserve_offlined_page(pg);
+}
+/* Free 2^@order set of pages. */
+static void free_heap_pages(
+ struct page_info *pg, unsigned int order)
+{
+ spin_lock(&heap_lock);
+ __free_heap_pages(pg, order);
spin_unlock(&heap_lock);
}
--
1.7.10.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |