| From 581e7922078a0b23b87d38e234a2cac7eebc3878 Mon Sep 17 00:00:00 2001 |
| From: Ed Cashin <ecashin@coraid.com> |
| Date: Wed, 19 Sep 2012 15:49:00 +0000 |
| Subject: net: do not disable sg for packets requiring no checksum |
| |
| |
| From: Ed Cashin <ecashin@coraid.com> |
| |
| [ Upstream commit c0d680e577ff171e7b37dbdb1b1bf5451e851f04 ] |
| |
| A change in a series of VLAN-related changes appears to have |
| inadvertently disabled the use of the scatter gather feature of |
| network cards for transmission of non-IP ethernet protocols like ATA |
| over Ethernet (AoE). Below is a reference to the commit that |
| introduces a "harmonize_features" function that turns off scatter |
| gather when the NIC does not support hardware checksumming for the |
| ethernet protocol of an sk buff. |
| |
| commit f01a5236bd4b140198fbcc550f085e8361fd73fa |
| Author: Jesse Gross <jesse@nicira.com> |
| Date: Sun Jan 9 06:23:31 2011 +0000 |
| |
| net offloading: Generalize netif_get_vlan_features(). |
| |
| The can_checksum_protocol function is not equipped to consider a |
| protocol that does not require checksumming. Calling it for a |
| protocol that requires no checksum is inappropriate. |
| |
| The patch below has harmonize_features call can_checksum_protocol when |
| the protocol needs a checksum, so that the network layer is not forced |
| to perform unnecessary skb linearization on the transmission of AoE |
| packets. Unnecessary linearization results in decreased performance |
| and increased memory pressure, as reported here: |
| |
| http://www.spinics.net/lists/linux-mm/msg15184.html |
| |
| The problem has probably not been widely experienced yet, because |
| only recently has the kernel.org-distributed aoe driver acquired the |
| ability to use payloads of over a page in size, with the patchset |
| recently included in the mm tree: |
| |
| https://lkml.org/lkml/2012/8/28/140 |
| |
| The coraid.com-distributed aoe driver already could use payloads of |
| greater than a page in size, but its users generally do not use the |
| newest kernels. |
| |
| Signed-off-by: Ed Cashin <ecashin@coraid.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/core/dev.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/net/core/dev.c |
| +++ b/net/core/dev.c |
| @@ -2038,7 +2038,8 @@ static bool can_checksum_protocol(unsign |
| |
| static u32 harmonize_features(struct sk_buff *skb, __be16 protocol, u32 features) |
| { |
| - if (!can_checksum_protocol(features, protocol)) { |
| + if (skb->ip_summed != CHECKSUM_NONE && |
| + !can_checksum_protocol(features, protocol)) { |
| features &= ~NETIF_F_ALL_CSUM; |
| features &= ~NETIF_F_SG; |
| } else if (illegal_highdma(skb->dev, skb)) { |