* [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).