On 10/8/21 15:53, Mel Gorman wrote: > do_writepages throttles on congestion if the writepages() fails due to a > lack of memory but congestion_wait() is partially broken as the congestion > state is not updated for all BDIs. > > This patch stalls waiting for a number of pages to complete writeback > that located on the local node. The main weakness is that there is no > correlation between the location of the inode's pages and locality but > that is still better than congestion_wait. > > Signed-off-by: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> Acked-by: Vlastimil Babka <vbabka@xxxxxxx> > --- > mm/page-writeback.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/mm/page-writeback.c b/mm/page-writeback.c > index 4812a17b288c..f34f54fcd5b4 100644 > --- a/mm/page-writeback.c > +++ b/mm/page-writeback.c > @@ -2366,8 +2366,15 @@ int do_writepages(struct address_space *mapping, struct writeback_control *wbc) > ret = generic_writepages(mapping, wbc); > if ((ret != -ENOMEM) || (wbc->sync_mode != WB_SYNC_ALL)) > break; > - cond_resched(); > - congestion_wait(BLK_RW_ASYNC, HZ/50); > + > + /* > + * Lacking an allocation context or the locality or writeback > + * state of any of the inode's pages, throttle based on > + * writeback activity on the local node. It's as good a > + * guess as any. > + */ > + reclaim_throttle(NODE_DATA(numa_node_id()), > + VMSCAN_THROTTLE_WRITEBACK, HZ/50); > } > /* > * Usually few pages are written by now from those we've just submitted >