* allocations are system rather than user orientated
                 */
                ac->zonelist = node_zonelist(numa_node_id(), gfp_mask);
-               do {
-                       page = get_page_from_freelist(gfp_mask, order,
-                                                     ALLOC_NO_WATERMARKS, ac);
-                       if (page)
-                               goto got_pg;
-
-                       if (gfp_mask & __GFP_NOFAIL)
-                               wait_iff_congested(ac->preferred_zone,
-                                                  BLK_RW_ASYNC, HZ/50);
-               } while (gfp_mask & __GFP_NOFAIL);
+               page = get_page_from_freelist(gfp_mask, order,
+                                               ALLOC_NO_WATERMARKS, ac);
+               if (page)
+                       goto got_pg;
        }
 
        /* Caller is not willing to reclaim, we can't balance anything */
        if (!can_direct_reclaim) {
                /*
-                * All existing users of the deprecated __GFP_NOFAIL are
-                * blockable, so warn of any new users that actually allow this
-                * type of allocation to fail.
+                * All existing users of the __GFP_NOFAIL are blockable, so warn
+                * of any new users that actually allow this type of allocation
+                * to fail.
                 */
                WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL);
                goto nopage;
        }
 
        /* Avoid recursion of direct reclaim */
-       if (current->flags & PF_MEMALLOC)
+       if (current->flags & PF_MEMALLOC) {
+               /*
+                * __GFP_NOFAIL request from this context is rather bizarre
+                * because we cannot reclaim anything and only can loop waiting
+                * for somebody to do a work for us.
+                */
+               if (WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL)) {
+                       cond_resched();
+                       goto retry;
+               }
                goto nopage;
+       }
 
        /* Avoid allocations with no watermarks from looping endlessly */
        if (test_thread_flag(TIF_MEMDIE) && !(gfp_mask & __GFP_NOFAIL))