net: Introduce NETIF_F_GRO_HW.
authorMichael Chan <michael.chan@broadcom.com>
Sat, 16 Dec 2017 08:09:40 +0000 (03:09 -0500)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 Dec 2017 15:38:36 +0000 (10:38 -0500)
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.  Previously, drivers were using NETIF_F_GRO to
control hardware GRO and so it cannot be independently turned on or
off without affecting GRO.

Hardware GRO (just like GRO) guarantees that packets can be re-segmented
by TSO/GSO to reconstruct the original packet stream.  Logically,
GRO_HW should depend on GRO since it a subset, but we will let
individual drivers enforce this dependency as they see fit.

Since NETIF_F_GRO is not propagated between upper and lower devices,
NETIF_F_GRO_HW should follow suit since it is a subset of GRO.  In other
words, a lower device can independent have GRO/GRO_HW enabled or disabled
and no feature propagation is required.  This will preserve the current
GRO behavior.  This can be changed later if we decide to propagate GRO/
GRO_HW/RXCSUM from upper to lower devices.

Cc: Ariel Elior <Ariel.Elior@cavium.com>
Cc: everest-linux-l2@cavium.com
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Acked-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/netdev-features.txt
include/linux/netdev_features.h
net/core/dev.c
net/core/ethtool.c

index 7413eb05223b104f4d8a00d9615dbd694b596cf4..c77f9d57eb91584878d26061450c3e08a5b19030 100644 (file)
@@ -163,3 +163,12 @@ 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 original packet stream.
+Hardware GRO is dependent on RXCSUM since every packet successfully merged
+by hardware must also have the checksum verified by hardware.
index b1b0ca7ccb2bacac5d997f97f86848e928bc9da7..db84c516bcfbf797744bdbc8d276381e4d69ea6c 100644 (file)
@@ -78,6 +78,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
@@ -97,6 +99,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)
index b0eee49a2489e203c81f64b091c99ba001567380..4b43f5dcabcd6640d35d430e5fb364bf693a2fdc 100644 (file)
@@ -7424,6 +7424,18 @@ static netdev_features_t netdev_fix_features(struct net_device *dev,
                features &= ~dev->gso_partial_features;
        }
 
+       if (!(features & NETIF_F_RXCSUM)) {
+               /* NETIF_F_GRO_HW implies doing RXCSUM since every packet
+                * successfully merged by hardware must also have the
+                * checksum verified by hardware.  If the user does not
+                * want to enable RXCSUM, logically, we should disable GRO_HW.
+                */
+               if (features & NETIF_F_GRO_HW) {
+                       netdev_dbg(dev, "Dropping NETIF_F_GRO_HW since no RXCSUM feature.\n");
+                       features &= ~NETIF_F_GRO_HW;
+               }
+       }
+
        return features;
 }
 
index f8fcf450a36e604fe4c91dcccb4fd2a4a35ef1df..50a79203043b5900584a2272bc168b4767a7e8ff 100644 (file)
@@ -73,6 +73,7 @@ static const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN]
        [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",