lkml.org 
[lkml]   [2017]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.10 178/250] net: properly release sk_frag.page
    Date
    From: Eric Dumazet <edumazet@google.com>

    commit 22a0e18eac7a9e986fec76c60fa4a2926d1291e2 upstream.

    I mistakenly added the code to release sk->sk_frag in
    sk_common_release() instead of sk_destruct()

    TCP sockets using sk->sk_allocation == GFP_ATOMIC do no call
    sk_common_release() at close time, thus leaking one (order-3) page.

    iSCSI is using such sockets.

    Fixes: 5640f7685831 ("net: use a per task frag allocator")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Willy Tarreau <w@1wt.eu>
    ---
    net/core/sock.c | 10 +++++-----
    1 file changed, 5 insertions(+), 5 deletions(-)

    diff --git a/net/core/sock.c b/net/core/sock.c
    index e3cb454..96e1259 100644
    --- a/net/core/sock.c
    +++ b/net/core/sock.c
    @@ -1403,6 +1403,11 @@ static void __sk_free(struct sock *sk)
    pr_debug("%s: optmem leakage (%d bytes) detected\n",
    __func__, atomic_read(&sk->sk_omem_alloc));

    + if (sk->sk_frag.page) {
    + put_page(sk->sk_frag.page);
    + sk->sk_frag.page = NULL;
    + }
    +
    if (sk->sk_peer_cred)
    put_cred(sk->sk_peer_cred);
    put_pid(sk->sk_peer_pid);
    @@ -2556,11 +2561,6 @@ void sk_common_release(struct sock *sk)

    sk_refcnt_debug_release(sk);

    - if (sk->sk_frag.page) {
    - put_page(sk->sk_frag.page);
    - sk->sk_frag.page = NULL;
    - }
    -
    sock_put(sk);
    }
    EXPORT_SYMBOL(sk_common_release);
    --
    2.8.0.rc2.1.gbe9624a
    \
     
     \ /
      Last update: 2017-06-12 01:14    [W:4.015 / U:0.304 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site