|
@@ -1594,7 +1594,7 @@ static int __ref __offline_pages(unsigned long start_pfn,
|
|
|
{
|
|
|
unsigned long pfn, nr_pages, expire;
|
|
|
long offlined_pages;
|
|
|
- int ret, drain, retry_max, node;
|
|
|
+ int ret, node;
|
|
|
unsigned long flags;
|
|
|
unsigned long valid_start, valid_end;
|
|
|
struct zone *zone;
|
|
@@ -1631,43 +1631,25 @@ static int __ref __offline_pages(unsigned long start_pfn,
|
|
|
|
|
|
pfn = start_pfn;
|
|
|
expire = jiffies + timeout;
|
|
|
- drain = 0;
|
|
|
- retry_max = 5;
|
|
|
repeat:
|
|
|
/* start memory hot removal */
|
|
|
- ret = -EAGAIN;
|
|
|
+ ret = -EBUSY;
|
|
|
if (time_after(jiffies, expire))
|
|
|
goto failed_removal;
|
|
|
ret = -EINTR;
|
|
|
if (signal_pending(current))
|
|
|
goto failed_removal;
|
|
|
- ret = 0;
|
|
|
- if (drain) {
|
|
|
- lru_add_drain_all_cpuslocked();
|
|
|
- cond_resched();
|
|
|
- drain_all_pages(zone);
|
|
|
- }
|
|
|
+
|
|
|
+ cond_resched();
|
|
|
+ lru_add_drain_all_cpuslocked();
|
|
|
+ drain_all_pages(zone);
|
|
|
|
|
|
pfn = scan_movable_pages(start_pfn, end_pfn);
|
|
|
if (pfn) { /* We have movable pages */
|
|
|
ret = do_migrate_range(pfn, end_pfn);
|
|
|
- if (!ret) {
|
|
|
- drain = 1;
|
|
|
- goto repeat;
|
|
|
- } else {
|
|
|
- if (ret < 0)
|
|
|
- if (--retry_max == 0)
|
|
|
- goto failed_removal;
|
|
|
- yield();
|
|
|
- drain = 1;
|
|
|
- goto repeat;
|
|
|
- }
|
|
|
+ goto repeat;
|
|
|
}
|
|
|
- /* drain all zone's lru pagevec, this is asynchronous... */
|
|
|
- lru_add_drain_all_cpuslocked();
|
|
|
- yield();
|
|
|
- /* drain pcp pages, this is synchronous. */
|
|
|
- drain_all_pages(zone);
|
|
|
+
|
|
|
/*
|
|
|
* dissolve free hugepages in the memory block before doing offlining
|
|
|
* actually in order to make hugetlbfs's object counting consistent.
|
|
@@ -1677,10 +1659,8 @@ repeat:
|
|
|
goto failed_removal;
|
|
|
/* check again */
|
|
|
offlined_pages = check_pages_isolated(start_pfn, end_pfn);
|
|
|
- if (offlined_pages < 0) {
|
|
|
- ret = -EBUSY;
|
|
|
- goto failed_removal;
|
|
|
- }
|
|
|
+ if (offlined_pages < 0)
|
|
|
+ goto repeat;
|
|
|
pr_info("Offlined Pages %ld\n", offlined_pages);
|
|
|
/* Ok, all of our target is isolated.
|
|
|
We cannot do rollback at this point. */
|