]> git.baikalelectronics.ru Git - kernel.git/commit
netns: fix GFP flags in rtnl_net_notifyid()
authorGuillaume Nault <gnault@redhat.com>
Wed, 23 Oct 2019 16:39:04 +0000 (18:39 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 26 Oct 2019 03:14:42 +0000 (20:14 -0700)
commit515305fe8888233b0c6541ebe379701a545b26b1
treee2d2ce489d7a8ee93ae1f2add1e9a73c9ed1aa28
parent585552adb30877f1931697adf84255b89bedccdb
netns: fix GFP flags in rtnl_net_notifyid()

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: 5ef2e8f61334 ("netns: notify netns id events")
Signed-off-by: Guillaume Nault <gnault@redhat.com>
Acked-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Acked-by: Pravin B Shelar <pshelar@ovn.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/net_namespace.h
net/core/dev.c
net/core/net_namespace.c
net/core/rtnetlink.c
net/openvswitch/datapath.c