From patchwork Wed Oct 4 17:48:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Dumazet X-Patchwork-Id: 821418 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="czjppaAi"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3y6k0T4yrSz9t7H for ; Thu, 5 Oct 2017 04:48:41 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751169AbdJDRsi (ORCPT ); Wed, 4 Oct 2017 13:48:38 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:38428 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751133AbdJDRsh (ORCPT ); Wed, 4 Oct 2017 13:48:37 -0400 Received: by mail-pf0-f194.google.com with SMTP id a7so12865974pfj.5 for ; Wed, 04 Oct 2017 10:48:37 -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=JqLaXXycWaIjN0LXm1Y8N0ScTHmJfRP5DZVNJkV62O0=; b=czjppaAimZbJP/eeZc4JLYgMh3Sb3YE3pz3WdA563yGleNZ49uVm9jcTRNt/yhwZYo NsBZoeOdlBjCOV1fFfxiCkeY7gu0xQGsKhmah9ER11SUX0cgAbsf2jb9UU8+fpD/Nqgp 0MyzW+jYbq61zRXZ6PczdT6WMLrEsusOzcYl9KXIZVqxgGx4zhrc3J51NcRSIp8EP4tP 3dCJ7TQHsReNN59NjkgpnOLMPDwC97YKnWYy8j5u7fPOz3lSCKGk6fmdrB6yMEOW5X48 SpfjWreMWKewoXfNlxZnhl3tMVsY/ulql8tqV2dtY47jV4wYtQw/f2mHwKYj6GqBtRI4 hrjg== 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=JqLaXXycWaIjN0LXm1Y8N0ScTHmJfRP5DZVNJkV62O0=; b=aKzbAue9ooipcTlbOwUHzW/HeAUnMHjuTEVNNA960HFqeDkqnpptdhUPt65Q5ih2j5 +4ZMqmX1iTZRGZxr1VVv972FXGLQ4mQxU5HqsiXzCoA+eY16QsMo8kGd1htIVKnms0AF 6S1KzlLl2wOmOiFtsmiGFlVn81Lm6SaI3Qg70Hbdb4Kk0FEuLWC8OGi4/o/9Vl/gebsA F/kPrS9WifQNMLQ2diTrq3YKVW75T1CecoUIT92bCxPm5t+CNSo0bnPz9uI5gJA8tPUr VGJBKeVbxV3sWs1rZPHRhUVFdjIWfKDgn87QkoWomInvGUCS2gURXG63vxaijYVe8Llv Y+Qw== X-Gm-Message-State: AMCzsaUfT4CrQWvil+1oTOtQszn8vQeu4Irm+RVcsAqP+R5eF6006WeQ FX/n5cX1kHrf1lfA8TMfENU= X-Google-Smtp-Source: AOwi7QB6xMeI7BvhmAtH8eUapBDAGaOazqxbMXicNKUVpp66R6sr+bPRot3Ad7mM9iI1SNR55fYP3w== X-Received: by 10.99.127.78 with SMTP id p14mr4789883pgn.176.1507139317152; Wed, 04 Oct 2017 10:48:37 -0700 (PDT) Received: from ?IPv6:2620:15c:2c1:100:5489:4fe8:8908:1c88? ([2620:15c:2c1:100:5489:4fe8:8908:1c88]) by smtp.googlemail.com with ESMTPSA id b63sm25871844pga.27.2017.10.04.10.48.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 04 Oct 2017 10:48:36 -0700 (PDT) Message-ID: <1507139315.14419.5.camel@edumazet-glaptop3.roam.corp.google.com> Subject: [PATCH net-next] net: cache skb_shinfo() in skb_try_coalesce() From: Eric Dumazet To: David Miller Cc: netdev Date: Wed, 04 Oct 2017 10:48:35 -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 Compiler does not really know that skb_shinfo(to|from) are constants in skb_try_coalesce(), lets cache their values to shrink code. We might even take care of skb_zcopy() calls later. $ size net/core/skbuff.o.before net/core/skbuff.o text data bss dec hex filename 40727 1298 0 42025 a429 net/core/skbuff.o.before 40631 1298 0 41929 a3c9 net/core/skbuff.o Signed-off-by: Eric Dumazet --- net/core/skbuff.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/net/core/skbuff.c b/net/core/skbuff.c index d98c2e3ce2bfd9549647d6914b69cecd840de480..822a90e56aea2078a11d5361a2b2595812291274 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -4767,6 +4767,7 @@ EXPORT_SYMBOL(kfree_skb_partial); bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from, bool *fragstolen, int *delta_truesize) { + struct skb_shared_info *to_shinfo, *from_shinfo; int i, delta, len = from->len; *fragstolen = false; @@ -4781,7 +4782,9 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from, return true; } - if (skb_has_frag_list(to) || skb_has_frag_list(from)) + to_shinfo = skb_shinfo(to); + from_shinfo = skb_shinfo(from); + if (to_shinfo->frag_list || from_shinfo->frag_list) return false; if (skb_zcopy(to) || skb_zcopy(from)) return false; @@ -4790,8 +4793,8 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from, struct page *page; unsigned int offset; - if (skb_shinfo(to)->nr_frags + - skb_shinfo(from)->nr_frags >= MAX_SKB_FRAGS) + if (to_shinfo->nr_frags + + from_shinfo->nr_frags >= MAX_SKB_FRAGS) return false; if (skb_head_is_locked(from)) @@ -4802,12 +4805,12 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from, page = virt_to_head_page(from->head); offset = from->data - (unsigned char *)page_address(page); - skb_fill_page_desc(to, skb_shinfo(to)->nr_frags, + skb_fill_page_desc(to, to_shinfo->nr_frags, page, offset, skb_headlen(from)); *fragstolen = true; } else { - if (skb_shinfo(to)->nr_frags + - skb_shinfo(from)->nr_frags > MAX_SKB_FRAGS) + if (to_shinfo->nr_frags + + from_shinfo->nr_frags > MAX_SKB_FRAGS) return false; delta = from->truesize - SKB_TRUESIZE(skb_end_offset(from)); @@ -4815,19 +4818,19 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from, WARN_ON_ONCE(delta < len); - memcpy(skb_shinfo(to)->frags + skb_shinfo(to)->nr_frags, - skb_shinfo(from)->frags, - skb_shinfo(from)->nr_frags * sizeof(skb_frag_t)); - skb_shinfo(to)->nr_frags += skb_shinfo(from)->nr_frags; + memcpy(to_shinfo->frags + to_shinfo->nr_frags, + from_shinfo->frags, + from_shinfo->nr_frags * sizeof(skb_frag_t)); + to_shinfo->nr_frags += from_shinfo->nr_frags; if (!skb_cloned(from)) - skb_shinfo(from)->nr_frags = 0; + from_shinfo->nr_frags = 0; /* if the skb is not cloned this does nothing * since we set nr_frags to 0. */ - for (i = 0; i < skb_shinfo(from)->nr_frags; i++) - skb_frag_ref(from, i); + for (i = 0; i < from_shinfo->nr_frags; i++) + __skb_frag_ref(&from_shinfo->frags[i]); to->truesize += delta; to->len += len;