nr_reclaimed += demote_folio_list(&demote_folios, pgdat);
        /* Folios that could not be demoted are still in @demote_folios */
        if (!list_empty(&demote_folios)) {
-               /* Folios which weren't demoted go back on @folio_list for retry: */
+               /* Folios which weren't demoted go back on @folio_list */
                list_splice_init(&demote_folios, folio_list);
-               do_demote_pass = false;
-               goto retry;
+
+               /*
+                * goto retry to reclaim the undemoted folios in folio_list if
+                * desired.
+                *
+                * Reclaiming directly from top tier nodes is not often desired
+                * due to it breaking the LRU ordering: in general memory
+                * should be reclaimed from lower tier nodes and demoted from
+                * top tier nodes.
+                *
+                * However, disabling reclaim from top tier nodes entirely
+                * would cause ooms in edge scenarios where lower tier memory
+                * is unreclaimable for whatever reason, eg memory being
+                * mlocked or too hot to reclaim. We can disable reclaim
+                * from top tier nodes in proactive reclaim though as that is
+                * not real memory pressure.
+                */
+               if (!sc->proactive) {
+                       do_demote_pass = false;
+                       goto retry;
+               }
        }
 
        pgactivate = stat->nr_activate[0] + stat->nr_activate[1];