From 4d5767a1c0037f9acf051eb1d52a111308de8208 Mon Sep 17 00:00:00 2001 From: Sedat Dilek Date: Thu, 7 Apr 2011 10:07:05 +0200 Subject: [PATCH 01/10] Revert "net: Allow no-cache copy from user on transmit" This reverts commit c6e1a0d12ca7b4f22c58e55a16beacfb7d3d8462. --- drivers/net/bonding/bond_main.c | 2 +- include/linux/netdevice.h | 3 +- include/net/sock.h | 53 --------------------------------------- net/core/dev.c | 12 --------- net/core/ethtool.c | 2 +- net/ipv4/tcp.c | 7 ++--- 6 files changed, 6 insertions(+), 73 deletions(-) diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index b51e021..16d6fe9 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -1407,7 +1407,7 @@ static int bond_compute_features(struct bonding *bond) int i; features &= ~(NETIF_F_ALL_CSUM | BOND_VLAN_FEATURES); - features |= NETIF_F_GSO_MASK | NETIF_F_NO_CSUM | NETIF_F_NOCACHE_COPY; + features |= NETIF_F_GSO_MASK | NETIF_F_NO_CSUM; if (!bond->first_slave) goto done; diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 09d2624..a4664cc 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1066,7 +1066,6 @@ struct net_device { #define NETIF_F_NTUPLE (1 << 27) /* N-tuple filters supported */ #define NETIF_F_RXHASH (1 << 28) /* Receive hashing offload */ #define NETIF_F_RXCSUM (1 << 29) /* Receive checksumming offload */ -#define NETIF_F_NOCACHE_COPY (1 << 30) /* Use no-cache copyfromuser */ /* Segmentation offload features */ #define NETIF_F_GSO_SHIFT 16 @@ -1082,7 +1081,7 @@ struct net_device { /* = all defined minus driver/device-class-related */ #define NETIF_F_NEVER_CHANGE (NETIF_F_HIGHDMA | NETIF_F_VLAN_CHALLENGED | \ NETIF_F_LLTX | NETIF_F_NETNS_LOCAL) -#define NETIF_F_ETHTOOL_BITS (0x7f3fffff & ~NETIF_F_NEVER_CHANGE) +#define NETIF_F_ETHTOOL_BITS (0x3f3fffff & ~NETIF_F_NEVER_CHANGE) /* List of features with software fallbacks. */ #define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | \ diff --git a/include/net/sock.h b/include/net/sock.h index 43bd515..da0534d 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -52,7 +52,6 @@ #include #include #include -#include #include #include @@ -1390,58 +1389,6 @@ static inline void sk_nocaps_add(struct sock *sk, int flags) sk->sk_route_caps &= ~flags; } -static inline int skb_do_copy_data_nocache(struct sock *sk, struct sk_buff *skb, - char __user *from, char *to, - int copy) -{ - if (skb->ip_summed == CHECKSUM_NONE) { - int err = 0; - __wsum csum = csum_and_copy_from_user(from, to, copy, 0, &err); - if (err) - return err; - skb->csum = csum_block_add(skb->csum, csum, skb->len); - } else if (sk->sk_route_caps & NETIF_F_NOCACHE_COPY) { - if (!access_ok(VERIFY_READ, from, copy) || - __copy_from_user_nocache(to, from, copy)) - return -EFAULT; - } else if (copy_from_user(to, from, copy)) - return -EFAULT; - - return 0; -} - -static inline int skb_add_data_nocache(struct sock *sk, struct sk_buff *skb, - char __user *from, int copy) -{ - int err; - - err = skb_do_copy_data_nocache(sk, skb, from, skb_put(skb, copy), copy); - if (err) - __skb_trim(skb, skb->len); - - return err; -} - -static inline int skb_copy_to_page_nocache(struct sock *sk, char __user *from, - struct sk_buff *skb, - struct page *page, - int off, int copy) -{ - int err; - - err = skb_do_copy_data_nocache(sk, skb, from, - page_address(page) + off, copy); - if (err) - return err; - - skb->len += copy; - skb->data_len += copy; - skb->truesize += copy; - sk->sk_wmem_queued += copy; - sk_mem_charge(sk, copy); - return 0; -} - static inline int skb_copy_to_page(struct sock *sk, char __user *from, struct sk_buff *skb, struct page *page, int off, int copy) diff --git a/net/core/dev.c b/net/core/dev.c index 5d0b4f6..02f5637 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -5425,14 +5425,6 @@ int register_netdevice(struct net_device *dev) dev->features &= ~NETIF_F_GSO; } - /* Turn on no cache copy if HW is doing checksum */ - dev->hw_features |= NETIF_F_NOCACHE_COPY; - if ((dev->features & NETIF_F_ALL_CSUM) && - !(dev->features & NETIF_F_NO_CSUM)) { - dev->wanted_features |= NETIF_F_NOCACHE_COPY; - dev->features |= NETIF_F_NOCACHE_COPY; - } - /* Enable GRO and NETIF_F_HIGHDMA for vlans by default, * vlan_dev_init() will do the dev->features check, so these features * are enabled only if supported by underlying device. @@ -6190,10 +6182,6 @@ u32 netdev_increment_features(u32 all, u32 one, u32 mask) } } - /* If device can't no cache copy, don't do for all */ - if (!(one & NETIF_F_NOCACHE_COPY)) - all &= ~NETIF_F_NOCACHE_COPY; - one |= NETIF_F_ALL_CSUM; one |= all & NETIF_F_ONE_FOR_ALL; diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 719670a..439e4b0 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 /* NETIF_F_NTUPLE */ "rx-ntuple-filter", /* NETIF_F_RXHASH */ "rx-hashing", /* NETIF_F_RXCSUM */ "rx-checksum", - /* NETIF_F_NOCACHE_COPY */ "tx-nocache-copy" + "", "", }; diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 054a59d..b22d450 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -999,8 +999,7 @@ new_segment: /* We have some space in skb head. Superb! */ if (copy > skb_tailroom(skb)) copy = skb_tailroom(skb); - err = skb_add_data_nocache(sk, skb, from, copy); - if (err) + if ((err = skb_add_data(skb, from, copy)) != 0) goto do_fault; } else { int merge = 0; @@ -1043,8 +1042,8 @@ new_segment: /* Time to copy data. We are close to * the end! */ - err = skb_copy_to_page_nocache(sk, from, skb, - page, off, copy); + err = skb_copy_to_page(sk, from, skb, page, + off, copy); if (err) { /* If this page was new, give it to the * socket so it does not get leaked. -- 1.7.4.3