From: Li Yu <raise.sail@gmail.com>
To: netdev@vger.kernel.org
Subject: [PATCH net-next] rps: introduce a new sysctl switch rps_workaround_buggy_driver
Date: Thu, 05 Apr 2012 18:31:00 +0800 [thread overview]
Message-ID: <4F7D7464.7040503@gmail.com> (raw)
We encountered a buggy NIC driver or hardware/firmware, it keeps
non-zero constant skb->rxhash for long time, so if we enabled RPS,
the targeted CPU keeps same for long time too.
This patch introduces a sysctl switch to workaround for such problem,
if the switch was on, RPS core discards the skb->rxhash that is
computed by NIC hardware.
Hope this patch also can help others, thanks.
Signed-off-by Li Yu <bingtian.ly@taobao.com>
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 192250b..4c28ce0 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -628,9 +628,13 @@ extern unsigned int skb_find_text(struct sk_buff
*skb, unsigned int from,
unsigned int to, struct ts_config *config,
struct ts_state *state);
+extern int rps_workaround_buggy_driver;
extern void __skb_get_rxhash(struct sk_buff *skb);
static inline __u32 skb_get_rxhash(struct sk_buff *skb)
{
+ if (unlikely(rps_workaround_buggy_driver))
+ skb->rxhash = 0;
+
if (!skb->rxhash)
__skb_get_rxhash(skb);
diff --git a/net/core/dev.c b/net/core/dev.c
index 723a406..9d1e728 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -176,6 +176,8 @@
#define PTYPE_HASH_SIZE (16)
#define PTYPE_HASH_MASK (PTYPE_HASH_SIZE - 1)
+int rps_workaround_buggy_driver = 0;
+
static DEFINE_SPINLOCK(ptype_lock);
static struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
static struct list_head ptype_all __read_mostly; /* Taps */
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
index 0c28508..065ea7c 100644
--- a/net/core/sysctl_net_core.c
+++ b/net/core/sysctl_net_core.c
@@ -172,6 +172,13 @@ static struct ctl_table net_core_table[] = {
.mode = 0644,
.proc_handler = rps_sock_flow_sysctl
},
+ {
+ .procname = "rps_workaround_buggy_driver",
+ .data = &rps_workaround_buggy_driver,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+ .proc_handler = proc_dointvec
+ },
#endif
#endif /* CONFIG_NET */
{
next reply other threads:[~2012-04-05 10:31 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-05 10:31 Li Yu [this message]
2012-04-05 10:44 ` [PATCH net-next] rps: introduce a new sysctl switch rps_workaround_buggy_driver David Miller
2012-04-05 11:07 ` Eric Dumazet
2012-04-06 2:07 ` Li Yu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F7D7464.7040503@gmail.com \
--to=raise.sail@gmail.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.