linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] Allow for multiple pages in a single writeback event
@ 2021-03-22 20:11 Matthew Wilcox (Oracle)
  2021-03-22 20:11 ` [PATCH 1/3] mm/writeback: Rename __add_wb_stat to wb_stat_mod Matthew Wilcox (Oracle)
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Matthew Wilcox (Oracle) @ 2021-03-22 20:11 UTC (permalink / raw)
  To: Jan Kara; +Cc: Matthew Wilcox (Oracle), linux-mm, Johannes Weiner

This is prep work for THP or Folios or whatever we end up doing --
we are going to end up somehow batching page writeback completions.
Nothing here makes that happen; we simply pass '1' from all our current
callers, but eventually we'll pass a number greater than 1.

Matthew Wilcox (Oracle) (3):
  mm/writeback: Rename __add_wb_stat to wb_stat_mod
  flex_proportions: Allow N events instead of 1
  mm/writeback: Change __wb_writeout_inc to __wb_writeout_add

 include/linux/backing-dev.h      |  6 +++---
 include/linux/flex_proportions.h |  9 +++++----
 lib/flex_proportions.c           | 15 ++++++++-------
 mm/page-writeback.c              | 24 ++++++++++++------------
 4 files changed, 28 insertions(+), 26 deletions(-)

-- 
2.30.2



^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/3] mm/writeback: Rename __add_wb_stat to wb_stat_mod
  2021-03-22 20:11 [PATCH 0/3] Allow for multiple pages in a single writeback event Matthew Wilcox (Oracle)
@ 2021-03-22 20:11 ` Matthew Wilcox (Oracle)
  2021-03-22 20:11 ` [PATCH 2/3] flex_proportions: Allow N events instead of 1 Matthew Wilcox (Oracle)
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Matthew Wilcox (Oracle) @ 2021-03-22 20:11 UTC (permalink / raw)
  To: Jan Kara; +Cc: Matthew Wilcox (Oracle), linux-mm, Johannes Weiner

Make this look like the newly renamed vmstat functions.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 include/linux/backing-dev.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h
index 44df4fcef65c..a852876bb6e2 100644
--- a/include/linux/backing-dev.h
+++ b/include/linux/backing-dev.h
@@ -64,7 +64,7 @@ static inline bool bdi_has_dirty_io(struct backing_dev_info *bdi)
 	return atomic_long_read(&bdi->tot_write_bandwidth);
 }
 
-static inline void __add_wb_stat(struct bdi_writeback *wb,
+static inline void wb_stat_mod(struct bdi_writeback *wb,
 				 enum wb_stat_item item, s64 amount)
 {
 	percpu_counter_add_batch(&wb->stat[item], amount, WB_STAT_BATCH);
@@ -72,12 +72,12 @@ static inline void __add_wb_stat(struct bdi_writeback *wb,
 
 static inline void inc_wb_stat(struct bdi_writeback *wb, enum wb_stat_item item)
 {
-	__add_wb_stat(wb, item, 1);
+	wb_stat_mod(wb, item, 1);
 }
 
 static inline void dec_wb_stat(struct bdi_writeback *wb, enum wb_stat_item item)
 {
-	__add_wb_stat(wb, item, -1);
+	wb_stat_mod(wb, item, -1);
 }
 
 static inline s64 wb_stat(struct bdi_writeback *wb, enum wb_stat_item item)
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/3] flex_proportions: Allow N events instead of 1
  2021-03-22 20:11 [PATCH 0/3] Allow for multiple pages in a single writeback event Matthew Wilcox (Oracle)
  2021-03-22 20:11 ` [PATCH 1/3] mm/writeback: Rename __add_wb_stat to wb_stat_mod Matthew Wilcox (Oracle)
@ 2021-03-22 20:11 ` Matthew Wilcox (Oracle)
  2021-03-22 22:35   ` Matthew Wilcox
  2021-03-22 20:11 ` [PATCH 3/3] mm/writeback: Change __wb_writeout_inc to __wb_writeout_add Matthew Wilcox (Oracle)
  2021-03-31  9:28 ` [PATCH 0/3] Allow for multiple pages in a single writeback event Jan Kara
  3 siblings, 1 reply; 7+ messages in thread
From: Matthew Wilcox (Oracle) @ 2021-03-22 20:11 UTC (permalink / raw)
  To: Jan Kara; +Cc: Matthew Wilcox (Oracle), linux-mm, Johannes Weiner

When batching events (such as writing back N pages in a single I/O), it
is better to do one flex_proportion operation instead of N.  There is
only one caller of __fprop_inc_percpu_max(), and it's the one we're
going to change in the next patch, so rename it instead of adding a
compatibility wrapper.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 include/linux/flex_proportions.h |  9 +++++----
 lib/flex_proportions.c           | 15 ++++++++-------
 mm/page-writeback.c              |  4 ++--
 3 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/include/linux/flex_proportions.h b/include/linux/flex_proportions.h
index c12df59d3f5f..3e378b1fb0bc 100644
--- a/include/linux/flex_proportions.h
+++ b/include/linux/flex_proportions.h
@@ -83,9 +83,10 @@ struct fprop_local_percpu {
 
 int fprop_local_init_percpu(struct fprop_local_percpu *pl, gfp_t gfp);
 void fprop_local_destroy_percpu(struct fprop_local_percpu *pl);
-void __fprop_inc_percpu(struct fprop_global *p, struct fprop_local_percpu *pl);
-void __fprop_inc_percpu_max(struct fprop_global *p, struct fprop_local_percpu *pl,
-			    int max_frac);
+void __fprop_add_percpu(struct fprop_global *p, struct fprop_local_percpu *pl,
+		long nr);
+void __fprop_add_percpu_max(struct fprop_global *p,
+		struct fprop_local_percpu *pl, int max_frac, long nr);
 void fprop_fraction_percpu(struct fprop_global *p,
 	struct fprop_local_percpu *pl, unsigned long *numerator,
 	unsigned long *denominator);
@@ -96,7 +97,7 @@ void fprop_inc_percpu(struct fprop_global *p, struct fprop_local_percpu *pl)
 	unsigned long flags;
 
 	local_irq_save(flags);
-	__fprop_inc_percpu(p, pl);
+	__fprop_add_percpu(p, pl, 1);
 	local_irq_restore(flags);
 }
 
diff --git a/lib/flex_proportions.c b/lib/flex_proportions.c
index 451543937524..60029bf541c6 100644
--- a/lib/flex_proportions.c
+++ b/lib/flex_proportions.c
@@ -217,11 +217,12 @@ static void fprop_reflect_period_percpu(struct fprop_global *p,
 }
 
 /* Event of type pl happened */
-void __fprop_inc_percpu(struct fprop_global *p, struct fprop_local_percpu *pl)
+void __fprop_add_percpu(struct fprop_global *p, struct fprop_local_percpu *pl,
+		long nr)
 {
 	fprop_reflect_period_percpu(p, pl);
-	percpu_counter_add_batch(&pl->events, 1, PROP_BATCH);
-	percpu_counter_add(&p->events, 1);
+	percpu_counter_add_batch(&pl->events, nr, PROP_BATCH);
+	percpu_counter_add(&p->events, nr);
 }
 
 void fprop_fraction_percpu(struct fprop_global *p,
@@ -253,11 +254,11 @@ void fprop_fraction_percpu(struct fprop_global *p,
 }
 
 /*
- * Like __fprop_inc_percpu() except that event is counted only if the given
+ * Like __fprop_add_percpu() except that event is counted only if the given
  * type has fraction smaller than @max_frac/FPROP_FRAC_BASE
  */
-void __fprop_inc_percpu_max(struct fprop_global *p,
-			    struct fprop_local_percpu *pl, int max_frac)
+void __fprop_add_percpu_max(struct fprop_global *p,
+		struct fprop_local_percpu *pl, int max_frac, long nr)
 {
 	if (unlikely(max_frac < FPROP_FRAC_BASE)) {
 		unsigned long numerator, denominator;
@@ -268,5 +269,5 @@ void __fprop_inc_percpu_max(struct fprop_global *p,
 			return;
 	}
 
-	__fprop_inc_percpu(p, pl);
+	__fprop_add_percpu(p, pl, nr);
 }
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 55d6ec0e8d93..0cd58c7c69f2 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -572,8 +572,8 @@ static void wb_domain_writeout_inc(struct wb_domain *dom,
 				   struct fprop_local_percpu *completions,
 				   unsigned int max_prop_frac)
 {
-	__fprop_inc_percpu_max(&dom->completions, completions,
-			       max_prop_frac);
+	__fprop_add_percpu_max(&dom->completions, completions,
+			       max_prop_frac, 1);
 	/* First event after period switching was turned off? */
 	if (unlikely(!dom->period_time)) {
 		/*
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/3] mm/writeback: Change __wb_writeout_inc to __wb_writeout_add
  2021-03-22 20:11 [PATCH 0/3] Allow for multiple pages in a single writeback event Matthew Wilcox (Oracle)
  2021-03-22 20:11 ` [PATCH 1/3] mm/writeback: Rename __add_wb_stat to wb_stat_mod Matthew Wilcox (Oracle)
  2021-03-22 20:11 ` [PATCH 2/3] flex_proportions: Allow N events instead of 1 Matthew Wilcox (Oracle)
@ 2021-03-22 20:11 ` Matthew Wilcox (Oracle)
  2021-03-31  9:28 ` [PATCH 0/3] Allow for multiple pages in a single writeback event Jan Kara
  3 siblings, 0 replies; 7+ messages in thread
From: Matthew Wilcox (Oracle) @ 2021-03-22 20:11 UTC (permalink / raw)
  To: Jan Kara; +Cc: Matthew Wilcox (Oracle), linux-mm, Johannes Weiner

Allow for accounting N pages at once instead of one page at a time.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 mm/page-writeback.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 0cd58c7c69f2..ba4b57e260ba 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -568,12 +568,12 @@ static unsigned long wp_next_time(unsigned long cur_time)
 	return cur_time;
 }
 
-static void wb_domain_writeout_inc(struct wb_domain *dom,
+static void wb_domain_writeout_add(struct wb_domain *dom,
 				   struct fprop_local_percpu *completions,
-				   unsigned int max_prop_frac)
+				   unsigned int max_prop_frac, long nr)
 {
 	__fprop_add_percpu_max(&dom->completions, completions,
-			       max_prop_frac, 1);
+			       max_prop_frac, nr);
 	/* First event after period switching was turned off? */
 	if (unlikely(!dom->period_time)) {
 		/*
@@ -591,18 +591,18 @@ static void wb_domain_writeout_inc(struct wb_domain *dom,
  * Increment @wb's writeout completion count and the global writeout
  * completion count. Called from test_clear_page_writeback().
  */
-static inline void __wb_writeout_inc(struct bdi_writeback *wb)
+static inline void __wb_writeout_add(struct bdi_writeback *wb, long nr)
 {
 	struct wb_domain *cgdom;
 
-	inc_wb_stat(wb, WB_WRITTEN);
-	wb_domain_writeout_inc(&global_wb_domain, &wb->completions,
-			       wb->bdi->max_prop_frac);
+	wb_stat_mod(wb, WB_WRITTEN, nr);
+	wb_domain_writeout_add(&global_wb_domain, &wb->completions,
+			       wb->bdi->max_prop_frac, nr);
 
 	cgdom = mem_cgroup_wb_domain(wb);
 	if (cgdom)
-		wb_domain_writeout_inc(cgdom, wb_memcg_completions(wb),
-				       wb->bdi->max_prop_frac);
+		wb_domain_writeout_add(cgdom, wb_memcg_completions(wb),
+				       wb->bdi->max_prop_frac, nr);
 }
 
 void wb_writeout_inc(struct bdi_writeback *wb)
@@ -610,7 +610,7 @@ void wb_writeout_inc(struct bdi_writeback *wb)
 	unsigned long flags;
 
 	local_irq_save(flags);
-	__wb_writeout_inc(wb);
+	__wb_writeout_add(wb, 1);
 	local_irq_restore(flags);
 }
 EXPORT_SYMBOL_GPL(wb_writeout_inc);
@@ -2739,7 +2739,7 @@ int test_clear_page_writeback(struct page *page)
 				struct bdi_writeback *wb = inode_to_wb(inode);
 
 				dec_wb_stat(wb, WB_WRITEBACK);
-				__wb_writeout_inc(wb);
+				__wb_writeout_add(wb, 1);
 			}
 		}
 
-- 
2.30.2



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/3] flex_proportions: Allow N events instead of 1
  2021-03-22 20:11 ` [PATCH 2/3] flex_proportions: Allow N events instead of 1 Matthew Wilcox (Oracle)
@ 2021-03-22 22:35   ` Matthew Wilcox
  2021-03-31  9:26     ` Jan Kara
  0 siblings, 1 reply; 7+ messages in thread
From: Matthew Wilcox @ 2021-03-22 22:35 UTC (permalink / raw)
  To: Jan Kara; +Cc: linux-mm, Johannes Weiner

On Mon, Mar 22, 2021 at 08:11:15PM +0000, Matthew Wilcox (Oracle) wrote:
> -void __fprop_inc_percpu_max(struct fprop_global *p,
> -			    struct fprop_local_percpu *pl, int max_frac)
> +void __fprop_add_percpu_max(struct fprop_global *p,
> +		struct fprop_local_percpu *pl, int max_frac, long nr)
>  {
>  	if (unlikely(max_frac < FPROP_FRAC_BASE)) {

Oh, I meant to ask ... should this change?  Should it be:

	if (unlikely(max_frac < FPROP_FRAC_BASE / nr))
(or something similar that copes with overflow properly)
I must confess to not understanding exactly how flex_proportions works.



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/3] flex_proportions: Allow N events instead of 1
  2021-03-22 22:35   ` Matthew Wilcox
@ 2021-03-31  9:26     ` Jan Kara
  0 siblings, 0 replies; 7+ messages in thread
From: Jan Kara @ 2021-03-31  9:26 UTC (permalink / raw)
  To: Matthew Wilcox; +Cc: Jan Kara, linux-mm, Johannes Weiner

On Mon 22-03-21 22:35:27, Matthew Wilcox wrote:
> On Mon, Mar 22, 2021 at 08:11:15PM +0000, Matthew Wilcox (Oracle) wrote:
> > -void __fprop_inc_percpu_max(struct fprop_global *p,
> > -			    struct fprop_local_percpu *pl, int max_frac)
> > +void __fprop_add_percpu_max(struct fprop_global *p,
> > +		struct fprop_local_percpu *pl, int max_frac, long nr)
> >  {
> >  	if (unlikely(max_frac < FPROP_FRAC_BASE)) {
> 
> Oh, I meant to ask ... should this change?  Should it be:
> 
> 	if (unlikely(max_frac < FPROP_FRAC_BASE / nr))
> (or something similar that copes with overflow properly)
> I must confess to not understanding exactly how flex_proportions works.

No, __fprop_inc_percpu_max() implements "saturation" arithmetics on
fractions. So if the fraction tracked by 'pl' exceeds
max_frac/FPROP_FRAC_BASE, we don't want to increment 'pl' further. If 'nr'
is going to be small, we probably don't care that we somewhat exceed the
max_frac/FPROP_FRAC_BASE. But I suppose 'nr' can be say 512 at which point
(given FPROP_FRAC_BASE is 1024) one addition can make a very significant
difference. So we probably need to be more clever like:

	if (unlikely(max_frac < FPROP_FRAC_BASE)) {
		unsigned long numerator, denominator;
		s64 tmp;

		fprop_fraction_percpu(p, pl, &numerator, &denominator);
		/* Adding 'nr' to fraction exceeds max_frac/FPROP_FRAC_BASE? */
		tmp = (u64)denominator * max_frac -
					((u64)numerator << FPROP_FRAC_SHIFT);
		if (tmp < 0) {
			/* Maximum fraction already exceeded? */
			return;
		} else if (tmp < nr * (FPROP_FRAC_BASE - max_frac)) {
			/* Add just enough for the fraction to saturate */
			nr = div_u64(tmp + FPROP_FRAC_BASE - max_frac - 1,
				     FPROP_FRAC_BASE - max_frac);
		}
	}

								Honza
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 0/3] Allow for multiple pages in a single writeback event
  2021-03-22 20:11 [PATCH 0/3] Allow for multiple pages in a single writeback event Matthew Wilcox (Oracle)
                   ` (2 preceding siblings ...)
  2021-03-22 20:11 ` [PATCH 3/3] mm/writeback: Change __wb_writeout_inc to __wb_writeout_add Matthew Wilcox (Oracle)
@ 2021-03-31  9:28 ` Jan Kara
  3 siblings, 0 replies; 7+ messages in thread
From: Jan Kara @ 2021-03-31  9:28 UTC (permalink / raw)
  To: Matthew Wilcox (Oracle); +Cc: Jan Kara, linux-mm, Johannes Weiner

On Mon 22-03-21 20:11:13, Matthew Wilcox (Oracle) wrote:
> This is prep work for THP or Folios or whatever we end up doing --
> we are going to end up somehow batching page writeback completions.
> Nothing here makes that happen; we simply pass '1' from all our current
> callers, but eventually we'll pass a number greater than 1.

The patches look good to me besides that one problem in the writeback
proportions code. After that is fixed, I can either take the patches
through my tree or we can route them through Andrew with my Reviewed-by.

								Honza

> 
> Matthew Wilcox (Oracle) (3):
>   mm/writeback: Rename __add_wb_stat to wb_stat_mod
>   flex_proportions: Allow N events instead of 1
>   mm/writeback: Change __wb_writeout_inc to __wb_writeout_add
> 
>  include/linux/backing-dev.h      |  6 +++---
>  include/linux/flex_proportions.h |  9 +++++----
>  lib/flex_proportions.c           | 15 ++++++++-------
>  mm/page-writeback.c              | 24 ++++++++++++------------
>  4 files changed, 28 insertions(+), 26 deletions(-)
> 
> -- 
> 2.30.2
> 
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-03-31  9:28 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-22 20:11 [PATCH 0/3] Allow for multiple pages in a single writeback event Matthew Wilcox (Oracle)
2021-03-22 20:11 ` [PATCH 1/3] mm/writeback: Rename __add_wb_stat to wb_stat_mod Matthew Wilcox (Oracle)
2021-03-22 20:11 ` [PATCH 2/3] flex_proportions: Allow N events instead of 1 Matthew Wilcox (Oracle)
2021-03-22 22:35   ` Matthew Wilcox
2021-03-31  9:26     ` Jan Kara
2021-03-22 20:11 ` [PATCH 3/3] mm/writeback: Change __wb_writeout_inc to __wb_writeout_add Matthew Wilcox (Oracle)
2021-03-31  9:28 ` [PATCH 0/3] Allow for multiple pages in a single writeback event Jan Kara

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).