kernel/fork.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
This patch fixes the warning about directly dereferencing a pointer
tagged with __rcu annotation.
Dereferencing the pointers tagged with __rcu directly should
always be avoided according to the docs. There is a rcu helper
functions rcu_dereference(...) to use when dereferencing a __rcu
pointer. This functions returns the non __rcu tagged pointer which
can be dereferenced just like a normal pointers.
Signed-off-by: Abhinav Singh <singhabhinav9051571833@gmail.com>
---
kernel/fork.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/fork.c b/kernel/fork.c
index 10917c3e1f03..802b7bbe3d92 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -2369,7 +2369,7 @@ __latent_entropy struct task_struct *copy_process(
retval = -EAGAIN;
if (is_rlimit_overlimit(task_ucounts(p), UCOUNT_RLIMIT_NPROC, rlimit(RLIMIT_NPROC))) {
- if (p->real_cred->user != INIT_USER &&
+ if (rcu_dereference(p->real_cred)->user != INIT_USER &&
!capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN))
goto bad_fork_cleanup_count;
}
@@ -2692,7 +2692,7 @@ __latent_entropy struct task_struct *copy_process(
*/
p->signal->has_child_subreaper = p->real_parent->signal->has_child_subreaper ||
p->real_parent->signal->is_child_subreaper;
- list_add_tail(&p->sibling, &p->real_parent->children);
+ list_add_tail(&p->sibling, &(rcu_dereference(p->real_parent)->children));
list_add_tail_rcu(&p->tasks, &init_task.tasks);
attach_pid(p, PIDTYPE_TGID);
attach_pid(p, PIDTYPE_PGID);
--
2.39.2
On Thu, Oct 26, 2023 at 05:46:21PM +0530, Abhinav Singh wrote:
> This patch fixes the warning about directly dereferencing a pointer
> tagged with __rcu annotation.
>
> Dereferencing the pointers tagged with __rcu directly should
> always be avoided according to the docs. There is a rcu helper
> functions rcu_dereference(...) to use when dereferencing a __rcu
> pointer. This functions returns the non __rcu tagged pointer which
> can be dereferenced just like a normal pointers.
>
> Signed-off-by: Abhinav Singh <singhabhinav9051571833@gmail.com>
Well yes but these need to be called under rcu_read_lock.
Who does it here?
If no one then maybe you found an actual bug and we need to
fix it not paper over it.
> ---
> kernel/fork.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/fork.c b/kernel/fork.c
> index 10917c3e1f03..802b7bbe3d92 100644
> --- a/kernel/fork.c
> +++ b/kernel/fork.c
> @@ -2369,7 +2369,7 @@ __latent_entropy struct task_struct *copy_process(
>
> retval = -EAGAIN;
> if (is_rlimit_overlimit(task_ucounts(p), UCOUNT_RLIMIT_NPROC, rlimit(RLIMIT_NPROC))) {
> - if (p->real_cred->user != INIT_USER &&
> + if (rcu_dereference(p->real_cred)->user != INIT_USER &&
> !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN))
> goto bad_fork_cleanup_count;
> }
> @@ -2692,7 +2692,7 @@ __latent_entropy struct task_struct *copy_process(
> */
> p->signal->has_child_subreaper = p->real_parent->signal->has_child_subreaper ||
> p->real_parent->signal->is_child_subreaper;
> - list_add_tail(&p->sibling, &p->real_parent->children);
> + list_add_tail(&p->sibling, &(rcu_dereference(p->real_parent)->children));
> list_add_tail_rcu(&p->tasks, &init_task.tasks);
> attach_pid(p, PIDTYPE_TGID);
> attach_pid(p, PIDTYPE_PGID);
> --
> 2.39.2
On 10/26/23, Michael S. Tsirkin <mst@redhat.com> wrote: > On Thu, Oct 26, 2023 at 05:46:21PM +0530, Abhinav Singh wrote: >> This patch fixes the warning about directly dereferencing a pointer >> tagged with __rcu annotation. >> >> Dereferencing the pointers tagged with __rcu directly should >> always be avoided according to the docs. There is a rcu helper >> functions rcu_dereference(...) to use when dereferencing a __rcu >> pointer. This functions returns the non __rcu tagged pointer which >> can be dereferenced just like a normal pointers. >> >> Signed-off-by: Abhinav Singh <singhabhinav9051571833@gmail.com> > > Well yes but these need to be called under rcu_read_lock. > Who does it here? > If no one then maybe you found an actual bug and we need to > fix it not paper over it. > There is no bug here. p is the newly created thread, ->real_cred was initialized just prior to this code and there is nobody to whack the creds from under it. Second bit in the patch changes one real_parent deref, but leaves 2 others just above it. Once more no bug since the entire thing happens under tasklist_lock, but the patch should either sort all these cases or none. I think it would help if the submitter had shown warnings they see. -- Mateusz Guzik <mjguzik gmail.com>
On Thu, Oct 26, 2023 at 04:06:24PM +0200, Mateusz Guzik wrote: > On 10/26/23, Michael S. Tsirkin <mst@redhat.com> wrote: > > On Thu, Oct 26, 2023 at 05:46:21PM +0530, Abhinav Singh wrote: > >> This patch fixes the warning about directly dereferencing a pointer > >> tagged with __rcu annotation. > >> > >> Dereferencing the pointers tagged with __rcu directly should > >> always be avoided according to the docs. There is a rcu helper > >> functions rcu_dereference(...) to use when dereferencing a __rcu > >> pointer. This functions returns the non __rcu tagged pointer which > >> can be dereferenced just like a normal pointers. > >> > >> Signed-off-by: Abhinav Singh <singhabhinav9051571833@gmail.com> > > > > Well yes but these need to be called under rcu_read_lock. > > Who does it here? > > If no one then maybe you found an actual bug and we need to > > fix it not paper over it. > > > > There is no bug here. > > p is the newly created thread, ->real_cred was initialized just prior > to this code and there is nobody to whack the creds from under it. > > Second bit in the patch changes one real_parent deref, but leaves 2 > others just above it. Once more no bug since the entire thing happens > under tasklist_lock, but the patch should either sort all these cases > or none. > > I think it would help if the submitter had shown warnings they see. Yes, and this must be tested under lockdep, which I think would spit out warnings for this patch. What should be used here I'm not sure. IIUC rcu_dereference_protected(p, 1) is discouraged now? -- MST
On 10/26/23 20:47, Michael S. Tsirkin wrote: > On Thu, Oct 26, 2023 at 04:06:24PM +0200, Mateusz Guzik wrote: >> On 10/26/23, Michael S. Tsirkin <mst@redhat.com> wrote: >>> On Thu, Oct 26, 2023 at 05:46:21PM +0530, Abhinav Singh wrote: >>>> This patch fixes the warning about directly dereferencing a pointer >>>> tagged with __rcu annotation. >>>> >>>> Dereferencing the pointers tagged with __rcu directly should >>>> always be avoided according to the docs. There is a rcu helper >>>> functions rcu_dereference(...) to use when dereferencing a __rcu >>>> pointer. This functions returns the non __rcu tagged pointer which >>>> can be dereferenced just like a normal pointers. >>>> >>>> Signed-off-by: Abhinav Singh <singhabhinav9051571833@gmail.com> >>> >>> Well yes but these need to be called under rcu_read_lock. >>> Who does it here? >>> If no one then maybe you found an actual bug and we need to >>> fix it not paper over it. >>> >> >> There is no bug here. >> >> p is the newly created thread, ->real_cred was initialized just prior >> to this code and there is nobody to whack the creds from under it. >> >> Second bit in the patch changes one real_parent deref, but leaves 2 >> others just above it. Once more no bug since the entire thing happens >> under tasklist_lock, but the patch should either sort all these cases >> or none. Sparse reported 3 similar dereferencing warning this patch contains 2 fixes for 2, but yeah I should fixed all 3 of them. >> >> I think it would help if the submitter had shown warnings they see. The warning message :- warning: dereference of noderef expression > > Yes, and this must be tested under lockdep, which I think would > spit out warnings for this patch. Not sure, but I tested this with sparse (make C=2) and after the above changes I dont get the warning. > > What should be used here I'm not sure. IIUC rcu_dereference_protected(p, 1) > is discouraged now? > Not sure but I read that, rcu_dereference should be prefered when reading and rcu_dereference_protected should when writing.
On Thu, Oct 26, 2023 at 09:07:46PM +0530, Abhinav Singh wrote: > On 10/26/23 20:47, Michael S. Tsirkin wrote: > > On Thu, Oct 26, 2023 at 04:06:24PM +0200, Mateusz Guzik wrote: > > > On 10/26/23, Michael S. Tsirkin <mst@redhat.com> wrote: > > > > On Thu, Oct 26, 2023 at 05:46:21PM +0530, Abhinav Singh wrote: > > > > > This patch fixes the warning about directly dereferencing a pointer > > > > > tagged with __rcu annotation. > > > > > > > > > > Dereferencing the pointers tagged with __rcu directly should > > > > > always be avoided according to the docs. There is a rcu helper > > > > > functions rcu_dereference(...) to use when dereferencing a __rcu > > > > > pointer. This functions returns the non __rcu tagged pointer which > > > > > can be dereferenced just like a normal pointers. > > > > > > > > > > Signed-off-by: Abhinav Singh <singhabhinav9051571833@gmail.com> > > > > > > > > Well yes but these need to be called under rcu_read_lock. > > > > Who does it here? > > > > If no one then maybe you found an actual bug and we need to > > > > fix it not paper over it. > > > > > > > > > > There is no bug here. > > > > > > p is the newly created thread, ->real_cred was initialized just prior > > > to this code and there is nobody to whack the creds from under it. > > > > > > Second bit in the patch changes one real_parent deref, but leaves 2 > > > others just above it. Once more no bug since the entire thing happens > > > under tasklist_lock, but the patch should either sort all these cases > > > or none. > Sparse reported 3 similar dereferencing warning this patch contains 2 fixes > for 2, but yeah I should fixed all 3 of them. > > > > > > I think it would help if the submitter had shown warnings they see. > The warning message :- warning: dereference of noderef expression > > > > Yes, and this must be tested under lockdep, which I think would > > spit out warnings for this patch. > Not sure, but I tested this with sparse (make C=2) and after the above > changes I dont get the warning. sparse is a static analysis tool. You should also actually test your patch. > > > > What should be used here I'm not sure. IIUC rcu_dereference_protected(p, 1) > > is discouraged now? > > > Not sure but I read that, rcu_dereference should be prefered when reading > and rcu_dereference_protected should when writing.
This patch fixes the warning about directly dereferencing a pointer
tagged with __rcu annotation.
Dereferencing the pointers tagged with __rcu directly should
always be avoided according to the docs. There is a rcu helper
functions rcu_dereference(...) to use when dereferencing a __rcu
pointer. This functions returns the non __rcu tagged pointer which
can be dereferenced just like a normal pointers.
Signed-off-by: Abhinav Singh <singhabhinav9051571833@gmail.com>
---
kernel/fork.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/kernel/fork.c b/kernel/fork.c
index 10917c3e1f03..e78649974669 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -2369,7 +2369,7 @@ __latent_entropy struct task_struct *copy_process(
retval = -EAGAIN;
if (is_rlimit_overlimit(task_ucounts(p), UCOUNT_RLIMIT_NPROC, rlimit(RLIMIT_NPROC))) {
- if (p->real_cred->user != INIT_USER &&
+ if (rcu_dereference(p->real_cred)->user != INIT_USER &&
!capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN))
goto bad_fork_cleanup_count;
}
@@ -2690,9 +2690,9 @@ __latent_entropy struct task_struct *copy_process(
* tasklist_lock with adding child to the process tree
* for propagate_has_child_subreaper optimization.
*/
- p->signal->has_child_subreaper = p->real_parent->signal->has_child_subreaper ||
- p->real_parent->signal->is_child_subreaper;
- list_add_tail(&p->sibling, &p->real_parent->children);
+ p->signal->has_child_subreaper = rcu_dereference(p->real_parent)->signal->has_child_subreaper ||
+ rcu_dereference(p->real_parent)->signal->is_child_subreaper;
+ list_add_tail(&p->sibling, &rcu_dereference(p->real_parent)->children);
list_add_tail_rcu(&p->tasks, &init_task.tasks);
attach_pid(p, PIDTYPE_TGID);
attach_pid(p, PIDTYPE_PGID);
--
2.39.2
On Fri, Oct 27, 2023 at 12:07:13PM +0530, Abhinav Singh wrote:
> This patch fixes the warning about directly dereferencing a pointer
> tagged with __rcu annotation.
>
> Dereferencing the pointers tagged with __rcu directly should
> always be avoided according to the docs. There is a rcu helper
> functions
function
> rcu_dereference(...) to use when dereferencing a __rcu
> pointer.
... inside rcu read side critical sections.
> This functions
function
> returns the non __rcu tagged pointer which
> can be dereferenced just like a normal pointers.
pointer
>
>
Extra empty line here.
Did you test this with lockdep on or did you just build it?
Include info on how the patch was tested pls.
> Signed-off-by: Abhinav Singh <singhabhinav9051571833@gmail.com>
> ---
Changelog?
> kernel/fork.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/kernel/fork.c b/kernel/fork.c
> index 10917c3e1f03..e78649974669 100644
> --- a/kernel/fork.c
> +++ b/kernel/fork.c
> @@ -2369,7 +2369,7 @@ __latent_entropy struct task_struct *copy_process(
>
> retval = -EAGAIN;
> if (is_rlimit_overlimit(task_ucounts(p), UCOUNT_RLIMIT_NPROC, rlimit(RLIMIT_NPROC))) {
> - if (p->real_cred->user != INIT_USER &&
> + if (rcu_dereference(p->real_cred)->user != INIT_USER &&
> !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN))
> goto bad_fork_cleanup_count;
> }
> @@ -2690,9 +2690,9 @@ __latent_entropy struct task_struct *copy_process(
> * tasklist_lock with adding child to the process tree
> * for propagate_has_child_subreaper optimization.
> */
> - p->signal->has_child_subreaper = p->real_parent->signal->has_child_subreaper ||
> - p->real_parent->signal->is_child_subreaper;
> - list_add_tail(&p->sibling, &p->real_parent->children);
> + p->signal->has_child_subreaper = rcu_dereference(p->real_parent)->signal->has_child_subreaper ||
> + rcu_dereference(p->real_parent)->signal->is_child_subreaper;
> + list_add_tail(&p->sibling, &rcu_dereference(p->real_parent)->children);
> list_add_tail_rcu(&p->tasks, &init_task.tasks);
> attach_pid(p, PIDTYPE_TGID);
> attach_pid(p, PIDTYPE_PGID);
It looks like you are calling rcu_dereference outside of
read side critical section and that does not look right to me.
Test with lockdep on.
> --
> 2.39.2
On 10/27/23 12:07, Abhinav Singh wrote:
> This patch fixes the warning about directly dereferencing a pointer
> tagged with __rcu annotation.
>
> Dereferencing the pointers tagged with __rcu directly should
> always be avoided according to the docs. There is a rcu helper
> functions rcu_dereference(...) to use when dereferencing a __rcu
> pointer. This functions returns the non __rcu tagged pointer which
> can be dereferenced just like a normal pointers.
>
>
> Signed-off-by: Abhinav Singh <singhabhinav9051571833@gmail.com>
> ---
> kernel/fork.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/kernel/fork.c b/kernel/fork.c
> index 10917c3e1f03..e78649974669 100644
> --- a/kernel/fork.c
> +++ b/kernel/fork.c
> @@ -2369,7 +2369,7 @@ __latent_entropy struct task_struct *copy_process(
>
> retval = -EAGAIN;
> if (is_rlimit_overlimit(task_ucounts(p), UCOUNT_RLIMIT_NPROC, rlimit(RLIMIT_NPROC))) {
> - if (p->real_cred->user != INIT_USER &&
> + if (rcu_dereference(p->real_cred)->user != INIT_USER &&
> !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN))
> goto bad_fork_cleanup_count;
> }
> @@ -2690,9 +2690,9 @@ __latent_entropy struct task_struct *copy_process(
> * tasklist_lock with adding child to the process tree
> * for propagate_has_child_subreaper optimization.
> */
> - p->signal->has_child_subreaper = p->real_parent->signal->has_child_subreaper ||
> - p->real_parent->signal->is_child_subreaper;
> - list_add_tail(&p->sibling, &p->real_parent->children);
> + p->signal->has_child_subreaper = rcu_dereference(p->real_parent)->signal->has_child_subreaper ||
> + rcu_dereference(p->real_parent)->signal->is_child_subreaper;
> + list_add_tail(&p->sibling, &rcu_dereference(p->real_parent)->children);
> list_add_tail_rcu(&p->tasks, &init_task.tasks);
> attach_pid(p, PIDTYPE_TGID);
> attach_pid(p, PIDTYPE_PGID);
For this particular file I have resolved the rcu pointer dereferencing
issue and I have tested the above by using qemu using this command
qemu-system-x86_64 \
-m 2G \
-smp 2 \
-kernel /home/abhinav/linux_work/linux/arch/x86/boot/bzImage \
-append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" \
-drive file=/home/abhinav/linux_work/boot_images/bullseye.img,format=raw \
-net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 \
-net nic,model=e1000 \
-enable-kvm \
-nographic \
-pidfile vm.pid \
2>&1 | tee vm.log
it booted without any issues.
On Fri, Oct 27, 2023 at 12:11:47PM +0530, Abhinav Singh wrote:
> On 10/27/23 12:07, Abhinav Singh wrote:
> > This patch fixes the warning about directly dereferencing a pointer
> > tagged with __rcu annotation.
> >
> > Dereferencing the pointers tagged with __rcu directly should
> > always be avoided according to the docs.
> There is a rcu helper
> > functions rcu_dereference(...) to use when dereferencing a __rcu
> > pointer. This functions returns the non __rcu tagged pointer which
> > can be dereferenced just like a normal pointers.
> >
> >
> > Signed-off-by: Abhinav Singh <singhabhinav9051571833@gmail.com>
> > ---
> > kernel/fork.c | 8 ++++----
> > 1 file changed, 4 insertions(+), 4 deletions(-)
> >
> > diff --git a/kernel/fork.c b/kernel/fork.c
> > index 10917c3e1f03..e78649974669 100644
> > --- a/kernel/fork.c
> > +++ b/kernel/fork.c
> > @@ -2369,7 +2369,7 @@ __latent_entropy struct task_struct *copy_process(
> > retval = -EAGAIN;
> > if (is_rlimit_overlimit(task_ucounts(p), UCOUNT_RLIMIT_NPROC, rlimit(RLIMIT_NPROC))) {
> > - if (p->real_cred->user != INIT_USER &&
> > + if (rcu_dereference(p->real_cred)->user != INIT_USER &&
> > !capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN))
> > goto bad_fork_cleanup_count;
> > }
> > @@ -2690,9 +2690,9 @@ __latent_entropy struct task_struct *copy_process(
> > * tasklist_lock with adding child to the process tree
> > * for propagate_has_child_subreaper optimization.
> > */
> > - p->signal->has_child_subreaper = p->real_parent->signal->has_child_subreaper ||
> > - p->real_parent->signal->is_child_subreaper;
> > - list_add_tail(&p->sibling, &p->real_parent->children);
> > + p->signal->has_child_subreaper = rcu_dereference(p->real_parent)->signal->has_child_subreaper ||
> > + rcu_dereference(p->real_parent)->signal->is_child_subreaper;
> > + list_add_tail(&p->sibling, &rcu_dereference(p->real_parent)->children);
> > list_add_tail_rcu(&p->tasks, &init_task.tasks);
> > attach_pid(p, PIDTYPE_TGID);
> > attach_pid(p, PIDTYPE_PGID);
>
> For this particular file I have resolved the rcu pointer dereferencing issue
> and I have tested the above by using qemu using this command
> qemu-system-x86_64 \
> -m 2G \
> -smp 2 \
> -kernel /home/abhinav/linux_work/linux/arch/x86/boot/bzImage \
> -append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" \
> -drive file=/home/abhinav/linux_work/boot_images/bullseye.img,format=raw \
> -net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 \
> -net nic,model=e1000 \
> -enable-kvm \
> -nographic \
> -pidfile vm.pid \
> 2>&1 | tee vm.log
> it booted without any issues.
Did you enable lockdep in your kernel?
CONFIG_PROVE_LOCKING and CONFIG_PROVE_RCU in particular.
--
MST
On 2023-10-26 10:06, Mateusz Guzik wrote: > On 10/26/23, Michael S. Tsirkin <mst@redhat.com> wrote: >> On Thu, Oct 26, 2023 at 05:46:21PM +0530, Abhinav Singh wrote: >>> This patch fixes the warning about directly dereferencing a pointer >>> tagged with __rcu annotation. >>> >>> Dereferencing the pointers tagged with __rcu directly should >>> always be avoided according to the docs. There is a rcu helper >>> functions rcu_dereference(...) to use when dereferencing a __rcu >>> pointer. This functions returns the non __rcu tagged pointer which >>> can be dereferenced just like a normal pointers. >>> >>> Signed-off-by: Abhinav Singh <singhabhinav9051571833@gmail.com> >> >> Well yes but these need to be called under rcu_read_lock. >> Who does it here? >> If no one then maybe you found an actual bug and we need to >> fix it not paper over it. >> > > There is no bug here. > > p is the newly created thread, ->real_cred was initialized just prior > to this code and there is nobody to whack the creds from under it. > > Second bit in the patch changes one real_parent deref, but leaves 2 > others just above it. Once more no bug since the entire thing happens > under tasklist_lock, but the patch should either sort all these cases > or none. Drive-by comment: perhaps use rcu_dereference_protected() ? Thanks, Mathieu > > I think it would help if the submitter had shown warnings they see. > -- Mathieu Desnoyers EfficiOS Inc. https://www.efficios.com
On 10/26/23, Mathieu Desnoyers <mathieu.desnoyers@efficios.com> wrote: > Drive-by comment: perhaps use rcu_dereference_protected() ? > Definitely. But as I mentioned even after applying the patch there are uses which should have been reported (and consequently sorted out). If one is to bother with any of this at least the entire file should be covered. -- Mateusz Guzik <mjguzik gmail.com>
© 2016 - 2025 Red Hat, Inc.