lkml.org 
[lkml]   [2015]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.13.y-ckt 03/80] openvswitch: Silence RCU lockdep checks from flow lookup.
    Date
    3.13.11-ckt17 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Jesse Gross <jesse@nicira.com>

    commit 663efa3696232300a8ad3a46bb10482fc0b861cf upstream.

    Flow lookup can happen either in packet processing context or userspace
    context but it was annotated as requiring RCU read lock to be held. This
    also allows OVS mutex to be held without causing warnings.

    Reported-by: Justin Pettit <jpettit@nicira.com>
    Signed-off-by: Jesse Gross <jesse@nicira.com>
    Reviewed-by: Thomas Graf <tgraf@redhat.com>
    [ kamal: 3.13-stable prereq for:
    4a46b24 openvswitch: Use exact lookup for flow_get and flow_del. ]
    Cc: Joseph Salisbury <joseph.salisbury@canonical.com>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    net/openvswitch/datapath.c | 3 +--
    net/openvswitch/datapath.h | 2 ++
    net/openvswitch/flow_table.c | 2 +-
    3 files changed, 4 insertions(+), 3 deletions(-)

    diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
    index 6f5e1dd..f6069c6 100644
    --- a/net/openvswitch/datapath.c
    +++ b/net/openvswitch/datapath.c
    @@ -701,8 +701,7 @@ static int ovs_flow_cmd_fill_info(struct sw_flow *flow, struct datapath *dp,
    if (start) {
    const struct sw_flow_actions *sf_acts;

    - sf_acts = rcu_dereference_check(flow->sf_acts,
    - lockdep_ovsl_is_held());
    + sf_acts = rcu_dereference_ovsl(flow->sf_acts);

    err = ovs_nla_put_actions(sf_acts->actions,
    sf_acts->actions_len, skb);
    diff --git a/net/openvswitch/datapath.h b/net/openvswitch/datapath.h
    index 4067ea4..ba13be4 100644
    --- a/net/openvswitch/datapath.h
    +++ b/net/openvswitch/datapath.h
    @@ -145,6 +145,8 @@ int lockdep_ovsl_is_held(void);
    #define ASSERT_OVSL() WARN_ON(unlikely(!lockdep_ovsl_is_held()))
    #define ovsl_dereference(p) \
    rcu_dereference_protected(p, lockdep_ovsl_is_held())
    +#define rcu_dereference_ovsl(p) \
    + rcu_dereference_check(p, lockdep_ovsl_is_held())

    static inline struct net *ovs_dp_get_net(struct datapath *dp)
    {
    diff --git a/net/openvswitch/flow_table.c b/net/openvswitch/flow_table.c
    index e425427..0ddf2bc 100644
    --- a/net/openvswitch/flow_table.c
    +++ b/net/openvswitch/flow_table.c
    @@ -433,7 +433,7 @@ struct sw_flow *ovs_flow_tbl_lookup(struct flow_table *tbl,
    const struct sw_flow_key *key,
    u32 *n_mask_hit)
    {
    - struct table_instance *ti = rcu_dereference(tbl->ti);
    + struct table_instance *ti = rcu_dereference_ovsl(tbl->ti);
    struct sw_flow_mask *mask;
    struct sw_flow *flow;

    --
    1.9.1


    \
     
     \ /
      Last update: 2015-03-20 00:21    [W:4.360 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site