From: Michal Hocko Subject: Re: [patch 2/5] mm: writeback: cleanups in preparation for per-zone dirty limits Date: Fri, 30 Sep 2011 15:56:38 +0200 Message-ID: <20110930135638.GB869@tiehlicka.suse.cz> References: <1317367044-475-1-git-send-email-jweiner@redhat.com> <1317367044-475-3-git-send-email-jweiner@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Andrew Morton , Mel Gorman , Christoph Hellwig , Dave Chinner , Wu Fengguang , Jan Kara , Rik van Riel , Minchan Kim , Chris Mason , Theodore Ts'o , Andreas Dilger , Shaohua Li , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org To: Johannes Weiner Return-path: Content-Disposition: inline In-Reply-To: <1317367044-475-3-git-send-email-jweiner@redhat.com> Sender: owner-linux-mm@kvack.org List-Id: linux-ext4.vger.kernel.org On Fri 30-09-11 09:17:21, Johannes Weiner wrote: > The next patch will introduce per-zone dirty limiting functions in > addition to the traditional global dirty limiting. > > Rename determine_dirtyable_memory() to global_dirtyable_memory() > before adding the zone-specific version, and fix up its documentation. > > Also, move the functions to determine the dirtyable memory and the > function to calculate the dirty limit based on that together so that > their relationship is more apparent and that they can be commented on > as a group. > > Signed-off-by: Johannes Weiner > Reviewed-by: Minchan Kim > Acked-by: Mel Gorman Reviewed-by: Michal Hocko > --- > mm/page-writeback.c | 92 +++++++++++++++++++++++++------------------------- > 1 files changed, 46 insertions(+), 46 deletions(-) > > diff --git a/mm/page-writeback.c b/mm/page-writeback.c > index c8acf8a..78604a6 100644 > --- a/mm/page-writeback.c > +++ b/mm/page-writeback.c > @@ -186,12 +186,12 @@ static unsigned long highmem_dirtyable_memory(unsigned long total) > } > > /** > - * determine_dirtyable_memory - amount of memory that may be used > + * global_dirtyable_memory - number of globally dirtyable pages > * > - * Returns the numebr of pages that can currently be freed and used > - * by the kernel for direct mappings. > + * Returns the global number of pages potentially available for dirty > + * page cache. This is the base value for the global dirty limits. > */ > -static unsigned long determine_dirtyable_memory(void) > +static unsigned long global_dirtyable_memory(void) > { > unsigned long x; > > @@ -205,6 +205,47 @@ static unsigned long determine_dirtyable_memory(void) > } > > /* > + * global_dirty_limits - background-writeback and dirty-throttling thresholds > + * > + * Calculate the dirty thresholds based on sysctl parameters > + * - vm.dirty_background_ratio or vm.dirty_background_bytes > + * - vm.dirty_ratio or vm.dirty_bytes > + * The dirty limits will be lifted by 1/4 for PF_LESS_THROTTLE (ie. nfsd) and > + * real-time tasks. > + */ > +void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty) > +{ > + unsigned long background; > + unsigned long dirty; > + unsigned long uninitialized_var(available_memory); > + struct task_struct *tsk; > + > + if (!vm_dirty_bytes || !dirty_background_bytes) > + available_memory = global_dirtyable_memory(); > + > + if (vm_dirty_bytes) > + dirty = DIV_ROUND_UP(vm_dirty_bytes, PAGE_SIZE); > + else > + dirty = (vm_dirty_ratio * available_memory) / 100; > + > + if (dirty_background_bytes) > + background = DIV_ROUND_UP(dirty_background_bytes, PAGE_SIZE); > + else > + background = (dirty_background_ratio * available_memory) / 100; > + > + if (background >= dirty) > + background = dirty / 2; > + tsk = current; > + if (tsk->flags & PF_LESS_THROTTLE || rt_task(tsk)) { > + background += background / 4; > + dirty += dirty / 4; > + } > + *pbackground = background; > + *pdirty = dirty; > + trace_global_dirty_state(background, dirty); > +} > + > +/* > * couple the period to the dirty_ratio: > * > * period/2 ~ roundup_pow_of_two(dirty limit) > @@ -216,7 +257,7 @@ static int calc_period_shift(void) > if (vm_dirty_bytes) > dirty_total = vm_dirty_bytes / PAGE_SIZE; > else > - dirty_total = (vm_dirty_ratio * determine_dirtyable_memory()) / > + dirty_total = (vm_dirty_ratio * global_dirtyable_memory()) / > 100; > return 2 + ilog2(dirty_total - 1); > } > @@ -416,47 +457,6 @@ static unsigned long hard_dirty_limit(unsigned long thresh) > return max(thresh, global_dirty_limit); > } > > -/* > - * global_dirty_limits - background-writeback and dirty-throttling thresholds > - * > - * Calculate the dirty thresholds based on sysctl parameters > - * - vm.dirty_background_ratio or vm.dirty_background_bytes > - * - vm.dirty_ratio or vm.dirty_bytes > - * The dirty limits will be lifted by 1/4 for PF_LESS_THROTTLE (ie. nfsd) and > - * real-time tasks. > - */ > -void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty) > -{ > - unsigned long background; > - unsigned long dirty; > - unsigned long uninitialized_var(available_memory); > - struct task_struct *tsk; > - > - if (!vm_dirty_bytes || !dirty_background_bytes) > - available_memory = determine_dirtyable_memory(); > - > - if (vm_dirty_bytes) > - dirty = DIV_ROUND_UP(vm_dirty_bytes, PAGE_SIZE); > - else > - dirty = (vm_dirty_ratio * available_memory) / 100; > - > - if (dirty_background_bytes) > - background = DIV_ROUND_UP(dirty_background_bytes, PAGE_SIZE); > - else > - background = (dirty_background_ratio * available_memory) / 100; > - > - if (background >= dirty) > - background = dirty / 2; > - tsk = current; > - if (tsk->flags & PF_LESS_THROTTLE || rt_task(tsk)) { > - background += background / 4; > - dirty += dirty / 4; > - } > - *pbackground = background; > - *pdirty = dirty; > - trace_global_dirty_state(background, dirty); > -} > - > /** > * bdi_dirty_limit - @bdi's share of dirty throttling threshold > * @bdi: the backing_dev_info to query > -- > 1.7.6.2 > > -- > To unsubscribe, send a message with 'unsubscribe linux-mm' in > the body to majordomo@kvack.org. For more info on Linux MM, > see: http://www.linux-mm.org/ . > Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ > Don't email: email@kvack.org -- Michal Hocko SUSE Labs SUSE LINUX s.r.o. Lihovarska 1060/12 190 00 Praha 9 Czech Republic -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: email@kvack.org