2020-12-30 04:16:32

by Peng Wang

[permalink] [raw]
Subject: [PATCH] checkpatch: ignore warning designated initializers using NR_CPUS

Some max_length wants to hold as large room as possible to
ensure enough size to tackle with the biggest NR_CPUS. As
an example below:

kernel/cgroup/cpuset.c:
static struct cftype legacy_files[] = {
{
.name = "cpus",
.seq_show = cpuset_common_seq_show,
.write = cpuset_write_resmask,
.max_write_len = (100U + 6 * NR_CPUS),
.private = FILE_CPULIST,
},
...
}

Signed-off-by: Peng Wang <[email protected]>
---
scripts/checkpatch.pl | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 0008530..da8fc48 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -7022,12 +7022,15 @@ sub process {

# use of NR_CPUS is usually wrong
# ignore definitions of NR_CPUS and usage to define arrays as likely right
+# ignore designated initializers using NR_CPUS
+
if ($line =~ /\bNR_CPUS\b/ &&
$line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
$line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
$line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
$line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
- $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
+ $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/ &&
+ $line !~ /\s*\..*=.*\bNR_CPUS\b.*,$/)
{
WARN("NR_CPUS",
"usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
--
2.9.5


2020-12-30 05:39:36

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH] checkpatch: ignore warning designated initializers using NR_CPUS

On Wed, 2020-12-30 at 12:13 +0800, Peng Wang wrote:
> Some max_length wants to hold as large room as possible to
> ensure enough size to tackle with the biggest NR_CPUS. As
> an example below:
>
> kernel/cgroup/cpuset.c:
> static struct cftype legacy_files[] = {
> ????????{
> ????????????????.name = "cpus",
> ????????????????.seq_show = cpuset_common_seq_show,
> ????????????????.write = cpuset_write_resmask,
> ????????????????.max_write_len = (100U + 6 * NR_CPUS),
> ????????????????.private = FILE_CPULIST,
> ????????},
> ...
> }
[]
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
[]
> @@ -7022,12 +7022,15 @@ sub process {
> ?
>
> ?# use of NR_CPUS is usually wrong
> ?# ignore definitions of NR_CPUS and usage to define arrays as likely right
> +# ignore designated initializers using NR_CPUS
> +
> ? if ($line =~ /\bNR_CPUS\b/ &&
> ? $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
> ? $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
> ? $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
> ? $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
> - $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
> + $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/ &&
> + $line !~ /\s*\..*=.*\bNR_CPUS\b.*,$/)
> ? {
> ? WARN("NR_CPUS",
> ? "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);

I wonder if it's worth it as there just aren't many of these: (6 total)

$ git grep -P '\..*=.*\bNR_CPUS\b.*,\s*$'
drivers/firmware/efi/efi.c: .cpu_bitmap = { [BITS_TO_LONGS(NR__CPUS)] = 0},
drivers/infiniband/hw/hfi1/sdma.c: .max_size = NR_CPUS,
init/init_task.c: .nr_cpus_allowed= NR_CPUS,
kernel/cgroup/cpuset.c: .max_write_len = (100U + 6 * NR_CPUS),
kernel/cgroup/cpuset.c: .max_write_len = (100U + 6 * NR_CPUS),
kernel/sysctl.c: .maxlen = NR_CPUS,

It also seems it might be more sensible as:

$line !~ /^.\s*\.\w+\s*=\s*.*\bNR_CPUS\b/

Which finds a couple more:

$ git grep -P '^\s*\.\w+\s*=\s*.*\bNR_CPUS\b'
arch/arm64/include/asm/processor.h: .fpsimd_cpu = NR_CPUS, \
arch/powerpc/kernel/prom_init.c: .max_cpus = cpu_to_be32(NR_CPUS), /* number of cores supported */
drivers/firmware/efi/efi.c: .cpu_bitmap = { [BITS_TO_LONGS(NR_CPUS)] = 0},
drivers/infiniband/hw/hfi1/sdma.c: .max_size = NR_CPUS,
init/init_task.c: .nr_cpus_allowed= NR_CPUS,
kernel/cgroup/cpuset.c: .max_write_len = (100U + 6 * NR_CPUS),
kernel/cgroup/cpuset.c: .max_write_len = (100U + 6 * NR_CPUS),
kernel/sysctl.c: .maxlen = NR_CPUS,


2020-12-30 07:12:28

by Peng Wang

[permalink] [raw]
Subject: Re: [PATCH] checkpatch: ignore warning designated initializers using NR_CPUS

Hi, Joe

On 12/30/20 1:35 PM, , Joe Perches wrote:
> On Wed, 2020-12-30 at 12:13 +0800, Peng Wang wrote:
>> Some max_length wants to hold as large room as possible to
>> ensure enough size to tackle with the biggest NR_CPUS. As
>> an example below:
>>
>> kernel/cgroup/cpuset.c:
>> static struct cftype legacy_files[] = {
>>         {
>>                 .name = "cpus",
>>                 .seq_show = cpuset_common_seq_show,
>>                 .write = cpuset_write_resmask,
>>                 .max_write_len = (100U + 6 * NR_CPUS),
>>                 .private = FILE_CPULIST,
>>         },
>> ...
>> }
> []
>> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
> []
>> @@ -7022,12 +7022,15 @@ sub process {
>>
>>
>>  # use of NR_CPUS is usually wrong
>>  # ignore definitions of NR_CPUS and usage to define arrays as likely right
>> +# ignore designated initializers using NR_CPUS
>> +
>>   if ($line =~ /\bNR_CPUS\b/ &&
>>   $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
>>   $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
>>   $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
>>   $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
>> - $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
>> + $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/ &&
>> + $line !~ /\s*\..*=.*\bNR_CPUS\b.*,$/)
>>   {
>>   WARN("NR_CPUS",
>>   "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
>
> I wonder if it's worth it as there just aren't many of these: (6 total)

It does not look that much, but checkpatch.pl makes warning on this
especially when "0 errors, 0 warnings" is needed.

>
> $ git grep -P '\..*=.*\bNR_CPUS\b.*,\s*$'
> drivers/firmware/efi/efi.c: .cpu_bitmap = { [BITS_TO_LONGS(NR__CPUS)] = 0},
> drivers/infiniband/hw/hfi1/sdma.c: .max_size = NR_CPUS,
> init/init_task.c: .nr_cpus_allowed= NR_CPUS,
> kernel/cgroup/cpuset.c: .max_write_len = (100U + 6 * NR_CPUS),
> kernel/cgroup/cpuset.c: .max_write_len = (100U + 6 * NR_CPUS),
> kernel/sysctl.c: .maxlen = NR_CPUS,
>
> It also seems it might be more sensible as:
>
> $line !~ /^.\s*\.\w+\s*=\s*.*\bNR_CPUS\b/

Aha, this is better!
Will send a v2 patch including this if you don't mind, Thanks.

>
> Which finds a couple more:
>
> $ git grep -P '^\s*\.\w+\s*=\s*.*\bNR_CPUS\b'
> arch/arm64/include/asm/processor.h: .fpsimd_cpu = NR_CPUS, \
> arch/powerpc/kernel/prom_init.c: .max_cpus = cpu_to_be32(NR_CPUS), /* number of cores supported */
> drivers/firmware/efi/efi.c: .cpu_bitmap = { [BITS_TO_LONGS(NR_CPUS)] = 0},
> drivers/infiniband/hw/hfi1/sdma.c: .max_size = NR_CPUS,
> init/init_task.c: .nr_cpus_allowed= NR_CPUS,
> kernel/cgroup/cpuset.c: .max_write_len = (100U + 6 * NR_CPUS),
> kernel/cgroup/cpuset.c: .max_write_len = (100U + 6 * NR_CPUS),
> kernel/sysctl.c: .maxlen = NR_CPUS,
>

2020-12-30 07:16:34

by Peng Wang

[permalink] [raw]
Subject: [PATCH v2] checkpatch: ignore warning designated initializers using NR_CPUS

Some max_length wants to hold as large room as possible to
ensure enough size to tackle with the biggest NR_CPUS.
An example below:

kernel/cgroup/cpuset.c:
static struct cftype legacy_files[] = {
{
.name = "cpus",
.seq_show = cpuset_common_seq_show,
.write = cpuset_write_resmask,
.max_write_len = (100U + 6 * NR_CPUS),
.private = FILE_CPULIST,
},
...
}

Signed-off-by: Peng Wang <[email protected]>
---
scripts/checkpatch.pl | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 0008530..fdbbab3 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -7022,12 +7022,15 @@ sub process {

# use of NR_CPUS is usually wrong
# ignore definitions of NR_CPUS and usage to define arrays as likely right
+# ignore designated initializers using NR_CPUS
+
if ($line =~ /\bNR_CPUS\b/ &&
$line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
$line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
$line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
$line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
- $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
+ $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/ &&
+ $line !~ /^.\s*\.\w+\s*=\s*.*\bNR_CPUS\b/)
{
WARN("NR_CPUS",
"usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
--
2.9.5

2020-12-30 12:19:33

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH v2] checkpatch: ignore warning designated initializers using NR_CPUS

On Wed, 2020-12-30 at 15:14 +0800, Peng Wang wrote:
> Some max_length wants to hold as large room as possible to
> ensure enough size to tackle with the biggest NR_CPUS.
> An example below:
>
> kernel/cgroup/cpuset.c:
> static struct cftype legacy_files[] = {
> ????????{
> ????????????????.name = "cpus",
> ????????????????.seq_show = cpuset_common_seq_show,
> ????????????????.write = cpuset_write_resmask,
> ????????????????.max_write_len = (100U + 6 * NR_CPUS),
> ????????????????.private = FILE_CPULIST,
> ????????},
> ...
> }
[]
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
[]
> @@ -7022,12 +7022,15 @@ sub process {
> ?
>
> ?# use of NR_CPUS is usually wrong
> ?# ignore definitions of NR_CPUS and usage to define arrays as likely right
> +# ignore designated initializers using NR_CPUS
> +

Please remove this empty line, other than that, looks OK to me.

Andrew? Care to take this and remove the empty line or wait for v3?

> ? if ($line =~ /\bNR_CPUS\b/ &&
> ? $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
> ? $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
> ? $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
> ? $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
> - $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
> + $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/ &&
> + $line !~ /^.\s*\.\w+\s*=\s*.*\bNR_CPUS\b/)
> ? {
> ? WARN("NR_CPUS",
> ? "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);


2020-12-30 12:31:41

by Peng Wang

[permalink] [raw]
Subject: [PATCH v3] checkpatch: ignore warning designated initializers using NR_CPUS

Some max_length wants to hold as large room as possible to
ensure enough size to tackle with the biggest NR_CPUS.
An example below:

kernel/cgroup/cpuset.c:
static struct cftype legacy_files[] = {
{
.name = "cpus",
.seq_show = cpuset_common_seq_show,
.write = cpuset_write_resmask,
.max_write_len = (100U + 6 * NR_CPUS),
.private = FILE_CPULIST,
},
...
}

Signed-off-by: Peng Wang <[email protected]>
---
scripts/checkpatch.pl | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 92e888e..6f112fb 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -7028,12 +7028,14 @@ sub process {

# use of NR_CPUS is usually wrong
# ignore definitions of NR_CPUS and usage to define arrays as likely right
+# ignore designated initializers using NR_CPUS
if ($line =~ /\bNR_CPUS\b/ &&
$line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
$line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
$line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
$line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
- $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
+ $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/ &&
+ $line !~ /^.\s*\.\w+\s*=\s*.*\bNR_CPUS\b/)
{
WARN("NR_CPUS",
"usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
--
2.9.5

2020-12-30 12:43:16

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH v3] checkpatch: ignore warning designated initializers using NR_CPUS

On Wed, 2020-12-30 at 20:29 +0800, Peng Wang wrote:
> Some max_length wants to hold as large room as possible to
> ensure enough size to tackle with the biggest NR_CPUS.
> An example below:
>
> kernel/cgroup/cpuset.c:
> static struct cftype legacy_files[] = {
> ????????{
> ????????????????.name = "cpus",
> ????????????????.seq_show = cpuset_common_seq_show,
> ????????????????.write = cpuset_write_resmask,
> ????????????????.max_write_len = (100U + 6 * NR_CPUS),
> ????????????????.private = FILE_CPULIST,
> ????????},
> ...
> }
>
> Signed-off-by: Peng Wang <[email protected]>
> ---
[]
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
[]
> @@ -7028,12 +7028,14 @@ sub process {
> ?
> ?# use of NR_CPUS is usually wrong
> ?# ignore definitions of NR_CPUS and usage to define arrays as likely right
> +# ignore designated initializers using NR_CPUS
> ? if ($line =~ /\bNR_CPUS\b/ &&
> ? $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
> ? $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
> ? $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
> ? $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
> - $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
> + $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/ &&
> + $line !~ /^.\s*\.\w+\s*=\s*.*\bNR_CPUS\b/)
> ? {
> ? WARN("NR_CPUS",
> ? "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);

Thanks.

Acked-by: Joe Perches <[email protected]>