[ovs-dev] [PATCH] datapath: Preallocate reply skb in ovs_vport_cmd_set().

Pravin Shelar pshelar at nicira.com
Fri Mar 22 03:08:25 UTC 2013


On Wed, Mar 20, 2013 at 4:44 PM, Jesse Gross <jesse at nicira.com> wrote:
> Allocation of the Netlink notification skb can potentially fail
> after changing vport configuration.  In general, we try to avoid
> this by undoing any change we made but that is difficult for existing
> objects.  This avoids the problem by preallocating the buffer (which
> is fixed size).
>
> Signed-off-by: Jesse Gross <jesse at nicira.com>
> ---
>  datapath/datapath.c |   23 +++++++++++++++--------
>  1 file changed, 15 insertions(+), 8 deletions(-)
>
> diff --git a/datapath/datapath.c b/datapath/datapath.c
> index b5eb232..88f5371 100644
> --- a/datapath/datapath.c
> +++ b/datapath/datapath.c
> @@ -2005,10 +2005,16 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info)
>             nla_get_u32(a[OVS_VPORT_ATTR_TYPE]) != vport->ops->type)
>                 err = -EINVAL;
>
> +       reply = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
> +       if (!reply) {
> +               err = -ENOMEM;
> +               goto exit_unlock;
> +       }
> +
>         if (!err && a[OVS_VPORT_ATTR_OPTIONS])
>                 err = ovs_vport_set_options(vport, a[OVS_VPORT_ATTR_OPTIONS]);
>         if (err)
> -               goto exit_unlock;
> +               goto exit_free;
>
>         if (a[OVS_VPORT_ATTR_STATS])
>                 ovs_vport_set_stats(vport, nla_data(a[OVS_VPORT_ATTR_STATS]));
> @@ -2016,17 +2022,18 @@ static int ovs_vport_cmd_set(struct sk_buff *skb, struct genl_info *info)
>         if (a[OVS_VPORT_ATTR_UPCALL_PID])
>                 vport->upcall_portid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]);
>
> -       reply = ovs_vport_cmd_build_info(vport, info->snd_portid,
> -                                        info->snd_seq, OVS_VPORT_CMD_NEW);
> -       if (IS_ERR(reply)) {
> -               netlink_set_err(GENL_SOCK(sock_net(skb->sk)), 0,
> -                               ovs_dp_vport_multicast_group.id, PTR_ERR(reply));
> -               goto exit_unlock;
> -       }
> +       err = ovs_vport_cmd_fill_info(vport, reply, info->snd_portid,
> +                                     info->snd_seq, 0, OVS_VPORT_CMD_NEW);
> +       BUG_ON(err < 0);
>
I am not sure about BUG_ON() ?
ovs_vport_cmd_build_info() does not have this assert.

>         genl_notify(reply, genl_info_net(info), info->snd_portid,
>                     ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL);
>
> +       rtnl_unlock();
> +       return 0;
> +
> +exit_free:
> +       kfree_skb(reply);
>  exit_unlock:
>         rtnl_unlock();
>  exit:
> --
> 1.7.10.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list