From 81aef3395759058186d847421353c50e1e79ba06 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Tue, 11 Oct 2022 00:39:06 -0400 Subject: [PATCH] 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 --- include/linux/types.h | 2 +- linux/shrinker.c | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/include/linux/types.h b/include/linux/types.h index f0efcd2..7144f17 100644 --- a/include/linux/types.h +++ b/include/linux/types.h @@ -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 diff --git a/linux/shrinker.c b/linux/shrinker.c index 25cdfbb..0f73620 100644 --- a/linux/shrinker.c +++ b/linux/shrinker.c @@ -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; -- 2.39.2