Patch "writeback: use higher precision calculation in domain_dirty_limits()" has been added to the 4.6-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
writeback: use higher precision calculation in domain_dirty_limits()
to the 4.6-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
writeback-use-higher-precision-calculation-in-domain_dirty_limits.patch
and it can be found in the queue-4.6 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
62a584fe05eef1f80ed49a286a29328f1a224fb9Mon Sep 17 00:00:00 2001
From: Tejun Heo <[email protected]>
Date: Fri, 27 May 2016 14:34:46 -0400
Subject: writeback: use higher precision calculation in domain_dirty_limits()
From: Tejun Heo <[email protected]>
commit 62a584fe05eef1f80ed49a286a29328f1a224fb9 upstream.
As vm.dirty_[background_]bytes can't be applied verbatim to multiple cgroup writeback domains, they get converted to percentages in domain_dirty_limits() and applied the same way as vm.dirty_[background]ratio. However, if the specified bytes is lower than 1% of available memory, the calculated ratios become zero and the writeback domain gets throttled constantly.
Fix it by using per-PAGE_SIZE instead of percentage for ratio calculations. Also, the updated DIV_ROUND_UP() usages now should yield 1/4096 (0.0244%) as the minimum ratio as long as the specified bytes are above zero.
Adjusted comment based on Jan's suggestion.
--- mm/page-writeback.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
mm/page-writeback.c +12 -9
@@ -369,8 +369,9 @@ static void domain_dirty_limits(struct dstruct dirty_throttle_control *gdtc =mdtc_gdtc (dtc);unsigned long bytes = vm_dirty_bytes;unsigned long bg_bytes = dirty_background_bytes; -unsigned long ratio = vm_dirty_ratio; -unsigned long bg_ratio = dirty_background_ratio; +/* convert ratios to per-PAGE_SIZE for higher precision */ +unsigned long ratio = (vm_dirty_ratio *PAGE_SIZE ) /100 ; +unsigned long bg_ratio = (dirty_background_ratio *PAGE_SIZE ) /100 ;unsigned long thresh;unsigned long bg_thresh;struct task_struct *tsk;
@@ -382,26 +383,28 @@ static void domain_dirty_limits(struct d/* * The byte settings can't be applied directly to memcg * domains. Convert them to ratios by scaling against -* globally available memory. +* globally available memory. As the ratios are in +* per-PAGE_SIZE, they can be obtained by dividing bytes by +* number of pages. */ if (bytes) - ratio =min (DIV_ROUND_UP (bytes,PAGE_SIZE ) *100 / - global_avail,100UL ); + ratio =min (DIV_ROUND_UP (bytes, global_avail), +PAGE_SIZE );if (bg_bytes) - bg_ratio =min (DIV_ROUND_UP (bg_bytes,PAGE_SIZE ) *100 / - global_avail,100UL ); + bg_ratio =min (DIV_ROUND_UP (bg_bytes, global_avail), +PAGE_SIZE ); bytes = bg_bytes =0 ; }if (bytes) thresh =DIV_ROUND_UP (bytes,PAGE_SIZE );else - thresh = (ratio * available_memory) /100 ; + thresh = (ratio * available_memory) /PAGE_SIZE ;if (bg_bytes) bg_thresh =DIV_ROUND_UP (bg_bytes,PAGE_SIZE );else - bg_thresh = (bg_ratio * available_memory) /100 ; + bg_thresh = (bg_ratio * available_memory) /PAGE_SIZE ;if (bg_thresh >= thresh) bg_thresh = thresh /2 ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.6/writeback-use-higher-precision-calculation-in-domain_dirty_limits.patch