* [PATCH v2] RISC-V: Fix /proc/cpuinfo cpumask warning
@ 2022-10-12 8:29 Andrew Jones
2022-10-12 8:42 ` Anup Patel
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Andrew Jones @ 2022-10-12 8:29 UTC (permalink / raw)
To: linux-riscv, linux-kernel
Cc: Palmer Dabbelt, Paul Walmsley, Albert Ou, Yury Norov
Commit 78e5a3399421 ("cpumask: fix checking valid cpu range") has
started issuing warnings[*] when cpu indices equal to nr_cpu_ids - 1
are passed to cpumask_next* functions. seq_read_iter() and cpuinfo's
start and next seq operations implement a pattern like
n = cpumask_next(n - 1, mask);
show(n);
while (1) {
++n;
n = cpumask_next(n - 1, mask);
if (n >= nr_cpu_ids)
break;
show(n);
}
which will issue the warning when reading /proc/cpuinfo. Ensure no
warning is generated by validating the cpu index before calling
cpumask_next().
[*] Warnings will only appear with DEBUG_PER_CPU_MAPS enabled.
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
Cc: Yury Norov <yury.norov@gmail.com>
---
v2:
- Got comments on the x86 equivalent patch and made the same
changes to this one
- Added all the information I should have in the first place
to the commit message [Boris]
- Changed style of fix [Boris]
arch/riscv/kernel/cpu.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/arch/riscv/kernel/cpu.c b/arch/riscv/kernel/cpu.c
index 4aa8cd749441..63138b880b92 100644
--- a/arch/riscv/kernel/cpu.c
+++ b/arch/riscv/kernel/cpu.c
@@ -166,6 +166,9 @@ static void print_mmu(struct seq_file *f)
static void *c_start(struct seq_file *m, loff_t *pos)
{
+ if (*pos >= nr_cpu_ids)
+ return NULL;
+
*pos = cpumask_next(*pos - 1, cpu_online_mask);
if ((*pos) < nr_cpu_ids)
return (void *)(uintptr_t)(1 + *pos);
--
2.37.3
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v2] RISC-V: Fix /proc/cpuinfo cpumask warning 2022-10-12 8:29 [PATCH v2] RISC-V: Fix /proc/cpuinfo cpumask warning Andrew Jones @ 2022-10-12 8:42 ` Anup Patel 2022-10-12 9:08 ` Conor Dooley 2022-10-12 12:55 ` Yury Norov 2 siblings, 0 replies; 6+ messages in thread From: Anup Patel @ 2022-10-12 8:42 UTC (permalink / raw) To: Andrew Jones Cc: linux-riscv, linux-kernel, Palmer Dabbelt, Paul Walmsley, Albert Ou, Yury Norov On Wed, Oct 12, 2022 at 1:59 PM Andrew Jones <ajones@ventanamicro.com> wrote: > > Commit 78e5a3399421 ("cpumask: fix checking valid cpu range") has > started issuing warnings[*] when cpu indices equal to nr_cpu_ids - 1 > are passed to cpumask_next* functions. seq_read_iter() and cpuinfo's > start and next seq operations implement a pattern like > > n = cpumask_next(n - 1, mask); > show(n); > while (1) { > ++n; > n = cpumask_next(n - 1, mask); > if (n >= nr_cpu_ids) > break; > show(n); > } > > which will issue the warning when reading /proc/cpuinfo. Ensure no > warning is generated by validating the cpu index before calling > cpumask_next(). > > [*] Warnings will only appear with DEBUG_PER_CPU_MAPS enabled. > > Signed-off-by: Andrew Jones <ajones@ventanamicro.com> > Cc: Yury Norov <yury.norov@gmail.com> Looks good to me. Reviewed-by: Anup Patel <anup@brainfault.org> Regards, Anup > --- > v2: > - Got comments on the x86 equivalent patch and made the same > changes to this one > - Added all the information I should have in the first place > to the commit message [Boris] > - Changed style of fix [Boris] > > > arch/riscv/kernel/cpu.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/arch/riscv/kernel/cpu.c b/arch/riscv/kernel/cpu.c > index 4aa8cd749441..63138b880b92 100644 > --- a/arch/riscv/kernel/cpu.c > +++ b/arch/riscv/kernel/cpu.c > @@ -166,6 +166,9 @@ static void print_mmu(struct seq_file *f) > > static void *c_start(struct seq_file *m, loff_t *pos) > { > + if (*pos >= nr_cpu_ids) > + return NULL; > + > *pos = cpumask_next(*pos - 1, cpu_online_mask); > if ((*pos) < nr_cpu_ids) > return (void *)(uintptr_t)(1 + *pos); > -- > 2.37.3 > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] RISC-V: Fix /proc/cpuinfo cpumask warning 2022-10-12 8:29 [PATCH v2] RISC-V: Fix /proc/cpuinfo cpumask warning Andrew Jones 2022-10-12 8:42 ` Anup Patel @ 2022-10-12 9:08 ` Conor Dooley 2022-10-12 12:55 ` Yury Norov 2 siblings, 0 replies; 6+ messages in thread From: Conor Dooley @ 2022-10-12 9:08 UTC (permalink / raw) To: Andrew Jones Cc: linux-riscv, linux-kernel, Palmer Dabbelt, Paul Walmsley, Albert Ou, Yury Norov On Wed, Oct 12, 2022 at 10:29:49AM +0200, Andrew Jones wrote: > Commit 78e5a3399421 ("cpumask: fix checking valid cpu range") has > started issuing warnings[*] when cpu indices equal to nr_cpu_ids - 1 > are passed to cpumask_next* functions. seq_read_iter() and cpuinfo's > start and next seq operations implement a pattern like > > n = cpumask_next(n - 1, mask); > show(n); > while (1) { > ++n; > n = cpumask_next(n - 1, mask); > if (n >= nr_cpu_ids) > break; > show(n); > } > > which will issue the warning when reading /proc/cpuinfo. Ensure no > warning is generated by validating the cpu index before calling > cpumask_next(). > > [*] Warnings will only appear with DEBUG_PER_CPU_MAPS enabled. > > Signed-off-by: Andrew Jones <ajones@ventanamicro.com> > Cc: Yury Norov <yury.norov@gmail.com> Reviewed-by: Conor Dooley <conor.dooley@microchip.com> Tested-by: Conor Dooley <conor.dooley@microchip.com> Thanks > --- > v2: > - Got comments on the x86 equivalent patch and made the same > changes to this one > - Added all the information I should have in the first place > to the commit message [Boris] > - Changed style of fix [Boris] > > > arch/riscv/kernel/cpu.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/arch/riscv/kernel/cpu.c b/arch/riscv/kernel/cpu.c > index 4aa8cd749441..63138b880b92 100644 > --- a/arch/riscv/kernel/cpu.c > +++ b/arch/riscv/kernel/cpu.c > @@ -166,6 +166,9 @@ static void print_mmu(struct seq_file *f) > > static void *c_start(struct seq_file *m, loff_t *pos) > { > + if (*pos >= nr_cpu_ids) > + return NULL; > + > *pos = cpumask_next(*pos - 1, cpu_online_mask); > if ((*pos) < nr_cpu_ids) > return (void *)(uintptr_t)(1 + *pos); > -- > 2.37.3 > ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] RISC-V: Fix /proc/cpuinfo cpumask warning 2022-10-12 8:29 [PATCH v2] RISC-V: Fix /proc/cpuinfo cpumask warning Andrew Jones 2022-10-12 8:42 ` Anup Patel 2022-10-12 9:08 ` Conor Dooley @ 2022-10-12 12:55 ` Yury Norov 2022-10-12 13:13 ` Andrew Jones 2 siblings, 1 reply; 6+ messages in thread From: Yury Norov @ 2022-10-12 12:55 UTC (permalink / raw) To: Andrew Jones Cc: linux-riscv, linux-kernel, Palmer Dabbelt, Paul Walmsley, Albert Ou On Wed, Oct 12, 2022 at 10:29:49AM +0200, Andrew Jones wrote: > Commit 78e5a3399421 ("cpumask: fix checking valid cpu range") has > started issuing warnings[*] when cpu indices equal to nr_cpu_ids - 1 > are passed to cpumask_next* functions. seq_read_iter() and cpuinfo's > start and next seq operations implement a pattern like > > n = cpumask_next(n - 1, mask); > show(n); > while (1) { > ++n; > n = cpumask_next(n - 1, mask); > if (n >= nr_cpu_ids) > break; > show(n); > } Can you instead of sudo-code print show the real control flow? What function hosts the infinite loop? > which will issue the warning when reading /proc/cpuinfo. Ensure no > warning is generated by validating the cpu index before calling > cpumask_next(). > > [*] Warnings will only appear with DEBUG_PER_CPU_MAPS enabled. > > Signed-off-by: Andrew Jones <ajones@ventanamicro.com> > Cc: Yury Norov <yury.norov@gmail.com> > --- > v2: > - Got comments on the x86 equivalent patch and made the same > changes to this one > - Added all the information I should have in the first place > to the commit message [Boris] > - Changed style of fix [Boris] > > > arch/riscv/kernel/cpu.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/arch/riscv/kernel/cpu.c b/arch/riscv/kernel/cpu.c > index 4aa8cd749441..63138b880b92 100644 > --- a/arch/riscv/kernel/cpu.c > +++ b/arch/riscv/kernel/cpu.c > @@ -166,6 +166,9 @@ static void print_mmu(struct seq_file *f) > > static void *c_start(struct seq_file *m, loff_t *pos) > { > + if (*pos >= nr_cpu_ids) > + return NULL; > + > *pos = cpumask_next(*pos - 1, cpu_online_mask); > if ((*pos) < nr_cpu_ids) > return (void *)(uintptr_t)(1 + *pos); OK, as far as I understood your explanations, *pos == nr_cpu_ids is a valid index because it's used as stop-code for traversing. However, you're completely silencing cpumask_check(), including those cases where *pos > nr_cpu_ids. I suspect there's no valid cases for it. If so, the patch should look like: + if (*pos == nr_cpu_ids) + return NULL; + The same for x86 patch. If it comes to v3, can you send both as a series? Thanks, Yury ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] RISC-V: Fix /proc/cpuinfo cpumask warning 2022-10-12 12:55 ` Yury Norov @ 2022-10-12 13:13 ` Andrew Jones 2022-10-12 13:41 ` Yury Norov 0 siblings, 1 reply; 6+ messages in thread From: Andrew Jones @ 2022-10-12 13:13 UTC (permalink / raw) To: Yury Norov Cc: linux-riscv, linux-kernel, Palmer Dabbelt, Paul Walmsley, Albert Ou On Wed, Oct 12, 2022 at 05:55:29AM -0700, Yury Norov wrote: > On Wed, Oct 12, 2022 at 10:29:49AM +0200, Andrew Jones wrote: > > Commit 78e5a3399421 ("cpumask: fix checking valid cpu range") has > > started issuing warnings[*] when cpu indices equal to nr_cpu_ids - 1 > > are passed to cpumask_next* functions. seq_read_iter() and cpuinfo's > > start and next seq operations implement a pattern like > > > > n = cpumask_next(n - 1, mask); > > show(n); > > while (1) { > > ++n; > > n = cpumask_next(n - 1, mask); > > if (n >= nr_cpu_ids) > > break; > > show(n); > > } > > Can you instead of sudo-code print show the real control flow? What > function hosts the infinite loop? The function is seq_read_iter(), which is pointed out above. I'd rather not reproduce / describe more than what I've done here, as the function is large. I'd be happy for reviewers to double check my pseudocode to make sure I got it and the analysis right, though. > > > which will issue the warning when reading /proc/cpuinfo. Ensure no > > warning is generated by validating the cpu index before calling > > cpumask_next(). > > > > [*] Warnings will only appear with DEBUG_PER_CPU_MAPS enabled. > > > > Signed-off-by: Andrew Jones <ajones@ventanamicro.com> > > Cc: Yury Norov <yury.norov@gmail.com> > > --- > > v2: > > - Got comments on the x86 equivalent patch and made the same > > changes to this one > > - Added all the information I should have in the first place > > to the commit message [Boris] > > - Changed style of fix [Boris] > > > > > > arch/riscv/kernel/cpu.c | 3 +++ > > 1 file changed, 3 insertions(+) > > > > diff --git a/arch/riscv/kernel/cpu.c b/arch/riscv/kernel/cpu.c > > index 4aa8cd749441..63138b880b92 100644 > > --- a/arch/riscv/kernel/cpu.c > > +++ b/arch/riscv/kernel/cpu.c > > @@ -166,6 +166,9 @@ static void print_mmu(struct seq_file *f) > > > > static void *c_start(struct seq_file *m, loff_t *pos) > > { > > + if (*pos >= nr_cpu_ids) > > + return NULL; > > + > > *pos = cpumask_next(*pos - 1, cpu_online_mask); > > if ((*pos) < nr_cpu_ids) > > return (void *)(uintptr_t)(1 + *pos); > > OK, as far as I understood your explanations, *pos == nr_cpu_ids > is a valid index because it's used as stop-code for traversing. > > However, you're completely silencing cpumask_check(), including > those cases where *pos > nr_cpu_ids. I suspect there's no valid > cases for it. If so, the patch should look like: > > + if (*pos == nr_cpu_ids) > + return NULL; > + That makes sense and it's probably worth a v3. I'll wait and see if more comments roll in before sending though. > > The same for x86 patch. > > If it comes to v3, can you send both as a series? OK. I'll write a cover letter trying to explain that I don't expect them to both go through the same tree. Thanks, drew ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] RISC-V: Fix /proc/cpuinfo cpumask warning 2022-10-12 13:13 ` Andrew Jones @ 2022-10-12 13:41 ` Yury Norov 0 siblings, 0 replies; 6+ messages in thread From: Yury Norov @ 2022-10-12 13:41 UTC (permalink / raw) To: Andrew Jones Cc: linux-riscv, linux-kernel, Palmer Dabbelt, Paul Walmsley, Albert Ou On Wed, Oct 12, 2022 at 6:13 AM Andrew Jones <ajones@ventanamicro.com> wrote: > > On Wed, Oct 12, 2022 at 05:55:29AM -0700, Yury Norov wrote: > > On Wed, Oct 12, 2022 at 10:29:49AM +0200, Andrew Jones wrote: > > > Commit 78e5a3399421 ("cpumask: fix checking valid cpu range") has > > > started issuing warnings[*] when cpu indices equal to nr_cpu_ids - 1 > > > are passed to cpumask_next* functions. seq_read_iter() and cpuinfo's > > > start and next seq operations implement a pattern like > > > > > > n = cpumask_next(n - 1, mask); > > > show(n); > > > while (1) { > > > ++n; > > > n = cpumask_next(n - 1, mask); > > > if (n >= nr_cpu_ids) > > > break; > > > show(n); > > > } > > > > Can you instead of sudo-code print show the real control flow? What > > function hosts the infinite loop? > > The function is seq_read_iter(), which is pointed out above. I'd rather > not reproduce / describe more than what I've done here, as the function > is large. I'd be happy for reviewers to double check my pseudocode to > make sure I got it and the analysis right, though. > > > > > > which will issue the warning when reading /proc/cpuinfo. Ensure no > > > warning is generated by validating the cpu index before calling > > > cpumask_next(). > > > > > > [*] Warnings will only appear with DEBUG_PER_CPU_MAPS enabled. > > > > > > Signed-off-by: Andrew Jones <ajones@ventanamicro.com> > > > Cc: Yury Norov <yury.norov@gmail.com> > > > --- > > > v2: > > > - Got comments on the x86 equivalent patch and made the same > > > changes to this one > > > - Added all the information I should have in the first place > > > to the commit message [Boris] > > > - Changed style of fix [Boris] > > > > > > > > > arch/riscv/kernel/cpu.c | 3 +++ > > > 1 file changed, 3 insertions(+) > > > > > > diff --git a/arch/riscv/kernel/cpu.c b/arch/riscv/kernel/cpu.c > > > index 4aa8cd749441..63138b880b92 100644 > > > --- a/arch/riscv/kernel/cpu.c > > > +++ b/arch/riscv/kernel/cpu.c > > > @@ -166,6 +166,9 @@ static void print_mmu(struct seq_file *f) > > > > > > static void *c_start(struct seq_file *m, loff_t *pos) > > > { > > > + if (*pos >= nr_cpu_ids) > > > + return NULL; > > > + > > > *pos = cpumask_next(*pos - 1, cpu_online_mask); > > > if ((*pos) < nr_cpu_ids) > > > return (void *)(uintptr_t)(1 + *pos); > > > > OK, as far as I understood your explanations, *pos == nr_cpu_ids > > is a valid index because it's used as stop-code for traversing. > > > > However, you're completely silencing cpumask_check(), including > > those cases where *pos > nr_cpu_ids. I suspect there's no valid > > cases for it. If so, the patch should look like: > > > > + if (*pos == nr_cpu_ids) > > + return NULL; > > + > > That makes sense and it's probably worth a v3. I'll wait and see if more > comments roll in before sending though. > > > > > The same for x86 patch. > > > > If it comes to v3, can you send both as a series? > > OK. I'll write a cover letter trying to explain that I don't expect them > to both go through the same tree. I can take it in my tree, if it helps. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-10-12 13:41 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-10-12 8:29 [PATCH v2] RISC-V: Fix /proc/cpuinfo cpumask warning Andrew Jones 2022-10-12 8:42 ` Anup Patel 2022-10-12 9:08 ` Conor Dooley 2022-10-12 12:55 ` Yury Norov 2022-10-12 13:13 ` Andrew Jones 2022-10-12 13:41 ` Yury Norov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®