--- a/include/linux/sched/mm.h +++ b/include/linux/sched/mm.h @@ -268,8 +268,11 @@ static inline void memalloc_retry_wait(gfp_t gfp_flags) */ static inline void might_alloc(gfp_t gfp_mask) { + unsigned long save_flags; + local_irq_save(save_flags); fs_reclaim_acquire(gfp_mask); fs_reclaim_release(gfp_mask); + local_irq_restore(save_flags); might_sleep_if(gfpflags_allow_blocking(gfp_mask)); } --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -4671,7 +4671,10 @@ static bool __need_reclaim(gfp_t gfp_mask) void __fs_reclaim_acquire(unsigned long ip) { + unsigned long save_flags; + local_irq_save(save_flags); lock_acquire_exclusive(&__fs_reclaim_map, 0, 0, NULL, ip); + local_irq_restore(save_flags); } void __fs_reclaim_release(unsigned long ip)