netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Michael Chan <michael.chan@broadcom.com>
To: davem@davemloft.net
Cc: netdev@vger.kernel.org, Ariel Elior <Ariel.Elior@cavium.com>,
	everest-linux-l2@cavium.com
Subject: [PATCH net-next 1/4] net: Introduce NETIF_F_GRO_HW
Date: Mon,  4 Dec 2017 06:12:44 -0500	[thread overview]
Message-ID: <1512385967-32339-2-git-send-email-michael.chan@broadcom.com> (raw)
In-Reply-To: <1512385967-32339-1-git-send-email-michael.chan@broadcom.com>

Introduce NETIF_F_GRO_HW feature flag for NICs that support hardware
GRO.  With this flag, we can now independently turn on or off hardware
GRO when GRO is on.  Hardware GRO guarantees that packets can be
re-segmented by TSO/GSO to reconstruct the original packet stream.

Cc: Ariel Elior <Ariel.Elior@cavium.com>
Cc: everest-linux-l2@cavium.com
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
---
 Documentation/networking/netdev-features.txt |  7 +++++++
 include/linux/netdev_features.h              |  5 ++++-
 net/core/dev.c                               | 13 +++++++++++++
 net/core/ethtool.c                           |  1 +
 4 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/Documentation/networking/netdev-features.txt b/Documentation/networking/netdev-features.txt
index 7413eb0..d76d332 100644
--- a/Documentation/networking/netdev-features.txt
+++ b/Documentation/networking/netdev-features.txt
@@ -163,3 +163,10 @@ This requests that the NIC receive all possible frames, including errored
 frames (such as bad FCS, etc).  This can be helpful when sniffing a link with
 bad packets on it.  Some NICs may receive more packets if also put into normal
 PROMISC mode.
+
+*  rx-gro-hw
+
+This requests that the NIC enables Hardware GRO (generic receive offload).
+Hardware GRO is basically the exact reverse of TSO, and is generally
+stricter than Hardware LRO.  A packet stream merged by Hardware GRO must
+be re-segmentable by GSO or TSO back to the exact packet stream.
diff --git a/include/linux/netdev_features.h b/include/linux/netdev_features.h
index dc8b489..d18ef6f 100644
--- a/include/linux/netdev_features.h
+++ b/include/linux/netdev_features.h
@@ -77,6 +77,8 @@ enum {
 	NETIF_F_HW_ESP_TX_CSUM_BIT,	/* ESP with TX checksum offload */
 	NETIF_F_RX_UDP_TUNNEL_PORT_BIT, /* Offload of RX port for UDP tunnels */
 
+	NETIF_F_GRO_HW_BIT,		/* Hardware Generic receive offload */
+
 	/*
 	 * Add your fresh new feature above and remember to update
 	 * netdev_features_strings[] in net/core/ethtool.c and maybe
@@ -96,6 +98,7 @@ enum {
 #define NETIF_F_FRAGLIST	__NETIF_F(FRAGLIST)
 #define NETIF_F_FSO		__NETIF_F(FSO)
 #define NETIF_F_GRO		__NETIF_F(GRO)
+#define NETIF_F_GRO_HW		__NETIF_F(GRO_HW)
 #define NETIF_F_GSO		__NETIF_F(GSO)
 #define NETIF_F_GSO_ROBUST	__NETIF_F(GSO_ROBUST)
 #define NETIF_F_HIGHDMA		__NETIF_F(HIGHDMA)
@@ -193,7 +196,7 @@ enum {
  * If upper/master device has these features disabled, they must be disabled
  * on all lower/slave devices as well.
  */
-#define NETIF_F_UPPER_DISABLES	NETIF_F_LRO
+#define NETIF_F_UPPER_DISABLES	(NETIF_F_LRO | NETIF_F_GRO_HW)
 
 /* changeable features with no special hardware requirements */
 #define NETIF_F_SOFT_FEATURES	(NETIF_F_GSO | NETIF_F_GRO)
diff --git a/net/core/dev.c b/net/core/dev.c
index 30b5fe3..09c2ad0 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -7392,6 +7392,19 @@ static netdev_features_t netdev_fix_features(struct net_device *dev,
 		features &= ~dev->gso_partial_features;
 	}
 
+	if (features & NETIF_F_GRO_HW) {
+		/* Hardware GRO depends on GRO. */
+		if (!(features & NETIF_F_GRO)) {
+			netdev_dbg(dev, "Dropping NETIF_F_GSO_HW since no GRO feature.\n");
+			features &= ~NETIF_F_GRO_HW;
+		}
+		/* Hardware GRO and LRO are mutually exclusive. */
+		if (features & NETIF_F_LRO) {
+			netdev_dbg(dev, "Dropping NETIF_F_LRO since GRO_HW is set.\n");
+			features &= ~NETIF_F_LRO;
+		}
+	}
+
 	return features;
 }
 
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index f8fcf45..50a7920 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -73,6 +73,7 @@ int ethtool_op_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
 	[NETIF_F_LLTX_BIT] =             "tx-lockless",
 	[NETIF_F_NETNS_LOCAL_BIT] =      "netns-local",
 	[NETIF_F_GRO_BIT] =              "rx-gro",
+	[NETIF_F_GRO_HW_BIT] =           "rx-gro-hw",
 	[NETIF_F_LRO_BIT] =              "rx-lro",
 
 	[NETIF_F_TSO_BIT] =              "tx-tcp-segmentation",
-- 
1.8.3.1

  reply	other threads:[~2017-12-04 11:13 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-04 11:12 [PATCH net-next 0/4] Introduce NETIF_F_GRO_HW Michael Chan
2017-12-04 11:12 ` Michael Chan [this message]
2017-12-04 16:30   ` [PATCH net-next 1/4] net: " Or Gerlitz
2017-12-04 16:47   ` Alexander Duyck
2017-12-04 18:23     ` Michael Chan
2017-12-04 18:43       ` Alexander Duyck
2017-12-04 18:59         ` David Miller
2017-12-04 19:24           ` Alexander Duyck
2017-12-04 19:26           ` Eric Dumazet
2017-12-04 19:36             ` Alexander Duyck
2017-12-04 19:52         ` Michael Chan
2017-12-04 20:58           ` Alexander Duyck
2017-12-04 23:05             ` Michael Chan
2017-12-04 22:15   ` Yuval Mintz
2017-12-04 22:31     ` Michael Chan
2017-12-04 11:12 ` [PATCH net-next 2/4] bnxt_en: Use NETIF_F_GRO_HW Michael Chan
2017-12-04 16:35   ` Or Gerlitz
2017-12-04 18:11     ` Michael Chan
2017-12-04 21:06       ` Or Gerlitz
2017-12-04 22:00         ` Eric Dumazet
2017-12-05  0:07           ` Michael Chan
2017-12-05 18:10             ` Marcelo Ricardo Leitner
2017-12-06 21:04               ` Michael Chan
2017-12-04 11:12 ` [PATCH net-next 3/4] bnx2x: " Michael Chan
2017-12-04 11:12 ` [PATCH net-next 4/4] qede: " Michael Chan
2017-12-04 21:48   ` Yuval Mintz
2017-12-04 22:45     ` Michael Chan
2017-12-05 12:32       ` Chopra, Manish
2017-12-05 17:13         ` Michael Chan
2017-12-04 11:38 ` [PATCH net-next 0/4] Introduce NETIF_F_GRO_HW Elior, Ariel
2017-12-05 19:31 ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1512385967-32339-2-git-send-email-michael.chan@broadcom.com \
    --to=michael.chan@broadcom.com \
    --cc=Ariel.Elior@cavium.com \
    --cc=davem@davemloft.net \
    --cc=everest-linux-l2@cavium.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).