X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=mm%2Fpage_isolation.c;h=5e0ffd967452083c8209dfa0a1334416ded99f68;hb=e9995ef978a7d5296fe04a9a2c5ca6e66d8bb4e5;hp=c69f84fe038d8b725b8639aae0fd88151206b515;hpb=0ed97ee470c36e05bcaad36c4fb4c501f383ce63;p=safe%2Fjmp%2Flinux-2.6 diff --git a/mm/page_isolation.c b/mm/page_isolation.c index c69f84f..5e0ffd9 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -114,8 +114,10 @@ __test_page_isolated_in_pageblock(unsigned long pfn, unsigned long end_pfn) int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn) { - unsigned long pfn; + unsigned long pfn, flags; struct page *page; + struct zone *zone; + int ret; pfn = start_pfn; /* @@ -128,10 +130,13 @@ int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn) if (page && get_pageblock_migratetype(page) != MIGRATE_ISOLATE) break; } - if (pfn < end_pfn) + page = __first_valid_page(start_pfn, end_pfn - start_pfn); + if ((pfn < end_pfn) || !page) return -EBUSY; /* Check all pages are free or Marked as ISOLATED */ - if (__test_page_isolated_in_pageblock(start_pfn, end_pfn)) - return 0; - return -EBUSY; + zone = page_zone(page); + spin_lock_irqsave(&zone->lock, flags); + ret = __test_page_isolated_in_pageblock(start_pfn, end_pfn); + spin_unlock_irqrestore(&zone->lock, flags); + return ret ? 0 : -EBUSY; }