lkml.org 
[lkml]   [2020]   [May]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 190/312] ipv4: do not abuse GFP_ATOMIC in inet_netconf_notify_devconf()
    Date
    From: Eric Dumazet <edumazet@google.com>

    commit fa17806cde76fb1087532f07e72aa757a30e0500 upstream.

    inet_forward_change() runs with RTNL held.
    We are allowed to sleep if required.

    If we use __in_dev_get_rtnl() instead of __in_dev_get_rcu(),
    we no longer have to use GFP_ATOMIC allocations in
    inet_netconf_notify_devconf(), meaning we are less likely to miss
    notifications under memory pressure, and wont touch precious memory
    reserves either and risk dropping incoming packets.

    inet_netconf_get_devconf() can also use GFP_KERNEL allocation.

    Fixes: edc9e748934c ("rtnl/ipv4: use netconf msg to advertise forwarding status")
    Fixes: 9e5511106f99 ("rtnl/ipv4: add support of RTM_GETNETCONF")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Cc: Nicolas Dichtel <nicolas.dichtel@6wind.com>
    Acked-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    net/ipv4/devinet.c | 12 ++++++------
    1 file changed, 6 insertions(+), 6 deletions(-)

    --- a/net/ipv4/devinet.c
    +++ b/net/ipv4/devinet.c
    @@ -1814,7 +1814,7 @@ void inet_netconf_notify_devconf(struct
    struct sk_buff *skb;
    int err = -ENOBUFS;

    - skb = nlmsg_new(inet_netconf_msgsize_devconf(type), GFP_ATOMIC);
    + skb = nlmsg_new(inet_netconf_msgsize_devconf(type), GFP_KERNEL);
    if (!skb)
    goto errout;

    @@ -1826,7 +1826,7 @@ void inet_netconf_notify_devconf(struct
    kfree_skb(skb);
    goto errout;
    }
    - rtnl_notify(skb, net, 0, RTNLGRP_IPV4_NETCONF, NULL, GFP_ATOMIC);
    + rtnl_notify(skb, net, 0, RTNLGRP_IPV4_NETCONF, NULL, GFP_KERNEL);
    return;
    errout:
    if (err < 0)
    @@ -1883,7 +1883,7 @@ static int inet_netconf_get_devconf(stru
    }

    err = -ENOBUFS;
    - skb = nlmsg_new(inet_netconf_msgsize_devconf(-1), GFP_ATOMIC);
    + skb = nlmsg_new(inet_netconf_msgsize_devconf(-1), GFP_KERNEL);
    if (!skb)
    goto errout;

    @@ -2007,16 +2007,16 @@ static void inet_forward_change(struct n

    for_each_netdev(net, dev) {
    struct in_device *in_dev;
    +
    if (on)
    dev_disable_lro(dev);
    - rcu_read_lock();
    - in_dev = __in_dev_get_rcu(dev);
    +
    + in_dev = __in_dev_get_rtnl(dev);
    if (in_dev) {
    IN_DEV_CONF_SET(in_dev, FORWARDING, on);
    inet_netconf_notify_devconf(net, NETCONFA_FORWARDING,
    dev->ifindex, &in_dev->cnf);
    }
    - rcu_read_unlock();
    }
    }


    \
     
     \ /
      Last update: 2020-05-08 15:16    [W:4.237 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site