Don't run shrinkers without GFP_KERNEL

This would correspond to GFP_RECLAIM in the kernel - but we don't
distinguish between different types of reclaim here.

This solves a deadlock in the btree node memory allocation path - we
allocate with the btree node cache lock held but without GFP_KERNEL set.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Kent Overstreet 2022-10-11 00:39:06 -04:00
parent 72add8822c
commit 81aef33957
2 changed files with 4 additions and 1 deletions

View File

@ -25,7 +25,7 @@ typedef unsigned short umode_t;
typedef unsigned gfp_t;
#define GFP_KERNEL 0
#define GFP_KERNEL 1
#define GFP_ATOMIC 0
#define GFP_NOFS 0
#define GFP_NOIO 0

View File

@ -88,6 +88,9 @@ void run_shrinkers(gfp_t gfp_mask, bool allocation_failed)
struct sysinfo info;
s64 want_shrink;
if (!(gfp_mask & GFP_KERNEL))
return;
/* Fast out if there are no shrinkers to run. */
if (list_empty(&shrinker_list))
return;