diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 945559f..99c2561 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -319,6 +319,7 @@ void throttle_vm_writeout(void) static void background_writeout(unsigned long _min_pages) { long min_pages = _min_pages; + long last_wrote = -1; struct writeback_control wbc = { .bdi = NULL, .sync_mode = WB_SYNC_NONE, @@ -331,6 +332,7 @@ static void background_writeout(unsigned struct writeback_state wbs; long background_thresh; long dirty_thresh; + long wrote; get_dirty_limits(&wbs, &background_thresh, &dirty_thresh, NULL); if (wbs.nr_dirty + wbs.nr_unstable < background_thresh @@ -340,7 +342,11 @@ static void background_writeout(unsigned wbc.nr_to_write = MAX_WRITEBACK_PAGES; wbc.pages_skipped = 0; writeback_inodes(&wbc); - min_pages -= MAX_WRITEBACK_PAGES - wbc.nr_to_write; + wrote = MAX_WRITEBACK_PAGES - wbc.nr_to_write; + if (!last_wrote && !wrote) + break; + last_wrote = wrote; + min_pages -= wrote; if (wbc.nr_to_write > 0 || wbc.pages_skipped > 0) { /* Wrote less than expected */ blk_congestion_wait(WRITE, HZ/10);