diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/core/dev.c | 12 | ||||
-rw-r--r-- | net/core/ethtool.c | 2 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 7 |
3 files changed, 17 insertions, 4 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 02f56376fe99..5d0b4f6f1a72 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -5425,6 +5425,14 @@ int register_netdevice(struct net_device *dev) | |||
5425 | dev->features &= ~NETIF_F_GSO; | 5425 | dev->features &= ~NETIF_F_GSO; |
5426 | } | 5426 | } |
5427 | 5427 | ||
5428 | /* Turn on no cache copy if HW is doing checksum */ | ||
5429 | dev->hw_features |= NETIF_F_NOCACHE_COPY; | ||
5430 | if ((dev->features & NETIF_F_ALL_CSUM) && | ||
5431 | !(dev->features & NETIF_F_NO_CSUM)) { | ||
5432 | dev->wanted_features |= NETIF_F_NOCACHE_COPY; | ||
5433 | dev->features |= NETIF_F_NOCACHE_COPY; | ||
5434 | } | ||
5435 | |||
5428 | /* Enable GRO and NETIF_F_HIGHDMA for vlans by default, | 5436 | /* Enable GRO and NETIF_F_HIGHDMA for vlans by default, |
5429 | * vlan_dev_init() will do the dev->features check, so these features | 5437 | * vlan_dev_init() will do the dev->features check, so these features |
5430 | * are enabled only if supported by underlying device. | 5438 | * are enabled only if supported by underlying device. |
@@ -6182,6 +6190,10 @@ u32 netdev_increment_features(u32 all, u32 one, u32 mask) | |||
6182 | } | 6190 | } |
6183 | } | 6191 | } |
6184 | 6192 | ||
6193 | /* If device can't no cache copy, don't do for all */ | ||
6194 | if (!(one & NETIF_F_NOCACHE_COPY)) | ||
6195 | all &= ~NETIF_F_NOCACHE_COPY; | ||
6196 | |||
6185 | one |= NETIF_F_ALL_CSUM; | 6197 | one |= NETIF_F_ALL_CSUM; |
6186 | 6198 | ||
6187 | one |= all & NETIF_F_ONE_FOR_ALL; | 6199 | one |= all & NETIF_F_ONE_FOR_ALL; |
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 439e4b0e1312..719670ae199c 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
@@ -359,7 +359,7 @@ static const char netdev_features_strings[ETHTOOL_DEV_FEATURE_WORDS * 32][ETH_GS | |||
359 | /* NETIF_F_NTUPLE */ "rx-ntuple-filter", | 359 | /* NETIF_F_NTUPLE */ "rx-ntuple-filter", |
360 | /* NETIF_F_RXHASH */ "rx-hashing", | 360 | /* NETIF_F_RXHASH */ "rx-hashing", |
361 | /* NETIF_F_RXCSUM */ "rx-checksum", | 361 | /* NETIF_F_RXCSUM */ "rx-checksum", |
362 | "", | 362 | /* NETIF_F_NOCACHE_COPY */ "tx-nocache-copy" |
363 | "", | 363 | "", |
364 | }; | 364 | }; |
365 | 365 | ||
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index b22d45010545..054a59d21eb0 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -999,7 +999,8 @@ new_segment: | |||
999 | /* We have some space in skb head. Superb! */ | 999 | /* We have some space in skb head. Superb! */ |
1000 | if (copy > skb_tailroom(skb)) | 1000 | if (copy > skb_tailroom(skb)) |
1001 | copy = skb_tailroom(skb); | 1001 | copy = skb_tailroom(skb); |
1002 | if ((err = skb_add_data(skb, from, copy)) != 0) | 1002 | err = skb_add_data_nocache(sk, skb, from, copy); |
1003 | if (err) | ||
1003 | goto do_fault; | 1004 | goto do_fault; |
1004 | } else { | 1005 | } else { |
1005 | int merge = 0; | 1006 | int merge = 0; |
@@ -1042,8 +1043,8 @@ new_segment: | |||
1042 | 1043 | ||
1043 | /* Time to copy data. We are close to | 1044 | /* Time to copy data. We are close to |
1044 | * the end! */ | 1045 | * the end! */ |
1045 | err = skb_copy_to_page(sk, from, skb, page, | 1046 | err = skb_copy_to_page_nocache(sk, from, skb, |
1046 | off, copy); | 1047 | page, off, copy); |
1047 | if (err) { | 1048 | if (err) { |
1048 | /* If this page was new, give it to the | 1049 | /* If this page was new, give it to the |
1049 | * socket so it does not get leaked. | 1050 | * socket so it does not get leaked. |