diff options
Diffstat (limited to 'mm/page-writeback.c')
| -rw-r--r-- | mm/page-writeback.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c index e3bccac1f025..b840afa89761 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c | |||
| @@ -415,14 +415,8 @@ void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty) | |||
| 415 | 415 | ||
| 416 | if (vm_dirty_bytes) | 416 | if (vm_dirty_bytes) |
| 417 | dirty = DIV_ROUND_UP(vm_dirty_bytes, PAGE_SIZE); | 417 | dirty = DIV_ROUND_UP(vm_dirty_bytes, PAGE_SIZE); |
| 418 | else { | 418 | else |
| 419 | int dirty_ratio; | 419 | dirty = (vm_dirty_ratio * available_memory) / 100; |
| 420 | |||
| 421 | dirty_ratio = vm_dirty_ratio; | ||
| 422 | if (dirty_ratio < 5) | ||
| 423 | dirty_ratio = 5; | ||
| 424 | dirty = (dirty_ratio * available_memory) / 100; | ||
| 425 | } | ||
| 426 | 420 | ||
| 427 | if (dirty_background_bytes) | 421 | if (dirty_background_bytes) |
| 428 | background = DIV_ROUND_UP(dirty_background_bytes, PAGE_SIZE); | 422 | background = DIV_ROUND_UP(dirty_background_bytes, PAGE_SIZE); |
| @@ -510,7 +504,7 @@ static void balance_dirty_pages(struct address_space *mapping, | |||
| 510 | * catch-up. This avoids (excessively) small writeouts | 504 | * catch-up. This avoids (excessively) small writeouts |
| 511 | * when the bdi limits are ramping up. | 505 | * when the bdi limits are ramping up. |
| 512 | */ | 506 | */ |
| 513 | if (nr_reclaimable + nr_writeback < | 507 | if (nr_reclaimable + nr_writeback <= |
| 514 | (background_thresh + dirty_thresh) / 2) | 508 | (background_thresh + dirty_thresh) / 2) |
| 515 | break; | 509 | break; |
| 516 | 510 | ||
| @@ -542,8 +536,8 @@ static void balance_dirty_pages(struct address_space *mapping, | |||
| 542 | * the last resort safeguard. | 536 | * the last resort safeguard. |
| 543 | */ | 537 | */ |
| 544 | dirty_exceeded = | 538 | dirty_exceeded = |
| 545 | (bdi_nr_reclaimable + bdi_nr_writeback >= bdi_thresh) | 539 | (bdi_nr_reclaimable + bdi_nr_writeback > bdi_thresh) |
| 546 | || (nr_reclaimable + nr_writeback >= dirty_thresh); | 540 | || (nr_reclaimable + nr_writeback > dirty_thresh); |
| 547 | 541 | ||
| 548 | if (!dirty_exceeded) | 542 | if (!dirty_exceeded) |
| 549 | break; | 543 | break; |
| @@ -1121,6 +1115,7 @@ void account_page_dirtied(struct page *page, struct address_space *mapping) | |||
| 1121 | { | 1115 | { |
| 1122 | if (mapping_cap_account_dirty(mapping)) { | 1116 | if (mapping_cap_account_dirty(mapping)) { |
| 1123 | __inc_zone_page_state(page, NR_FILE_DIRTY); | 1117 | __inc_zone_page_state(page, NR_FILE_DIRTY); |
| 1118 | __inc_zone_page_state(page, NR_DIRTIED); | ||
| 1124 | __inc_bdi_stat(mapping->backing_dev_info, BDI_RECLAIMABLE); | 1119 | __inc_bdi_stat(mapping->backing_dev_info, BDI_RECLAIMABLE); |
| 1125 | task_dirty_inc(current); | 1120 | task_dirty_inc(current); |
| 1126 | task_io_account_write(PAGE_CACHE_SIZE); | 1121 | task_io_account_write(PAGE_CACHE_SIZE); |
| @@ -1129,6 +1124,18 @@ void account_page_dirtied(struct page *page, struct address_space *mapping) | |||
| 1129 | EXPORT_SYMBOL(account_page_dirtied); | 1124 | EXPORT_SYMBOL(account_page_dirtied); |
| 1130 | 1125 | ||
| 1131 | /* | 1126 | /* |
| 1127 | * Helper function for set_page_writeback family. | ||
| 1128 | * NOTE: Unlike account_page_dirtied this does not rely on being atomic | ||
| 1129 | * wrt interrupts. | ||
| 1130 | */ | ||
| 1131 | void account_page_writeback(struct page *page) | ||
| 1132 | { | ||
| 1133 | inc_zone_page_state(page, NR_WRITEBACK); | ||
| 1134 | inc_zone_page_state(page, NR_WRITTEN); | ||
| 1135 | } | ||
| 1136 | EXPORT_SYMBOL(account_page_writeback); | ||
| 1137 | |||
| 1138 | /* | ||
| 1132 | * For address_spaces which do not use buffers. Just tag the page as dirty in | 1139 | * For address_spaces which do not use buffers. Just tag the page as dirty in |
| 1133 | * its radix tree. | 1140 | * its radix tree. |
| 1134 | * | 1141 | * |
| @@ -1366,7 +1373,7 @@ int test_set_page_writeback(struct page *page) | |||
| 1366 | ret = TestSetPageWriteback(page); | 1373 | ret = TestSetPageWriteback(page); |
| 1367 | } | 1374 | } |
| 1368 | if (!ret) | 1375 | if (!ret) |
| 1369 | inc_zone_page_state(page, NR_WRITEBACK); | 1376 | account_page_writeback(page); |
| 1370 | return ret; | 1377 | return ret; |
| 1371 | 1378 | ||
| 1372 | } | 1379 | } |
