On Mon, Feb 17, 2025 at 09:18:42AM +0000, Wei Yang wrote:
> On Mon, Feb 17, 2025 at 04:02:53PM +0800, Alan Huang wrote:
> >On Feb 17, 2025, at 15:41, Wei Yang <richard.weiy...@gmail.com> wrote:
> >> 
> >> On Mon, Feb 17, 2025 at 10:22:53AM +0800, Alan Huang wrote:
> >>> On Feb 17, 2025, at 10:12, Boqun Feng <boqun.f...@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.weiy...@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.weiy...@gmail.com>
> >>>> Link: 
> >>>> https://lore.kernel.org/r/20250101082306.10404-1-richard.weiy...@gmail.com
> >>>> Signed-off-by: Boqun Feng <boqun.f...@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.
> >
> >This example is intended to highlight how we can eliminate stale data.
> >
> 
> Yes, you are more accurate.
> 
> >> 
> >> 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.
> >
> >Then the example code should return e instead. ( *key is also undefined)
> >
> 
> So you prefer a version with e returned?
> 
> Boqun
> 
> What's your preference?
> 

Yeah, I think it make more sense with e returned, and you can add some
comments at the return statement like:

        return e; // as long as the lock of e is held, e is valid.

, but feel free to use whatever you see fit.

Regards,
Boqun

> >If you have some time, I´d recommend [1]
> >
> >[1] Using Read-Copy-Update Techniques for System V IPC in the Linux 2.5
> >Kernel
> >
> 
> Thanks, would take a look.
> 
> >> 
> >> 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
> >
> 
> -- 
> Wei Yang
> Help you, Help me

Reply via email to