From: Wei Yang <richard.weiyang@gmail.com>
To: Alan Huang <mmpgouride@gmail.com>
Cc: Boqun Feng <boqun.feng@gmail.com>,
Wei Yang <richard.weiyang@gmail.com>,
paulmck@kernel.org, frederic@kernel.org,
neeraj.upadhyay@kernel.org, rcu@vger.kernel.org,
linux-doc@vger.kernel.org
Subject: Re: [PATCH] doc/RCU/listRCU: fix an example code snippets
Date: Mon, 17 Feb 2025 07:41:00 +0000 [thread overview]
Message-ID: <20250217074100.2wyy6akdr2j464wx@master> (raw)
In-Reply-To: <CDB3A2E0-A891-491E-9F7D-F09843F1A3E3@gmail.com>
On Mon, Feb 17, 2025 at 10:22:53AM +0800, Alan Huang wrote:
>On Feb 17, 2025, at 10:12, Boqun Feng <boqun.feng@gmail.com> wrote:
>>
>> Hi Wei,
>>
>> The change loosk good to me, thanks!
>>
>> I queued the patch for futher reviews and tests with some changes in the
>> commit log (for title formating and a bit more explanation), please see
>> below.
>>
>> Regards,
>> Boqun
>>
>> On Wed, Jan 01, 2025 at 08:23:06AM +0000, Wei Yang wrote:
>>> The example code for "Eliminating Stale Data" looks not correct:
>>>
>>> * rcu_read_unlock() should put after kstrdup()
>>> * spin_unlock() should be called before return
>>>
>>> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
>> [...]
>>
>>
>> ------------------>8
>> Subject: [PATCH] doc/RCU/listRCU: Fix an example code snippets
>>
>> The example code for "Eliminating Stale Data" looks not correct:
>>
>> * rcu_read_unlock() should put after kstrdup(), because otherwise
>> entry may get freed while kstrdup() is being called.
>>
>> * spin_unlock() should be called before return, otherwise the
>> function would return with the lock of the entry held.
>>
>> Hence fix these.
>>
>> Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
>> Link: https://lore.kernel.org/r/20250101082306.10404-1-richard.weiyang@gmail.com
>> Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
>> ---
>> Documentation/RCU/listRCU.rst | 3 ++-
>> 1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/Documentation/RCU/listRCU.rst b/Documentation/RCU/listRCU.rst
>> index ed5c9d8c9afe..8df50fcd69fd 100644
>> --- a/Documentation/RCU/listRCU.rst
>> +++ b/Documentation/RCU/listRCU.rst
>> @@ -348,9 +348,10 @@ to accomplish this would be to add a ``deleted`` flag and a ``lock`` spinlock to
>> rcu_read_unlock();
>> return AUDIT_BUILD_CONTEXT;
>> }
>> - rcu_read_unlock();
>> if (state == AUDIT_STATE_RECORD)
>> *key = kstrdup(e->rule.filterkey, GFP_ATOMIC);
>> + spin_unlock(&e->lock);
>
>According to the above quick quiz, we should return with the lock held.
>
Thanks, I think you have some reason.
If my understanding is correct, the example here is to emphasize we could
still access the value out of critical section but with spinlock held.
In current example, we don't return e(struct audit_entry) from
audit_filter_task(). So no one suppose to release the spinlock again. This
looks to be a mistake.
My suggestion is to release the lock after kstrdup() to make the example more
intact. But with a comment to explain the purpose here.
Also I found we miss the second parameter key here.
diff --git a/Documentation/RCU/listRCU.rst b/Documentation/RCU/listRCU.rst
index ed5c9d8c9afe..a3e7f8ff3a81 100644
--- a/Documentation/RCU/listRCU.rst
+++ b/Documentation/RCU/listRCU.rst
@@ -334,7 +334,7 @@ If the system-call audit module were to ever need to reject stale data, one way
to accomplish this would be to add a ``deleted`` flag and a ``lock`` spinlock to the
``audit_entry`` structure, and modify audit_filter_task() as follows::
- static enum audit_state audit_filter_task(struct task_struct *tsk)
+ static enum audit_state audit_filter_task(struct task_struct *tsk, char **key)
{
struct audit_entry *e;
enum audit_state state;
@@ -349,8 +349,11 @@ to accomplish this would be to add a ``deleted`` flag and a ``lock`` spinlock to
return AUDIT_BUILD_CONTEXT;
}
rcu_read_unlock();
+ /* With spinlock held, it is ok to access 'e' out
+ * of critial section */
if (state == AUDIT_STATE_RECORD)
*key = kstrdup(e->rule.filterkey, GFP_ATOMIC);
+ spin_unlock(&e->lock);
return state;
}
}
Does it make sense to you?
--
Wei Yang
Help you, Help me
next prev parent reply other threads:[~2025-02-17 7:41 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-01 8:23 [PATCH] doc/RCU/listRCU: fix an example code snippets Wei Yang
2025-01-23 1:48 ` Wei Yang
2025-02-17 2:12 ` Boqun Feng
2025-02-17 2:22 ` Alan Huang
2025-02-17 2:35 ` Boqun Feng
2025-02-17 7:41 ` Wei Yang [this message]
2025-02-17 8:02 ` Alan Huang
2025-02-17 9:18 ` Wei Yang
2025-02-17 22:30 ` Boqun Feng
2025-02-18 0:25 ` Wei Yang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250217074100.2wyy6akdr2j464wx@master \
--to=richard.weiyang@gmail.com \
--cc=boqun.feng@gmail.com \
--cc=frederic@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=mmpgouride@gmail.com \
--cc=neeraj.upadhyay@kernel.org \
--cc=paulmck@kernel.org \
--cc=rcu@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox