Skip to content

Commit a458431

Browse files
bzolniertorvalds
authored andcommitted
mm: fix zone_watermark_ok_safe() accounting of isolated pages
Commit 702d1a6 ("memory-hotplug: fix kswapd looping forever problem") added an isolated pageblocks counter (nr_pageblock_isolate in struct zone) and used it to adjust free pages counter in zone_watermark_ok_safe() to prevent kswapd looping forever problem. Then later, commit 2139cbe ("cma: fix counting of isolated pages") fixed accounting of isolated pages in global free pages counter. It made the previous zone_watermark_ok_safe() fix unnecessary and potentially harmful (cause now isolated pages may be accounted twice making free pages counter incorrect). This patch removes the special isolated pageblocks counter altogether which fixes zone_watermark_ok_safe() free pages check. Reported-by: Tomasz Stanislawski <[email protected]> Signed-off-by: Bartlomiej Zolnierkiewicz <[email protected]> Signed-off-by: Kyungmin Park <[email protected]> Cc: Minchan Kim <[email protected]> Cc: KOSAKI Motohiro <[email protected]> Cc: Aaditya Kumar <[email protected]> Cc: KAMEZAWA Hiroyuki <[email protected]> Cc: Mel Gorman <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Marek Szyprowski <[email protected]> Cc: Michal Nazarewicz <[email protected]> Cc: Hugh Dickins <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 358e419 commit a458431

File tree

3 files changed

+2
-59
lines changed

3 files changed

+2
-59
lines changed

include/linux/mmzone.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -503,14 +503,6 @@ struct zone {
503503
* rarely used fields:
504504
*/
505505
const char *name;
506-
#ifdef CONFIG_MEMORY_ISOLATION
507-
/*
508-
* the number of MIGRATE_ISOLATE *pageblock*.
509-
* We need this for free page counting. Look at zone_watermark_ok_safe.
510-
* It's protected by zone->lock
511-
*/
512-
int nr_pageblock_isolate;
513-
#endif
514506
} ____cacheline_internodealigned_in_smp;
515507

516508
typedef enum {

mm/page_alloc.c

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,6 @@ EXPORT_SYMBOL(nr_online_nodes);
221221

222222
int page_group_by_mobility_disabled __read_mostly;
223223

224-
/*
225-
* NOTE:
226-
* Don't use set_pageblock_migratetype(page, MIGRATE_ISOLATE) directly.
227-
* Instead, use {un}set_pageblock_isolate.
228-
*/
229224
void set_pageblock_migratetype(struct page *page, int migratetype)
230225
{
231226

@@ -1655,20 +1650,6 @@ static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,
16551650
return true;
16561651
}
16571652

1658-
#ifdef CONFIG_MEMORY_ISOLATION
1659-
static inline unsigned long nr_zone_isolate_freepages(struct zone *zone)
1660-
{
1661-
if (unlikely(zone->nr_pageblock_isolate))
1662-
return zone->nr_pageblock_isolate * pageblock_nr_pages;
1663-
return 0;
1664-
}
1665-
#else
1666-
static inline unsigned long nr_zone_isolate_freepages(struct zone *zone)
1667-
{
1668-
return 0;
1669-
}
1670-
#endif
1671-
16721653
bool zone_watermark_ok(struct zone *z, int order, unsigned long mark,
16731654
int classzone_idx, int alloc_flags)
16741655
{
@@ -1684,14 +1665,6 @@ bool zone_watermark_ok_safe(struct zone *z, int order, unsigned long mark,
16841665
if (z->percpu_drift_mark && free_pages < z->percpu_drift_mark)
16851666
free_pages = zone_page_state_snapshot(z, NR_FREE_PAGES);
16861667

1687-
/*
1688-
* If the zone has MIGRATE_ISOLATE type free pages, we should consider
1689-
* it. nr_zone_isolate_freepages is never accurate so kswapd might not
1690-
* sleep although it could do so. But this is more desirable for memory
1691-
* hotplug than sleeping which can cause a livelock in the direct
1692-
* reclaim path.
1693-
*/
1694-
free_pages -= nr_zone_isolate_freepages(z);
16951668
return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags,
16961669
free_pages);
16971670
}

mm/page_isolation.c

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,6 @@
88
#include <linux/memory.h>
99
#include "internal.h"
1010

11-
/* called while holding zone->lock */
12-
static void set_pageblock_isolate(struct page *page)
13-
{
14-
if (get_pageblock_migratetype(page) == MIGRATE_ISOLATE)
15-
return;
16-
17-
set_pageblock_migratetype(page, MIGRATE_ISOLATE);
18-
page_zone(page)->nr_pageblock_isolate++;
19-
}
20-
21-
/* called while holding zone->lock */
22-
static void restore_pageblock_isolate(struct page *page, int migratetype)
23-
{
24-
struct zone *zone = page_zone(page);
25-
if (WARN_ON(get_pageblock_migratetype(page) != MIGRATE_ISOLATE))
26-
return;
27-
28-
BUG_ON(zone->nr_pageblock_isolate <= 0);
29-
set_pageblock_migratetype(page, migratetype);
30-
zone->nr_pageblock_isolate--;
31-
}
32-
3311
int set_migratetype_isolate(struct page *page, bool skip_hwpoisoned_pages)
3412
{
3513
struct zone *zone;
@@ -80,7 +58,7 @@ int set_migratetype_isolate(struct page *page, bool skip_hwpoisoned_pages)
8058
unsigned long nr_pages;
8159
int migratetype = get_pageblock_migratetype(page);
8260

83-
set_pageblock_isolate(page);
61+
set_pageblock_migratetype(page, MIGRATE_ISOLATE);
8462
nr_pages = move_freepages_block(zone, page, MIGRATE_ISOLATE);
8563

8664
__mod_zone_freepage_state(zone, -nr_pages, migratetype);
@@ -103,7 +81,7 @@ void unset_migratetype_isolate(struct page *page, unsigned migratetype)
10381
goto out;
10482
nr_pages = move_freepages_block(zone, page, migratetype);
10583
__mod_zone_freepage_state(zone, nr_pages, migratetype);
106-
restore_pageblock_isolate(page, migratetype);
84+
set_pageblock_migratetype(page, migratetype);
10785
out:
10886
spin_unlock_irqrestore(&zone->lock, flags);
10987
}

0 commit comments

Comments
 (0)