From patchwork Wed Mar 15 20:21:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 739431 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vk3B95dKyz9ryk for ; Thu, 16 Mar 2017 07:29:53 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="IgOt5Cu4"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753612AbdCOU3w (ORCPT ); Wed, 15 Mar 2017 16:29:52 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:35513 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753368AbdCOU3u (ORCPT ); Wed, 15 Mar 2017 16:29:50 -0400 Received: by mail-pf0-f195.google.com with SMTP id x63so3166699pfx.2 for ; Wed, 15 Mar 2017 13:29:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:subject:from:to:cc:date:mime-version :content-transfer-encoding; bh=h/idOCycWysyPbnLSpaQoJovTNOry8thv2J/LxMAMHs=; b=IgOt5Cu4MxRhOmcPyODV6VJQw9i7zHRXlL2yYjBP2RuCs5Pso6eP5QtEygN0+2lc69 0sl7tLGWgb48WOsfEeGZeiSo+BsOb04287sFodNh9mGsfcJk5jb2AFyjRW4Pkkvj9piF +pgGpsyxXvZOZBQyduo7M+d/p4AbUX9ZE+LFv2sD4S9/zR/iNtmnOn67drR1GoQSGLWh D3bcSYVtRXCy8qmxUOKPrZoQdEVqmnfySp7xZTVHd5M9+HVVI2sC/LouO5jUA3JCXp0W 1n9F8UbRZBsfckf43b9n6zdvAL5QMisEM1vYMZoMYLObsk7eZt2vyi2zc9b4VijfST7d dfgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:mime-version :content-transfer-encoding; bh=h/idOCycWysyPbnLSpaQoJovTNOry8thv2J/LxMAMHs=; b=GPNqHA6FP6ZWKT/h+H5awwr/ubehl67kNGt2HuaAmLab4BSsR5UkOTR+3bS+WSejmg eZla9+sqigXN7R/6soQnodkyr4DZCKsmpIEW+foioAPPhXETo4N/Bmt2QWKtzWBAwwXH 6PGAzi1pXDWLKWMKUTRf4Seq3bVpUqJp0VaKRirYPdMNJC9XalOaS177QjnwwRH1OtHW se02Up8feNjPbfBHTI+5f4Wtz8qvb7mLapj+u9N8jGtFBGuqn+QJQNagbARmN+MeZTY8 jfzJ3j3hTYpWNanedOH5I/DyAWju+8BJS7mkw4C8wSulPy2v+Vqsc5ABe8te5lCujhgF fPvQ== X-Gm-Message-State: AFeK/H1yWwH9z+diRx7hxdHtJe/eK3As9z4BWKLPqjlMs/9H22OL2bmse4uGvkaG1hqiSQ== X-Received: by 10.84.228.201 with SMTP id y9mr7067540pli.42.1489609289898; Wed, 15 Mar 2017 13:21:29 -0700 (PDT) Received: from ?IPv6:2620:0:1000:1704:e9b7:c1ef:e9e4:a3fb? ([2620:0:1000:1704:e9b7:c1ef:e9e4:a3fb]) by smtp.googlemail.com with ESMTPSA id d199sm5918912pfd.107.2017.03.15.13.21.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 15 Mar 2017 13:21:29 -0700 (PDT) Message-ID: <1489609288.28631.161.camel@edumazet-glaptop3.roam.corp.google.com> Subject: [PATCH net] net: properly release sk_frag.page From: Eric Dumazet To: David Miller Cc: netdev Date: Wed, 15 Mar 2017 13:21:28 -0700 X-Mailer: Evolution 3.10.4-0ubuntu2 Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Eric Dumazet 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 --- 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 a96d5f7a5734a52dfd6a2df8490c7bd7f5f6599a..acb0d413749968f24ffc7df3e366b095f80e10f4 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1442,6 +1442,11 @@ static void __sk_destruct(struct rcu_head *head) 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); @@ -2787,11 +2792,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);