[ovs-dev] [PATCH] datapath: Convert dp rcu read operation to locked operations

Andy Zhou azhou at nicira.com
Tue Nov 4 20:39:10 UTC 2014


Looks good.  Acked-by: Andy Zhou <azhou at nicira.com>

It would be to nice add more details to the commit message. The actual
problem occurs when ovs_dp_name() is called.

In the long run, it would be nice to add lock depends to
lookup_datapath. It seems all the use cases requires mutex to be held
to prevent related data structures, such as vport list, from changing.

On Wed, Oct 29, 2014 at 2:45 AM, Pravin B Shelar <pshelar at nicira.com> wrote:
> dp read operations depends on ovs_dp_cmd_fill_info(). This API
> needs to looup vport to find dp name, but vport lookup can
> fail. Therefore to keep vport reference alive we need to
> take ovs lock.
>
> Found by code inspection.
>
> Signed-off-by: Pravin B Shelar <pshelar at nicira.com>
> ---
>  datapath/datapath.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/datapath/datapath.c b/datapath/datapath.c
> index 6820a95..5fc036c 100644
> --- a/datapath/datapath.c
> +++ b/datapath/datapath.c
> @@ -1332,7 +1332,7 @@ static size_t ovs_dp_cmd_msg_size(void)
>         return msgsize;
>  }
>
> -/* Called with ovs_mutex or RCU read lock. */
> +/* Called with ovs_mutex. */
>  static int ovs_dp_cmd_fill_info(struct datapath *dp, struct sk_buff *skb,
>                                 u32 portid, u32 seq, u32 flags, u8 cmd)
>  {
> @@ -1618,7 +1618,7 @@ static int ovs_dp_cmd_get(struct sk_buff *skb, struct genl_info *info)
>         if (!reply)
>                 return -ENOMEM;
>
> -       rcu_read_lock();
> +       ovs_lock();
>         dp = lookup_datapath(sock_net(skb->sk), info->userhdr, info->attrs);
>         if (IS_ERR(dp)) {
>                 err = PTR_ERR(dp);
> @@ -1627,7 +1627,7 @@ static int ovs_dp_cmd_get(struct sk_buff *skb, struct genl_info *info)
>         err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid,
>                                    info->snd_seq, 0, OVS_DP_CMD_NEW);
>         BUG_ON(err < 0);
> -       rcu_read_unlock();
> +       ovs_unlock();
>
>         return genlmsg_reply(reply, info);
>
> @@ -1644,8 +1644,8 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb)
>         int skip = cb->args[0];
>         int i = 0;
>
> -       rcu_read_lock();
> -       list_for_each_entry_rcu(dp, &ovs_net->dps, list_node) {
> +       ovs_lock();
> +       list_for_each_entry(dp, &ovs_net->dps, list_node) {
>                 if (i >= skip &&
>                     ovs_dp_cmd_fill_info(dp, skb, NETLINK_CB(cb->skb).portid,
>                                          cb->nlh->nlmsg_seq, NLM_F_MULTI,
> @@ -1653,7 +1653,7 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb)
>                         break;
>                 i++;
>         }
> -       rcu_read_unlock();
> +       ovs_unlock();
>
>         cb->args[0] = i;
>
> --
> 1.9.3
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list