2021-04-21 03:15:28

by Yury Norov

[permalink] [raw]
Subject: [PATCH v2 0/2] bitmap_parselist: support 'all' semantics

RCU code supports a special group 'all' which selects all bits in a bitmap.
We have recently added 'N' extension for bitmap parse, so that '0-N' would
have exactly the same meaning as 'all'. But because the 'all' is already
used by RCU, it would be reasonable to support it in core bitmap code as a
common and easy-readable alias for '0-N'.

Moving the 'all' support to core bitmap code adds another level of
flexibility for system configuration by supporting patterns. For example,
every second bit in cpumask may be selected like this:
isolcpus=all:1/2

v2:
- cleanup patch 1;
- in patch 2 explain why dropping legacy comment.

Yury Norov (2):
bitmap_parse: support 'all' semantics
rcu/tree_plugin: don't handle the case of 'all' CPU range

Documentation/admin-guide/kernel-parameters.rst | 5 +++++
kernel/rcu/tree_plugin.h | 9 +++------
lib/bitmap.c | 9 +++++++++
lib/test_bitmap.c | 7 +++++++
4 files changed, 24 insertions(+), 6 deletions(-)

--
2.25.1


2021-04-21 03:16:09

by Yury Norov

[permalink] [raw]
Subject: [PATCH 2/2] rcu/tree_plugin: don't handle the case of 'all' CPU range

The 'all' semantics is now supported by the bitmap_parselist() so we can
drop supporting it as a special case in RCU code. Since 'all' is properly
supported in core bitmap code, drop legacy comment in RCU for it.

This patch does not add any functional changes for existing users.

Reviewed-by: Andy Shevchenko <[email protected]>
Signed-off-by: Yury Norov <[email protected]>
---
kernel/rcu/tree_plugin.h | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/kernel/rcu/tree_plugin.h b/kernel/rcu/tree_plugin.h
index 464b16132866..334eaf4d561f 100644
--- a/kernel/rcu/tree_plugin.h
+++ b/kernel/rcu/tree_plugin.h
@@ -1511,13 +1511,10 @@ static void rcu_cleanup_after_idle(void)
static int __init rcu_nocb_setup(char *str)
{
alloc_bootmem_cpumask_var(&rcu_nocb_mask);
- if (!strcasecmp(str, "all")) /* legacy: use "0-N" instead */
+ if (cpulist_parse(str, rcu_nocb_mask)) {
+ pr_warn("rcu_nocbs= bad CPU range, all CPUs set\n");
cpumask_setall(rcu_nocb_mask);
- else
- if (cpulist_parse(str, rcu_nocb_mask)) {
- pr_warn("rcu_nocbs= bad CPU range, all CPUs set\n");
- cpumask_setall(rcu_nocb_mask);
- }
+ }
return 1;
}
__setup("rcu_nocbs=", rcu_nocb_setup);
--
2.25.1

2021-04-21 03:16:20

by Yury Norov

[permalink] [raw]
Subject: [PATCH 1/2] bitmap_parse: support 'all' semantics

RCU code supports an 'all' group as a special case when parsing
rcu_nocbs parameter. This patch moves the 'all' support to the core
bitmap_parse code, so that all bitmap users can enjoy this extension.

Moving 'all' parsing to a bitmap_parse level, also allows users to
pass patterns together with 'all' in regular group:pattern format

Reviewed-by: Andy Shevchenko <[email protected]>
Signed-off-by: Yury Norov <[email protected]>
---
Documentation/admin-guide/kernel-parameters.rst | 5 +++++
lib/bitmap.c | 9 +++++++++
lib/test_bitmap.c | 7 +++++++
3 files changed, 21 insertions(+)

diff --git a/Documentation/admin-guide/kernel-parameters.rst b/Documentation/admin-guide/kernel-parameters.rst
index 3996b54158bf..7178d9c4de7f 100644
--- a/Documentation/admin-guide/kernel-parameters.rst
+++ b/Documentation/admin-guide/kernel-parameters.rst
@@ -76,6 +76,11 @@ to change, such as less cores in the CPU list, then N and any ranges using N
will also change. Use the same on a small 4 core system, and "16-N" becomes
"16-3" and now the same boot input will be flagged as invalid (start > end).

+The special case-tolerant group name "all" has a meaning of selecting all CPUs,
+such that "isolcpus=all" is the equivalent of "isolcpus=0-N".
+
+The semantics of "N" and "all" is supported on a level of bitmaps and holds for
+all users of bitmap_parse().

This document may not be entirely up to date and comprehensive. The command
"modinfo -p ${modulename}" shows a current list of all parameters of a loadable
diff --git a/lib/bitmap.c b/lib/bitmap.c
index 74ceb02f45e3..6e29b2aae6ba 100644
--- a/lib/bitmap.c
+++ b/lib/bitmap.c
@@ -581,6 +581,14 @@ static const char *bitmap_parse_region(const char *str, struct region *r)
{
unsigned int lastbit = r->nbits - 1;

+ if (!strncasecmp(str, "all", 3)) {
+ r->start = 0;
+ r->end = lastbit;
+ str += 3;
+
+ goto check_pattern;
+ }
+
str = bitmap_getnum(str, &r->start, lastbit);
if (IS_ERR(str))
return str;
@@ -595,6 +603,7 @@ static const char *bitmap_parse_region(const char *str, struct region *r)
if (IS_ERR(str))
return str;

+check_pattern:
if (end_of_region(*str))
goto no_pattern;

diff --git a/lib/test_bitmap.c b/lib/test_bitmap.c
index 9cd575583180..4ea73f5aed41 100644
--- a/lib/test_bitmap.c
+++ b/lib/test_bitmap.c
@@ -366,6 +366,13 @@ static const struct test_bitmap_parselist parselist_tests[] __initconst = {
{0, "0-31:1/3,1-31:1/3,2-31:1/3", &exp1[8 * step], 32, 0},
{0, "1-10:8/12,8-31:24/29,0-31:0/3", &exp1[9 * step], 32, 0},

+ {0, "all", &exp1[8 * step], 32, 0},
+ {0, "0, 1, all, ", &exp1[8 * step], 32, 0},
+ {0, "all:1/2", &exp1[4 * step], 32, 0},
+ {0, "ALL:1/2", &exp1[4 * step], 32, 0},
+ {-EINVAL, "al", NULL, 8, 0},
+ {-EINVAL, "alll", NULL, 8, 0},
+
{-EINVAL, "-1", NULL, 8, 0},
{-EINVAL, "-0", NULL, 8, 0},
{-EINVAL, "10-1", NULL, 8, 0},
--
2.25.1

2021-04-21 22:57:59

by Steven Rostedt

[permalink] [raw]
Subject: Re: [PATCH 1/2] bitmap_parse: support 'all' semantics

On Tue, 20 Apr 2021 20:13:25 -0700
Yury Norov <[email protected]> wrote:

> @@ -76,6 +76,11 @@ to change, such as less cores in the CPU list, then N and any ranges using N
> will also change. Use the same on a small 4 core system, and "16-N" becomes
> "16-3" and now the same boot input will be flagged as invalid (start > end).
>
> +The special case-tolerant group name "all" has a meaning of selecting all CPUs,
> +such that "isolcpus=all" is the equivalent of "isolcpus=0-N".

I'm OK with the concept of this patch set, but really? That is a horrible
example. One should NEVER set isolcpus to all!

-- Steve


> +
> +The semantics of "N" and "all" is supported on a level of bitmaps and holds for
> +all users of bitmap_parse().
>

2021-04-22 00:13:00

by Paul E. McKenney

[permalink] [raw]
Subject: Re: [PATCH 1/2] bitmap_parse: support 'all' semantics

On Wed, Apr 21, 2021 at 11:19:32AM -0400, Steven Rostedt wrote:
> On Tue, 20 Apr 2021 20:13:25 -0700
> Yury Norov <[email protected]> wrote:
>
> > @@ -76,6 +76,11 @@ to change, such as less cores in the CPU list, then N and any ranges using N
> > will also change. Use the same on a small 4 core system, and "16-N" becomes
> > "16-3" and now the same boot input will be flagged as invalid (start > end).
> >
> > +The special case-tolerant group name "all" has a meaning of selecting all CPUs,
> > +such that "isolcpus=all" is the equivalent of "isolcpus=0-N".
>
> I'm OK with the concept of this patch set, but really? That is a horrible
> example. One should NEVER set isolcpus to all!

How about "isolcpus=all:2/4"? ;-)

Thanx, Paul

> -- Steve
>
>
> > +
> > +The semantics of "N" and "all" is supported on a level of bitmaps and holds for
> > +all users of bitmap_parse().
> >

2021-04-22 01:08:47

by Paul E. McKenney

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] bitmap_parselist: support 'all' semantics

On Tue, Apr 20, 2021 at 08:13:24PM -0700, Yury Norov wrote:
> RCU code supports a special group 'all' which selects all bits in a bitmap.
> We have recently added 'N' extension for bitmap parse, so that '0-N' would
> have exactly the same meaning as 'all'. But because the 'all' is already
> used by RCU, it would be reasonable to support it in core bitmap code as a
> common and easy-readable alias for '0-N'.
>
> Moving the 'all' support to core bitmap code adds another level of
> flexibility for system configuration by supporting patterns. For example,
> every second bit in cpumask may be selected like this:
> isolcpus=all:1/2
>
> v2:
> - cleanup patch 1;
> - in patch 2 explain why dropping legacy comment.

Nice!

I have pulled this into -rcu with some minor updates, including replacing
the "isolcpus=all" with "rcu_nocbs=all:1/2" per Steve Rostedt's feedback.

Could you please check to make sure that I didn't mess anything up?

If tests go well, this will go into -next later today or tomorrow.
Although I cannot prove that this will not make the upcoming merge window,
but Murphy insists that it will instead be the v5.14 merge window.

Thanx, Paul

> Yury Norov (2):
> bitmap_parse: support 'all' semantics
> rcu/tree_plugin: don't handle the case of 'all' CPU range
>
> Documentation/admin-guide/kernel-parameters.rst | 5 +++++
> kernel/rcu/tree_plugin.h | 9 +++------
> lib/bitmap.c | 9 +++++++++
> lib/test_bitmap.c | 7 +++++++
> 4 files changed, 24 insertions(+), 6 deletions(-)
>
> --
> 2.25.1
>

2021-04-22 01:12:58

by Yury Norov

[permalink] [raw]
Subject: Re: [PATCH v2 0/2] bitmap_parselist: support 'all' semantics

On Wed, Apr 21, 2021 at 10:30:08AM -0700, Paul E. McKenney wrote:
> On Tue, Apr 20, 2021 at 08:13:24PM -0700, Yury Norov wrote:
> > RCU code supports a special group 'all' which selects all bits in a bitmap.
> > We have recently added 'N' extension for bitmap parse, so that '0-N' would
> > have exactly the same meaning as 'all'. But because the 'all' is already
> > used by RCU, it would be reasonable to support it in core bitmap code as a
> > common and easy-readable alias for '0-N'.
> >
> > Moving the 'all' support to core bitmap code adds another level of
> > flexibility for system configuration by supporting patterns. For example,
> > every second bit in cpumask may be selected like this:
> > isolcpus=all:1/2
> >
> > v2:
> > - cleanup patch 1;
> > - in patch 2 explain why dropping legacy comment.
>
> Nice!
>
> I have pulled this into -rcu with some minor updates, including replacing
> the "isolcpus=all" with "rcu_nocbs=all:1/2" per Steve Rostedt's feedback.

Thank you Paul and Steven for fixing this 'isolcpus=all'.
'rcu_nocbs=all:1/2' would look better in the documentation.

> Could you please check to make sure that I didn't mess anything up?

Everything is OK. Thank you for fixing this.

> If tests go well, this will go into -next later today or tomorrow.
> Although I cannot prove that this will not make the upcoming merge window,
> but Murphy insists that it will instead be the v5.14 merge window.
>
> Thanx, Paul
>
> > Yury Norov (2):
> > bitmap_parse: support 'all' semantics
> > rcu/tree_plugin: don't handle the case of 'all' CPU range
> >
> > Documentation/admin-guide/kernel-parameters.rst | 5 +++++
> > kernel/rcu/tree_plugin.h | 9 +++------
> > lib/bitmap.c | 9 +++++++++
> > lib/test_bitmap.c | 7 +++++++
> > 4 files changed, 24 insertions(+), 6 deletions(-)
> >
> > --
> > 2.25.1
> >

2021-04-22 01:29:09

by Paul Gortmaker

[permalink] [raw]
Subject: Re: [PATCH 1/2] bitmap_parse: support 'all' semantics

[Re: [PATCH 1/2] bitmap_parse: support 'all' semantics] On 21/04/2021 (Wed 11:19) Steven Rostedt wrote:

> On Tue, 20 Apr 2021 20:13:25 -0700
> Yury Norov <[email protected]> wrote:
>
> > @@ -76,6 +76,11 @@ to change, such as less cores in the CPU list, then N and any ranges using N
> > will also change. Use the same on a small 4 core system, and "16-N" becomes
> > "16-3" and now the same boot input will be flagged as invalid (start > end).
> >
> > +The special case-tolerant group name "all" has a meaning of selecting all CPUs,
> > +such that "isolcpus=all" is the equivalent of "isolcpus=0-N".
>
> I'm OK with the concept of this patch set, but really? That is a horrible
> example. One should NEVER set isolcpus to all!

It wouldn't have parsed anyways. The "isolcpus=" would just think "all" was
an unsupported flag and discard it before it ever got to cpu/bitmap
processing. See 3662daf02350 "sched/isolation: Allow "isolcpus=" to
skip unknown sub-parameters".

The use case example Paul chose (not me; the smart Paul) is better.

Paul.
--

>
> -- Steve
>
>
> > +
> > +The semantics of "N" and "all" is supported on a level of bitmaps and holds for
> > +all users of bitmap_parse().
> >