lkml.org 
[lkml]   [2013]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 2/3] rcu: Create rcu_sync infrastructure
    On 10/03, Paul E. McKenney wrote:
    >
    > On Thu, Oct 03, 2013 at 08:47:19PM +0200, Oleg Nesterov wrote:
    > >
    > > Yes, but...
    > >
    > > I think it would be better to start with the patch below, this way
    > > it would be easier a) to add the new ops (we need more anyway) and b)
    > > use CONFIG_PROVE_RCU to avoid the unused members even if this is
    > > really minor.
    >
    > I am fine with this as well, but I don't see the code that checks for
    > the required RCU read-side critical section.

    Because I believe this needs another patch ;) see below, didn't test
    it yet.

    (and yes, until I saw the patch from Peter I didn't realize we already
    have all necessary helpers as functions, somehow I tought that they
    are macros).

    Oleg.

    rcusync: add the CONFIG_PROVE_RCU checks

    CHANGELOG
    ---

    diff --git a/include/linux/rcusync.h b/include/linux/rcusync.h
    index 30c6037..aa7e9e0 100644
    --- a/include/linux/rcusync.h
    +++ b/include/linux/rcusync.h
    @@ -7,6 +7,9 @@
    struct rcu_sync_ops {
    void (*sync)(void);
    void (*call)(struct rcu_head *, void (*)(struct rcu_head *));
    +#ifdef CONFIG_PROVE_RCU
    + bool (*held)(void);
    +#endif
    };

    struct rcu_sync_struct {
    @@ -22,6 +25,9 @@ struct rcu_sync_struct {

    static inline bool rcu_sync_is_idle(struct rcu_sync_struct *rss)
    {
    +#ifdef CONFIG_PROVE_RCU
    + WARN_ON(!rss->ops->held());
    +#endif
    return !rss->gp_state; /* GP_IDLE */
    }

    diff --git a/kernel/rcusync.c b/kernel/rcusync.c
    index 1cefb83..21f191f 100644
    --- a/kernel/rcusync.c
    +++ b/kernel/rcusync.c
    @@ -6,18 +6,27 @@ enum { CB_IDLE = 0, CB_PENDING, CB_REPLAY };

    #define rss_lock gp_wait.lock

    +#ifdef CONFIG_PROVE_RCU
    +#define __INIT_HELD(func) .held = func,
    +#else
    +#define __INIT_HELD(func)
    +#endif
    +
    struct rcu_sync_ops rcu_sync_ops_array[] = {
    [RCU_SYNC] = {
    .sync = synchronize_rcu,
    .call = call_rcu,
    + __INIT_HELD(rcu_read_lock_held)
    },
    [RCU_SCHED_SYNC] = {
    .sync = synchronize_sched,
    .call = call_rcu_sched,
    + __INIT_HELD(rcu_read_lock_sched_held)
    },
    [RCU_BH_SYNC] = {
    .sync = synchronize_rcu_bh,
    .call = call_rcu_bh,
    + __INIT_HELD(rcu_read_lock_bh_held)
    },
    };



    \
     
     \ /
      Last update: 2013-10-03 22:01    [W:4.842 / U:0.236 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site