From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D00C2C43381 for ; Mon, 25 Mar 2019 09:27:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9F5D02085A for ; Mon, 25 Mar 2019 09:27:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WzjKrQf7" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730221AbfCYJ1T (ORCPT ); Mon, 25 Mar 2019 05:27:19 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:41725 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729597AbfCYJ1T (ORCPT ); Mon, 25 Mar 2019 05:27:19 -0400 Received: by mail-wr1-f67.google.com with SMTP id r4so1510465wrq.8 for ; Mon, 25 Mar 2019 02:27:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=8HPZmpvwzAx1JVye0kp/VTl5EeVGBLniNfwrEH7vKJc=; b=WzjKrQf7og+w503nYynrkoHSyizkcsVKp/PoRdnf1yVmCPDVx2qRMRRCWy4t0W5zNE ts35AVB7s8PkD7nLGftWYktpjKus94UWFa2+SkzuLqg9jB2v9ziJM5veZDgWPl8d7CLb 0jsDLHh14aHstvAp65lyxdJAVBtJU2a6rI+8l1UqZnnj+K2ApDtNjkSqTRweRby+7aDl RmnXDz7ie1F+Af0+Hs9g9G5Yd4JCElXw2qOKABUnU0qfhbTxTgrVU3AQMBDNEBeRim8E sSz3aryi8DTrXQqWIqfVC+/2+pmstgmnBABEFbHDk1B7hCOD2Psuc1toICtXqoaoHClB FUPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=8HPZmpvwzAx1JVye0kp/VTl5EeVGBLniNfwrEH7vKJc=; b=BYVk5na2Z45cqcM+r/RCrc+DdFDQZGo6XZD3iPbeijWEXkQ9rM0OSfbSz1aOpIOAfG H7zO7zccx/6/we9vw2lAJRAjDpJ/4hKUKWqqdyVQGw489aJmnm0POwT9hEVt8ubqTQ1I kYUf9QHDh9ohbSD5fcrzmstO4OOxNHBLfdAXlmLUDLfgxS/Arvbew5qYr7yGt41nG+2u TCqMzJLR80LmRhK22elsrsr1R0gTvN9WZ4FyZxIuOMkh8HIepu2I1S86xSsz0rj9fNqL oA+m3SBeulfdaRlhBHVV+OsMPsTZ+y57B3KQ2WzT1cEUwwEzeCju53qYPIuhmERUPu9X fLig== X-Gm-Message-State: APjAAAXrSxDSxfFmHtA+H0onCLBM7NQEOCVjoBU8Mf5XBmL91+YcCFEE DDhQWxKOx04w0df4/Y4B7gKR6dwk X-Google-Smtp-Source: APXvYqyTFv+74Xo7CpomTlyx38E0IPwME2I69yNXYFEAOqxxlcaExrmSzyxEPeiadwuujFd8d9rWhg== X-Received: by 2002:adf:f488:: with SMTP id l8mr14709738wro.213.1553506037558; Mon, 25 Mar 2019 02:27:17 -0700 (PDT) Received: from [192.168.8.147] (59.86.136.77.rev.sfr.net. [77.136.86.59]) by smtp.gmail.com with ESMTPSA id k9sm16943439wru.55.2019.03.25.02.27.16 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 25 Mar 2019 02:27:16 -0700 (PDT) Subject: Re: [PATCH v3] net: use bulk free in kfree_skb_list To: Felix Fietkau , netdev@vger.kernel.org Cc: davem@davemloft.net, brouer@redhat.com, fw@strlen.de, pabeni@redhat.com References: <20190325091456.54285-1-nbd@nbd.name> From: Eric Dumazet Message-ID: <5d973ed2-1915-a87d-d10f-6a0f68240ac0@gmail.com> Date: Mon, 25 Mar 2019 02:27:14 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20190325091456.54285-1-nbd@nbd.name> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On 03/25/2019 02:14 AM, Felix Fietkau wrote: > Since we're freeing multiple skbs, we might as well use bulk free to save a > few cycles. Use the same conditions for bulk free as in napi_consume_skb. > > Signed-off-by: Felix Fietkau > --- > v3: reorder checks to prevent skb double unref > v2: call kmem_cache_free_bulk once the skb array is full instead of > falling back to kfree_skb > net/core/skbuff.c | 40 ++++++++++++++++++++++++++++++++++++---- > 1 file changed, 36 insertions(+), 4 deletions(-) > > diff --git a/net/core/skbuff.c b/net/core/skbuff.c > index 2415d9cb9b89..ca0308485669 100644 > --- a/net/core/skbuff.c > +++ b/net/core/skbuff.c > @@ -666,12 +666,44 @@ EXPORT_SYMBOL(kfree_skb); > > void kfree_skb_list(struct sk_buff *segs) > { > - while (segs) { > - struct sk_buff *next = segs->next; > + struct sk_buff *next = segs; > + void *skbs[16]; > + int n_skbs = 0; > > - kfree_skb(segs); > - segs = next; > + while ((segs = next) != NULL) { > + next = segs->next; > + > + if (segs->fclone != SKB_FCLONE_UNAVAILABLE) { > + kfree_skb(segs); > + continue; > + } > + > + if (!skb_unref(segs)) > + continue; > + > + trace_kfree_skb(segs, __builtin_return_address(0)); > + > + /* drop skb->head and call any destructors for packet */ > + skb_release_all(segs); > + > +#ifdef CONFIG_SLUB > + /* SLUB writes into objects when freeing */ > + prefetchw(segs); > +#endif This is done too late : You should probably either remove this prefetchw() or do it before reading segs->next at the beginning of the loop. > + > + skbs[n_skbs++] = segs; > + > + if (n_skbs < ARRAY_SIZE(skbs)) > + continue; > + > + kmem_cache_free_bulk(skbuff_head_cache, n_skbs, skbs); > + n_skbs = 0; > } > + > + if (!n_skbs) > + return; > + > + kmem_cache_free_bulk(skbuff_head_cache, n_skbs, skbs); > } > EXPORT_SYMBOL(kfree_skb_list); > >