• Guillaume Nault's avatar
    netns: fix GFP flags in rtnl_net_notifyid() · d4e4fdf9
    Guillaume Nault authored
    In rtnl_net_notifyid(), we certainly can't pass a null GFP flag to
    rtnl_notify(). A GFP_KERNEL flag would be fine in most circumstances,
    but there are a few paths calling rtnl_net_notifyid() from atomic
    context or from RCU critical sections. The later also precludes the use
    of gfp_any() as it wouldn't detect the RCU case. Also, the nlmsg_new()
    call is wrong too, as it uses GFP_KERNEL unconditionally.
    
    Therefore, we need to pass the GFP flags as parameter and propagate it
    through function calls until the proper flags can be determined.
    
    In most cases, GFP_KERNEL is fine. The exceptions are:
      * openvswitch: ovs_vport_cmd_get() and ovs_vport_cmd_dump()
        indirectly call rtnl_net_notifyid() from RCU critical section,
    
      * rtnetlink: rtmsg_ifinfo_build_skb() already receives GFP flags as
        parameter.
    
    Also, in ovs_vport_cmd_build_info(), let's change the GFP flags used
    by nlmsg_new(). The function is allowed to sleep, so better make the
    flags consistent with the ones used in the following
    ovs_vport_cmd_fill_info() call.
    
    Found by code inspection.
    
    Fixes: 9a963454 ("netns: notify netns id events")
    Signed-off-by: default avatarGuillaume Nault <gnault@redhat.com>
    Acked-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
    Acked-by: default avatarPravin B Shelar <pshelar@ovn.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    d4e4fdf9
Name
Last commit
Last update
..
Kconfig Loading commit data...
Makefile Loading commit data...
actions.c Loading commit data...
conntrack.c Loading commit data...
conntrack.h Loading commit data...
datapath.c Loading commit data...
datapath.h Loading commit data...
dp_notify.c Loading commit data...
flow.c Loading commit data...
flow.h Loading commit data...
flow_netlink.c Loading commit data...
flow_netlink.h Loading commit data...
flow_table.c Loading commit data...
flow_table.h Loading commit data...
meter.c Loading commit data...
meter.h Loading commit data...
vport-geneve.c Loading commit data...
vport-gre.c Loading commit data...
vport-internal_dev.c Loading commit data...
vport-internal_dev.h Loading commit data...
vport-netdev.c Loading commit data...
vport-netdev.h Loading commit data...
vport-vxlan.c Loading commit data...
vport.c Loading commit data...
vport.h Loading commit data...