Re: [PATCH] Fixing warning of directly dereferencing __rcu tagged

From: Abhinav Singh
Date: Thu Oct 26 2023 - 08:18:43 EST


On 10/26/23 05:20, Andrew Morton wrote:
On Thu, 26 Oct 2023 04:57:42 +0530 Abhinav Singh <singhabhinav9051571833@xxxxxxxxx> wrote:

On 10/26/23 04:08, Andrew Morton wrote:
+++ b/kernel/fork.c
@@ -2369,7 +2369,9 @@ __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 &&
+ const struct cred *real_cred = rcu_dereference(p->real_cred);
+
+ if (real_cred && real_cred->user != INIT_USER &&
!capable(CAP_SYS_RESOURCE) && !capable(CAP_SYS_ADMIN))
goto bad_fork_cleanup_count;

The old code assumes that p->read_cred cannot be NULL and the new code
does nothing to make it possible that `real_cred' can be NULL?

In other words, I see no reason to add this new check for NULL?

Thank you for the response!

I thought it will be better to have check before accessing it, just so
we dont have any segmentation fault in future.

That would be adding code which has no effect?

Also I just noticed there are two more places where direct dereferencing
of __rcu pointer is done in this same file. Should I do those changes in
this patch ?

I don't see why. rcu_dereference(p) cannot return NULL if `p' is non-NULL?

From 598bf82b611a9af96c5d412855957e378523f529 Mon Sep 17 00:00:00 2001
From: Abhinav Singh <singhabhinav9051571833@xxxxxxxxx>
Date: Tue, 24 Oct 2023 15:24:52 +0530
Subject: [PATCH] Fixing warning cast removes address space '__iomem' of
expression

This patch fixes sparse complaining about the removal of __iomem address
space when casting the return value of this function ioremap_cache(...)
from `void __ioremap*` to `void*`.

I think there are two way of fixing it, first one is changing the
datatype of variable `ghcb_va` from `void*` to `void __iomem*` .
Second way of fixing it is using the memremap(...) which is
done in this patch.

Signed-off-by: Abhinav Singh <singhabhinav9051571833@xxxxxxxxx>
---
arch/x86/hyperv/hv_init.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
index 21556ad87f4b..c14161add274 100644
--- a/arch/x86/hyperv/hv_init.c
+++ b/arch/x86/hyperv/hv_init.c
@@ -70,7 +70,7 @@ static int hyperv_init_ghcb(void)

/* Mask out vTOM bit. ioremap_cache() maps decrypted */
ghcb_gpa &= ~ms_hyperv.shared_gpa_boundary;
- ghcb_va = (void *)ioremap_cache(ghcb_gpa, HV_HYP_PAGE_SIZE);
+ ghcb_va = memremap(ghcb_gpa, HV_HYP_PAGE_SIZE, MEMREMAP_WB);
if (!ghcb_va)
return -ENOMEM;

--
2.39.2