diff --git a/mm/page_alloc.c b/mm/page_alloc.c index cf9c69d631f3d8e541b944a72aca06bc52e6896a..34a4673b909e7c36644065afb4811e341ae440ad 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3709,11 +3709,15 @@ static inline bool zone_watermark_fast(struct zone *z, unsigned int order, * need to be calculated. */ if (!order) { - long fast_free; + long usable_free; + long reserved; - fast_free = free_pages; - fast_free -= __zone_watermark_unusable_free(z, 0, alloc_flags); - if (fast_free > mark + z->lowmem_reserve[highest_zoneidx]) + usable_free = free_pages; + reserved = __zone_watermark_unusable_free(z, 0, alloc_flags); + + /* reserved may over estimate high-atomic reserves. */ + usable_free -= min(usable_free, reserved); + if (usable_free > mark + z->lowmem_reserve[highest_zoneidx]) return true; }