Skip to content

Commit caf4919

Browse files
committed
Revert "revert "Revert "mm: remove __GFP_NO_KSWAPD""" and associated damage
This reverts commits a509153 and d7c3b93. This is a revert of a revert of a revert. In addition, it reverts the even older i915 change to stop using the __GFP_NO_KSWAPD flag due to the original commits in linux-next. It turns out that the original patch really was bogus, and that the original revert was the correct thing to do after all. We thought we had fixed the problem, and then reverted the revert, but the problem really is fundamental: waking up kswapd simply isn't the right thing to do, and direct reclaim sometimes simply _is_ the right thing to do. When certain allocations fail, we simply should try some direct reclaim, and if that fails, fail the allocation. That's the right thing to do for THP allocations, which can easily fail, and the GPU allocations want to do that too. So starting kswapd is sometimes simply wrong, and removing the flag that said "don't start kswapd" was a mistake. Let's hope we never revisit this mistake again - and certainly not this many times ;) Acked-by: Mel Gorman <mgorman@suse.de> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Rik van Riel <riel@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 31f8d42 commit caf4919

File tree

5 files changed

+20
-13
lines changed

5 files changed

+20
-13
lines changed

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1796,7 +1796,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
17961796
*/
17971797
mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
17981798
gfp = mapping_gfp_mask(mapping);
1799-
gfp |= __GFP_NORETRY | __GFP_NOWARN;
1799+
gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD;
18001800
gfp &= ~(__GFP_IO | __GFP_WAIT);
18011801
for_each_sg(st->sgl, sg, page_count, i) {
18021802
page = shmem_read_mapping_page_gfp(mapping, i, gfp);
@@ -1809,15 +1809,15 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
18091809
* our own buffer, now let the real VM do its job and
18101810
* go down in flames if truly OOM.
18111811
*/
1812-
gfp &= ~(__GFP_NORETRY | __GFP_NOWARN);
1812+
gfp &= ~(__GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD);
18131813
gfp |= __GFP_IO | __GFP_WAIT;
18141814

18151815
i915_gem_shrink_all(dev_priv);
18161816
page = shmem_read_mapping_page_gfp(mapping, i, gfp);
18171817
if (IS_ERR(page))
18181818
goto err_pages;
18191819

1820-
gfp |= __GFP_NORETRY | __GFP_NOWARN;
1820+
gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD;
18211821
gfp &= ~(__GFP_IO | __GFP_WAIT);
18221822
}
18231823

drivers/mtd/mtdcore.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,8 @@ EXPORT_SYMBOL_GPL(mtd_writev);
10771077
* until the request succeeds or until the allocation size falls below
10781078
* the system page size. This attempts to make sure it does not adversely
10791079
* impact system performance, so when allocating more than one page, we
1080-
* ask the memory allocator to avoid re-trying.
1080+
* ask the memory allocator to avoid re-trying, swapping, writing back
1081+
* or performing I/O.
10811082
*
10821083
* Note, this function also makes sure that the allocated buffer is aligned to
10831084
* the MTD device's min. I/O unit, i.e. the "mtd->writesize" value.
@@ -1091,7 +1092,8 @@ EXPORT_SYMBOL_GPL(mtd_writev);
10911092
*/
10921093
void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size)
10931094
{
1094-
gfp_t flags = __GFP_NOWARN | __GFP_WAIT | __GFP_NORETRY;
1095+
gfp_t flags = __GFP_NOWARN | __GFP_WAIT |
1096+
__GFP_NORETRY | __GFP_NO_KSWAPD;
10951097
size_t min_alloc = max_t(size_t, mtd->writesize, PAGE_SIZE);
10961098
void *kbuf;
10971099

include/linux/gfp.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ struct vm_area_struct;
3030
#define ___GFP_HARDWALL 0x20000u
3131
#define ___GFP_THISNODE 0x40000u
3232
#define ___GFP_RECLAIMABLE 0x80000u
33-
#define ___GFP_NOTRACK 0x100000u
34-
#define ___GFP_OTHER_NODE 0x200000u
35-
#define ___GFP_WRITE 0x400000u
33+
#define ___GFP_NOTRACK 0x200000u
34+
#define ___GFP_NO_KSWAPD 0x400000u
35+
#define ___GFP_OTHER_NODE 0x800000u
36+
#define ___GFP_WRITE 0x1000000u
3637

3738
/*
3839
* GFP bitmasks..
@@ -85,6 +86,7 @@ struct vm_area_struct;
8586
#define __GFP_RECLAIMABLE ((__force gfp_t)___GFP_RECLAIMABLE) /* Page is reclaimable */
8687
#define __GFP_NOTRACK ((__force gfp_t)___GFP_NOTRACK) /* Don't track with kmemcheck */
8788

89+
#define __GFP_NO_KSWAPD ((__force gfp_t)___GFP_NO_KSWAPD)
8890
#define __GFP_OTHER_NODE ((__force gfp_t)___GFP_OTHER_NODE) /* On behalf of other node */
8991
#define __GFP_WRITE ((__force gfp_t)___GFP_WRITE) /* Allocator intends to dirty page */
9092

@@ -94,7 +96,7 @@ struct vm_area_struct;
9496
*/
9597
#define __GFP_NOTRACK_FALSE_POSITIVE (__GFP_NOTRACK)
9698

97-
#define __GFP_BITS_SHIFT 23 /* Room for N __GFP_FOO bits */
99+
#define __GFP_BITS_SHIFT 25 /* Room for N __GFP_FOO bits */
98100
#define __GFP_BITS_MASK ((__force gfp_t)((1 << __GFP_BITS_SHIFT) - 1))
99101

100102
/* This equals 0, but use constants in case they ever change */
@@ -114,7 +116,8 @@ struct vm_area_struct;
114116
__GFP_MOVABLE)
115117
#define GFP_IOFS (__GFP_IO | __GFP_FS)
116118
#define GFP_TRANSHUGE (GFP_HIGHUSER_MOVABLE | __GFP_COMP | \
117-
__GFP_NOMEMALLOC | __GFP_NORETRY | __GFP_NOWARN)
119+
__GFP_NOMEMALLOC | __GFP_NORETRY | __GFP_NOWARN | \
120+
__GFP_NO_KSWAPD)
118121

119122
#ifdef CONFIG_NUMA
120123
#define GFP_THISNODE (__GFP_THISNODE | __GFP_NOWARN | __GFP_NORETRY)

include/trace/events/gfpflags.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
{(unsigned long)__GFP_RECLAIMABLE, "GFP_RECLAIMABLE"}, \
3737
{(unsigned long)__GFP_MOVABLE, "GFP_MOVABLE"}, \
3838
{(unsigned long)__GFP_NOTRACK, "GFP_NOTRACK"}, \
39+
{(unsigned long)__GFP_NO_KSWAPD, "GFP_NO_KSWAPD"}, \
3940
{(unsigned long)__GFP_OTHER_NODE, "GFP_OTHER_NODE"} \
4041
) : "GFP_NOWAIT"
4142

mm/page_alloc.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2416,8 +2416,9 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
24162416
goto nopage;
24172417

24182418
restart:
2419-
wake_all_kswapd(order, zonelist, high_zoneidx,
2420-
zone_idx(preferred_zone));
2419+
if (!(gfp_mask & __GFP_NO_KSWAPD))
2420+
wake_all_kswapd(order, zonelist, high_zoneidx,
2421+
zone_idx(preferred_zone));
24212422

24222423
/*
24232424
* OK, we're below the kswapd watermark and have kicked background
@@ -2494,7 +2495,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
24942495
* system then fail the allocation instead of entering direct reclaim.
24952496
*/
24962497
if ((deferred_compaction || contended_compaction) &&
2497-
(gfp_mask & (__GFP_MOVABLE|__GFP_REPEAT)) == __GFP_MOVABLE)
2498+
(gfp_mask & __GFP_NO_KSWAPD))
24982499
goto nopage;
24992500

25002501
/* Try direct reclaim and then allocating */

0 commit comments

Comments
 (0)