Loading include/linux/writeback.h +1 −1 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ enum writeback_sync_modes { */ enum wb_reason { WB_REASON_BACKGROUND, WB_REASON_TRY_TO_FREE_PAGES, WB_REASON_VMSCAN, WB_REASON_SYNC, WB_REASON_PERIODIC, WB_REASON_LAPTOP_TIMER, Loading include/trace/events/writeback.h +1 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ #define WB_WORK_REASON \ EM( WB_REASON_BACKGROUND, "background") \ EM( WB_REASON_TRY_TO_FREE_PAGES, "try_to_free_pages") \ EM( WB_REASON_VMSCAN, "vmscan") \ EM( WB_REASON_SYNC, "sync") \ EM( WB_REASON_PERIODIC, "periodic") \ EM( WB_REASON_LAPTOP_TIMER, "laptop_timer") \ Loading mm/vmscan.c +13 −5 Original line number Diff line number Diff line Loading @@ -1899,12 +1899,20 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, /* * If dirty pages are scanned that are not queued for IO, it * implies that flushers are not keeping up. In this case, flag * the pgdat PGDAT_DIRTY and kswapd will start writing pages from * reclaim context. */ if (nr_unqueued_dirty == nr_taken) * implies that flushers are not doing their job. This can * happen when memory pressure pushes dirty pages to the end of * the LRU before the dirty limits are breached and the dirty * data has expired. It can also happen when the proportion of * dirty pages grows not through writes but through memory * pressure reclaiming all the clean cache. And in some cases, * the flushers simply cannot keep up with the allocation * rate. Nudge the flusher threads in case they are asleep, but * also allow kswapd to start writing pages during reclaim. */ if (nr_unqueued_dirty == nr_taken) { wakeup_flusher_threads(0, WB_REASON_VMSCAN); set_bit(PGDAT_DIRTY, &pgdat->flags); } /* * If kswapd scans pages marked marked for immediate Loading Loading @@ -2851,7 +2859,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist, writeback_threshold = sc->nr_to_reclaim + sc->nr_to_reclaim / 2; if (total_scanned > writeback_threshold) { wakeup_flusher_threads(laptop_mode ? 0 : total_scanned, WB_REASON_TRY_TO_FREE_PAGES); WB_REASON_VMSCAN); sc->may_writepage = 1; } } while (--sc->priority >= 0); Loading Loading
include/linux/writeback.h +1 −1 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ enum writeback_sync_modes { */ enum wb_reason { WB_REASON_BACKGROUND, WB_REASON_TRY_TO_FREE_PAGES, WB_REASON_VMSCAN, WB_REASON_SYNC, WB_REASON_PERIODIC, WB_REASON_LAPTOP_TIMER, Loading
include/trace/events/writeback.h +1 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ #define WB_WORK_REASON \ EM( WB_REASON_BACKGROUND, "background") \ EM( WB_REASON_TRY_TO_FREE_PAGES, "try_to_free_pages") \ EM( WB_REASON_VMSCAN, "vmscan") \ EM( WB_REASON_SYNC, "sync") \ EM( WB_REASON_PERIODIC, "periodic") \ EM( WB_REASON_LAPTOP_TIMER, "laptop_timer") \ Loading
mm/vmscan.c +13 −5 Original line number Diff line number Diff line Loading @@ -1899,12 +1899,20 @@ shrink_inactive_list(unsigned long nr_to_scan, struct lruvec *lruvec, /* * If dirty pages are scanned that are not queued for IO, it * implies that flushers are not keeping up. In this case, flag * the pgdat PGDAT_DIRTY and kswapd will start writing pages from * reclaim context. */ if (nr_unqueued_dirty == nr_taken) * implies that flushers are not doing their job. This can * happen when memory pressure pushes dirty pages to the end of * the LRU before the dirty limits are breached and the dirty * data has expired. It can also happen when the proportion of * dirty pages grows not through writes but through memory * pressure reclaiming all the clean cache. And in some cases, * the flushers simply cannot keep up with the allocation * rate. Nudge the flusher threads in case they are asleep, but * also allow kswapd to start writing pages during reclaim. */ if (nr_unqueued_dirty == nr_taken) { wakeup_flusher_threads(0, WB_REASON_VMSCAN); set_bit(PGDAT_DIRTY, &pgdat->flags); } /* * If kswapd scans pages marked marked for immediate Loading Loading @@ -2851,7 +2859,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist, writeback_threshold = sc->nr_to_reclaim + sc->nr_to_reclaim / 2; if (total_scanned > writeback_threshold) { wakeup_flusher_threads(laptop_mode ? 0 : total_scanned, WB_REASON_TRY_TO_FREE_PAGES); WB_REASON_VMSCAN); sc->may_writepage = 1; } } while (--sc->priority >= 0); Loading