[net-next-2.6] Revert "net: Allow no-cache copy from user on transmit"

From: Sedat Dilek
Date: Thu Apr 07 2011 - 06:49:16 EST


[ The long CC list I got via ./scripts/get_maintainer.pl ]

Hi,

with yesterday's linux-next (next-20110406) I discovered first time
network problems.
Today's next-20110407 shows the same symptoms.
In my IRC client the connection via SSL-encryption to freenode and
oftc are not established.
Also, I saw "stalls" on websites in firefox.

Luckily, next-20110405 was OK, so I started to look at the
net-next-2.6 merge and its commits.
( Furthermore, I tested a 2.6.39-rc2 vanilla kernel to ensure the
problem comes from linux-next patch. )

By reverting all 10 commits my system worked as expected, here the list:

0001-Revert-net-Allow-no-cache-copy-from-user-on-transmit.patch
0002-Revert-bridge-range-check-STP-parameters.patch
0003-Revert-bridge-allow-creating-bridge-devices-with-net.patch
0004-Revert-bridge-allow-creating-deleting-fdb-entries-vi.patch
0005-Revert-bridge-add-netlink-notification-on-forward-en.patch
0006-Revert-bridge-split-rcu-and-no-rcu-cases-of-fdb-look.patch
0007-Revert-bridge-track-last-used-time-in-forwarding-tab.patch
0008-Revert-bridge-change-arguments-to-fdb_create.patch
0009-Revert-pkt_sched-QFQ-quick-fair-queue-scheduler.patch
0010-Revert-xen-netfront-assume-all-hw-features-are-avail.patch

In a next run, I started with only
"0001-Revert-net-Allow-no-cache-copy-from-user-on-transmit.patch".
It turned out that this is the culprit commit.
( I have not played with the new ethtool option tx-nocache-copy in
"BROKEN" kernel. )

My wificard is an Atheros ath5k.
I attached my kernel-config and the revert-patch which makes the
system stable again.

Can you have a look at it?

I you want me to help with debugging, please give me precise instructions.

Regards,
- Sedat -

Attachment: config-2.6.39-rc2-next20110407.6-686-small
Description: Binary data

From 4d5767a1c0037f9acf051eb1d52a111308de8208 Mon Sep 17 00:00:00 2001
From: Sedat Dilek <sedat.dilek@xxxxxxxxx>
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 <linux/mm.h>
#include <linux/security.h>
#include <linux/slab.h>
-#include <linux/uaccess.h>

#include <linux/filter.h>
#include <linux/rculist_nulls.h>
@@ -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