lkml.org 
[lkml]   [2015]   [Dec]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.19.y-ckt 014/164] sit: fix sit0 percpu double allocations
    Date
    3.19.8-ckt11 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Eric Dumazet <edumazet@google.com>

    [ Upstream commit 4ece9009774596ee3df0acba65a324b7ea79387c ]

    sit0 device allocates its percpu storage twice :
    - One time in ipip6_tunnel_init()
    - One time in ipip6_fb_tunnel_init()

    Thus we leak 48 bytes per possible cpu per network namespace dismantle.

    ipip6_fb_tunnel_init() can be much simpler and does not
    return an error, and should be called after register_netdev()

    Note that ipip6_tunnel_clone_6rd() also needs to be called
    after register_netdev() (calling ipip6_tunnel_init())

    Fixes: ebe084aafb7e ("sit: Use ipip6_tunnel_init as the ndo_init function.")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Dmitry Vyukov <dvyukov@google.com>
    Cc: Steffen Klassert <steffen.klassert@secunet.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    net/ipv6/sit.c | 26 ++++----------------------
    1 file changed, 4 insertions(+), 22 deletions(-)

    diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
    index cdbfe5a..eb3ea58 100644
    --- a/net/ipv6/sit.c
    +++ b/net/ipv6/sit.c
    @@ -1395,34 +1395,20 @@ static int ipip6_tunnel_init(struct net_device *dev)
    return 0;
    }

    -static int __net_init ipip6_fb_tunnel_init(struct net_device *dev)
    +static void __net_init ipip6_fb_tunnel_init(struct net_device *dev)
    {
    struct ip_tunnel *tunnel = netdev_priv(dev);
    struct iphdr *iph = &tunnel->parms.iph;
    struct net *net = dev_net(dev);
    struct sit_net *sitn = net_generic(net, sit_net_id);

    - tunnel->dev = dev;
    - tunnel->net = dev_net(dev);
    -
    iph->version = 4;
    iph->protocol = IPPROTO_IPV6;
    iph->ihl = 5;
    iph->ttl = 64;

    - dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
    - if (!dev->tstats)
    - return -ENOMEM;
    -
    - tunnel->dst_cache = alloc_percpu(struct ip_tunnel_dst);
    - if (!tunnel->dst_cache) {
    - free_percpu(dev->tstats);
    - return -ENOMEM;
    - }
    -
    dev_hold(dev);
    rcu_assign_pointer(sitn->tunnels_wc[0], tunnel);
    - return 0;
    }

    static int ipip6_validate(struct nlattr *tb[], struct nlattr *data[])
    @@ -1832,23 +1818,19 @@ static int __net_init sit_init_net(struct net *net)
    */
    sitn->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL;

    - err = ipip6_fb_tunnel_init(sitn->fb_tunnel_dev);
    - if (err)
    - goto err_dev_free;
    -
    - ipip6_tunnel_clone_6rd(sitn->fb_tunnel_dev, sitn);
    err = register_netdev(sitn->fb_tunnel_dev);
    if (err)
    goto err_reg_dev;

    + ipip6_tunnel_clone_6rd(sitn->fb_tunnel_dev, sitn);
    + ipip6_fb_tunnel_init(sitn->fb_tunnel_dev);
    +
    t = netdev_priv(sitn->fb_tunnel_dev);

    strcpy(t->parms.name, sitn->fb_tunnel_dev->name);
    return 0;

    err_reg_dev:
    - dev_put(sitn->fb_tunnel_dev);
    -err_dev_free:
    ipip6_dev_free(sitn->fb_tunnel_dev);
    err_alloc_dev:
    return err;
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-12-02 19:21    [W:6.938 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site