[Devel] [PATCH v3 rh7 2/2] mm/page-writeback: Introduce per-CT dirty memory limit.

Andrey Ryabinin aryabinin at virtuozzo.com
Thu Jan 21 02:55:32 PST 2016



On 01/21/2016 01:35 PM, Vladimir Davydov wrote:
>> +		if (ub_dirty + ub_writeback <= ub_thresh)
>> +			break;
>> +		if (!writeback_in_progress(bdi))
>> +			bdi_start_background_writeback(bdi);
>> +
>> +		/*
>> +		 * Throttle it only when the background writeback cannot
>> +		 * catch-up. This avoids (excessively) small writeouts
>> +		 * when the bdi limits are ramping up.
>> +		 */
>> +		if (ub_dirty + ub_writeback <
>> +			(ub_background_thresh + ub_thresh) / 2)
>> +			break;
>> +
>> +		if (ub_dirty > ub_thresh) {
>> +			pages_written = writeback_inodes_wb(&bdi->wb, write_chunk,
> 
> You need to subtract the number of pages written from write_chunk here,
> obviously.
> 

Hm... I think you're bit wrong here. We shouldn't change write_chunk.
I did the following:

diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 951330e..090b6e6 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -1403,6 +1403,8 @@ static void balance_dirty_pages_ub(struct address_space *mapping,
        struct backing_dev_info *bdi = mapping->backing_dev_info;
 
        for (;;) {
+               unsigned long nr_to_write = write_chunk;
+
                ub_dirty = ub_stat_get(ub, dirty_pages);
                ub_writeback = ub_stat_get(ub, writeback_pages);
 

@@ -1428,8 +1430,10 @@ static void balance_dirty_pages_ub(struct address_space *mapping,
                        break;
 
                if (ub_dirty > ub_thresh) {
-                       pages_written = writeback_inodes_wb(&bdi->wb, write_chunk,
-                                       WB_REASON_BACKGROUND, ub);
+                       pages_written += writeback_inodes_wb(&bdi->wb,
+                                                       nr_to_write,
+                                                       WB_REASON_BACKGROUND,
+                                                       ub);
                        ub_dirty = ub_stat_get(ub, dirty_pages);
                        ub_writeback = ub_stat_get(ub, writeback_pages);




More information about the Devel mailing list