Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1918355imu; Fri, 14 Dec 2018 02:53:34 -0800 (PST) X-Google-Smtp-Source: AFSGD/V9DJY9hgRp/WTGF96YqefJXY3I/9DK0pX4+hh4ZCNkW6hmYDK5J2hDHkAUez+2YyJAVZwr X-Received: by 2002:a63:3f89:: with SMTP id m131mr2319794pga.115.1544784814782; Fri, 14 Dec 2018 02:53:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544784814; cv=none; d=google.com; s=arc-20160816; b=c7jIAzTkQA1AnCUB0ceTAyCkJiehjCWhF67Q5zdIbtC6iGNXqeivLeT8mOzkI68sMR sfLBRHC28J/YGCSrkY/pCFl9G4CAfwR7yxoi/X/n6lCPhZ9+YjE62HgV3EnP8iH46u4O H+tSaXti2CkJCasn46fg37Og8idYVSIDa9Kn38tfbnyb3j1EP7/iPBbkIo0Lruzn6VZJ BLc/IBT58X0MpoJb2LZIEcGJTkQYZmgIsx81nEL678oER/di4gwiBDb+VZnsfvNIO3xR petvnMf8PIAlVWW4WAA45+b4yUASeP1lmQia3xf8WiEqnueCwGP8tp332kic6XrYw/u8 1fJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=8S1cuMFb4wco+3bcOHk+Xls8mC1T/amK+Q44Y5PoW4c=; b=lJklg9UMdgYNFbme41yiP/lACGtyOnzyo1hT41BrADTKwdHZ1+FsK5AmgDKUSiY/IZ tIPtkheXbsJK9ujEkNqFhLb6ywx28SXMCh8SeIUESbbPERLqLApm47t+CV3FtCAEL3TE GnfS6SIehSOmBROJHMQ42o/m+/xZg9z1feVYgXaiI5PioGDfYuqvxlUbH9Zi7eFbMg7g kk6gdSkcJj+rhpEG7AtZgwIpCUqcm2fWu2wsoIRIWHeLftmrUZ+OC6gnKQSnpUuCFG/Q 7XP6pfDvH8WyHKeudX22T1rsgLsOIjaKmuiJD7IcBTgTAALT+QeyXm0kndjZUda7YTQp YSbA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i64si3717095pge.361.2018.12.14.02.53.19; Fri, 14 Dec 2018 02:53:34 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729615AbeLNKw0 (ORCPT + 99 others); Fri, 14 Dec 2018 05:52:26 -0500 Received: from mx1.redhat.com ([209.132.183.28]:48490 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729465AbeLNKwY (ORCPT ); Fri, 14 Dec 2018 05:52:24 -0500 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A06BD624D4; Fri, 14 Dec 2018 10:52:23 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.32.181.131]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3621026FA9; Fri, 14 Dec 2018 10:52:22 +0000 (UTC) From: Paolo Abeni To: netdev@vger.kernel.org Cc: "David S. Miller" , Eric Dumazet , Paul Turner , linux-kernel@vger.kernel.org, Edward Cree , David Woodhouse Subject: [PATCH net-next v3 2/4] net: use indirect call wrappers at GRO network layer Date: Fri, 14 Dec 2018 11:51:58 +0100 Message-Id: <474aeb75910dd195d9f11cfd27e5afbc666caf52.1544784419.git.pabeni@redhat.com> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 14 Dec 2018 10:52:23 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This avoids an indirect calls for L3 GRO receive path, both for ipv4 and ipv6, if the latter is not compiled as a module. Note that when IPv6 is compiled as builtin, it will be checked first, so we have a single additional compare for the more common path. v1 -> v2: - adapted to INDIRECT_CALL_ changes Signed-off-by: Paolo Abeni --- include/net/inet_common.h | 2 ++ net/core/dev.c | 15 +++++++++++++-- net/ipv6/ip6_offload.c | 6 +++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/include/net/inet_common.h b/include/net/inet_common.h index 3ca969cbd161..56e7592811ea 100644 --- a/include/net/inet_common.h +++ b/include/net/inet_common.h @@ -2,6 +2,8 @@ #ifndef _INET_COMMON_H #define _INET_COMMON_H +#include + extern const struct proto_ops inet_stream_ops; extern const struct proto_ops inet_dgram_ops; diff --git a/net/core/dev.c b/net/core/dev.c index ed9aa4a91f1f..1b5a4410be0e 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -145,6 +145,7 @@ #include #include #include +#include #include "net-sysfs.h" @@ -5338,6 +5339,8 @@ static void flush_all_backlogs(void) put_online_cpus(); } +INDIRECT_CALLABLE_DECLARE(int inet_gro_complete(struct sk_buff *, int)); +INDIRECT_CALLABLE_DECLARE(int ipv6_gro_complete(struct sk_buff *, int)); static int napi_gro_complete(struct sk_buff *skb) { struct packet_offload *ptype; @@ -5357,7 +5360,9 @@ static int napi_gro_complete(struct sk_buff *skb) if (ptype->type != type || !ptype->callbacks.gro_complete) continue; - err = ptype->callbacks.gro_complete(skb, 0); + err = INDIRECT_CALL_INET(ptype->callbacks.gro_complete, + ipv6_gro_complete, inet_gro_complete, + skb, 0); break; } rcu_read_unlock(); @@ -5504,6 +5509,10 @@ static void gro_flush_oldest(struct list_head *head) napi_gro_complete(oldest); } +INDIRECT_CALLABLE_DECLARE(struct sk_buff *inet_gro_receive(struct list_head *, + struct sk_buff *)); +INDIRECT_CALLABLE_DECLARE(struct sk_buff *ipv6_gro_receive(struct list_head *, + struct sk_buff *)); static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb) { u32 hash = skb_get_hash_raw(skb) & (GRO_HASH_BUCKETS - 1); @@ -5553,7 +5562,9 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff NAPI_GRO_CB(skb)->csum_valid = 0; } - pp = ptype->callbacks.gro_receive(gro_head, skb); + pp = INDIRECT_CALL_INET(ptype->callbacks.gro_receive, + ipv6_gro_receive, inet_gro_receive, + gro_head, skb); break; } rcu_read_unlock(); diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c index 70f525c33cb6..ff8b484d2258 100644 --- a/net/ipv6/ip6_offload.c +++ b/net/ipv6/ip6_offload.c @@ -164,8 +164,8 @@ static int ipv6_exthdrs_len(struct ipv6hdr *iph, return len; } -static struct sk_buff *ipv6_gro_receive(struct list_head *head, - struct sk_buff *skb) +INDIRECT_CALLABLE_SCOPE struct sk_buff *ipv6_gro_receive(struct list_head *head, + struct sk_buff *skb) { const struct net_offload *ops; struct sk_buff *pp = NULL; @@ -301,7 +301,7 @@ static struct sk_buff *ip4ip6_gro_receive(struct list_head *head, return inet_gro_receive(head, skb); } -static int ipv6_gro_complete(struct sk_buff *skb, int nhoff) +INDIRECT_CALLABLE_SCOPE int ipv6_gro_complete(struct sk_buff *skb, int nhoff) { const struct net_offload *ops; struct ipv6hdr *iph = (struct ipv6hdr *)(skb->data + nhoff); -- 2.19.2