On Thu 29-10-15 16:17:13, mho...@kernel.org wrote: [...] > @@ -3135,13 +3145,56 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int > order, > if (gfp_mask & __GFP_NORETRY) > goto noretry; > > - /* Keep reclaiming pages as long as there is reasonable progress */ > + /* > + * Do not retry high order allocations unless they are __GFP_REPEAT > + * and even then do not retry endlessly. > + */ > pages_reclaimed += did_some_progress; > - if ((did_some_progress && order <= PAGE_ALLOC_COSTLY_ORDER) || > - ((gfp_mask & __GFP_REPEAT) && pages_reclaimed < (1 << order))) { > - /* Wait for some write requests to complete then retry */ > - wait_iff_congested(ac->preferred_zone, BLK_RW_ASYNC, HZ/50); > - goto retry; > + if (order > PAGE_ALLOC_COSTLY_ORDER) { > + if (!(gfp_mask & __GFP_REPEAT) || pages_reclaimed >= (1<<order)) > + goto noretry;
This is not correct because we could fail __GFP_NOFAIL allocation. It should do if (!(gfp_mask & __GFP_NOFAIL) && (!(gfp_mask & __GFP_REPEAT) || pages_reclaimed >= (1<<order))) goto noretry; It looks rather ugly but it will get much better with patch3 which reorganizes the code a bit > + > + if (did_some_progress) > + goto retry; > + } -- Michal Hocko SUSE Labs -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/