From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org,
linux-rt-users <linux-rt-users@vger.kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>,
Carsten Emde <C.Emde@osadl.org>,
Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
John Kacur <jkacur@redhat.com>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
<stable-rt@vger.kernel.org>
Subject: [PATCH RT 03/22] net: move xmit_recursion to per-task variable on -RT
Date: Wed, 02 Mar 2016 10:09:02 -0500 [thread overview]
Message-ID: <20160302151110.746804820@goodmis.org> (raw)
In-Reply-To: 20160302150859.204542604@goodmis.org
[-- Attachment #1: 0003-net-move-xmit_recursion-to-per-task-variable-on-RT.patch --]
[-- Type: text/plain, Size: 3700 bytes --]
4.1.15-rt18-rc1 stable review patch.
If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
A softirq on -RT can be preempted. That means one task is in
__dev_queue_xmit(), gets preempted and another task may enter
__dev_queue_xmit() aw well. netperf together with a bridge device
will then trigger the `recursion alert` because each task increments
the xmit_recursion variable which is per-CPU.
A virtual device like br0 is required to trigger this warning.
This patch moves the counter to per task instead per-CPU so it counts
the recursion properly on -RT.
Cc: stable-rt@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
include/linux/netdevice.h | 9 +++++++++
include/linux/sched.h | 3 +++
net/core/dev.c | 41 ++++++++++++++++++++++++++++++++++++++---
3 files changed, 50 insertions(+), 3 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 7a289e802a23..d24fe5d9980d 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2192,11 +2192,20 @@ void netdev_freemem(struct net_device *dev);
void synchronize_net(void);
int init_dummy_netdev(struct net_device *dev);
+#ifdef CONFIG_PREEMPT_RT_FULL
+static inline int dev_recursion_level(void)
+{
+ return current->xmit_recursion;
+}
+
+#else
+
DECLARE_PER_CPU(int, xmit_recursion);
static inline int dev_recursion_level(void)
{
return this_cpu_read(xmit_recursion);
}
+#endif
struct net_device *dev_get_by_index(struct net *net, int ifindex);
struct net_device *__dev_get_by_index(struct net *net, int ifindex);
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 1a56c0512491..4d995add9497 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1806,6 +1806,9 @@ struct task_struct {
#ifdef CONFIG_DEBUG_ATOMIC_SLEEP
unsigned long task_state_change;
#endif
+#ifdef CONFIG_PREEMPT_RT_FULL
+ int xmit_recursion;
+#endif
int pagefault_disabled;
};
diff --git a/net/core/dev.c b/net/core/dev.c
index 16fbef81024d..7d8ad99de55f 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2883,9 +2883,44 @@ static void skb_update_prio(struct sk_buff *skb)
#define skb_update_prio(skb)
#endif
+#ifdef CONFIG_PREEMPT_RT_FULL
+
+static inline int xmit_rec_read(void)
+{
+ return current->xmit_recursion;
+}
+
+static inline void xmit_rec_inc(void)
+{
+ current->xmit_recursion++;
+}
+
+static inline void xmit_rec_dec(void)
+{
+ current->xmit_recursion--;
+}
+
+#else
+
DEFINE_PER_CPU(int, xmit_recursion);
EXPORT_SYMBOL(xmit_recursion);
+static inline int xmit_rec_read(void)
+{
+ return __this_cpu_read(xmit_recursion);
+}
+
+static inline void xmit_rec_inc(void)
+{
+ __this_cpu_inc(xmit_recursion);
+}
+
+static inline int xmit_rec_dec(void)
+{
+ __this_cpu_dec(xmit_recursion);
+}
+#endif
+
#define RECURSION_LIMIT 10
/**
@@ -2987,7 +3022,7 @@ static int __dev_queue_xmit(struct sk_buff *skb, void *accel_priv)
if (txq->xmit_lock_owner != cpu) {
- if (__this_cpu_read(xmit_recursion) > RECURSION_LIMIT)
+ if (xmit_rec_read() > RECURSION_LIMIT)
goto recursion_alert;
skb = validate_xmit_skb(skb, dev);
@@ -2997,9 +3032,9 @@ static int __dev_queue_xmit(struct sk_buff *skb, void *accel_priv)
HARD_TX_LOCK(dev, txq, cpu);
if (!netif_xmit_stopped(txq)) {
- __this_cpu_inc(xmit_recursion);
+ xmit_rec_inc();
skb = dev_hard_start_xmit(skb, dev, txq, &rc);
- __this_cpu_dec(xmit_recursion);
+ xmit_rec_dec();
if (dev_xmit_complete(rc)) {
HARD_TX_UNLOCK(dev, txq);
goto out;
--
2.7.0
next prev parent reply other threads:[~2016-03-02 15:09 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-02 15:08 [PATCH RT 00/22] Linux 4.1.15-rt18-rc1 Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 01/22] sched: reset tasks lockless wake-queues on fork() Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 02/22] ptrace: dont open IRQs in ptrace_freeze_traced() too early Steven Rostedt
2016-03-02 15:09 ` Steven Rostedt [this message]
2016-03-02 15:09 ` [PATCH RT 04/22] kernel/softirq: use cond_resched_rcu_qs() on -RT as well (run_ksoftirqd()) Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 05/22] net/core: protect users of napi_alloc_cache against reentrance Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 06/22] preempt-lazy: Add the lazy-preemption check to preempt_schedule() Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 07/22] softirq: split timer softirqs out of ksoftirqd Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 08/22] net: provide a way to delegate processing a softirq to ksoftirqd Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 09/22] latencyhist: disable jump-labels Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 10/22] arm64: replace read_lock to rcu lock in call_step_hook Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 11/22] kernel: migrate_disable() do fastpath in atomic & irqs-off Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 12/22] kernel: softirq: unlock with irqs on Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 13/22] kernel/stop_machine: partly revert "stop_machine: Use raw spinlocks" Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 14/22] tick/broadcast: Make broadcast hrtimer irqsafe Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 15/22] sched,rt: __always_inline preemptible_lazy() Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 16/22] drm,radeon,i915: Use preempt_disable/enable_rt() where recommended Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 17/22] drm,i915: Use local_lock/unlock_irq() in intel_pipe_update_start/end() Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 18/22] trace: Use rcuidle version for preemptoff_hist trace point Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 19/22] f2fs: Mutex cant be used by down_write_nest_lock() Steven Rostedt
2016-03-02 15:09 ` Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 20/22] rcu/torture: Comment out rcu_bh ops on PREEMPT_RT_FULL Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 21/22] kernel: sched: Fix preempt_disable_ip recodring for preempt_disable() Steven Rostedt
2016-03-02 15:09 ` [PATCH RT 22/22] Linux 4.1.15-rt18-rc1 Steven Rostedt
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=20160302151110.746804820@goodmis.org \
--to=rostedt@goodmis.org \
--cc=C.Emde@osadl.org \
--cc=bigeasy@linutronix.de \
--cc=jkacur@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rt-users@vger.kernel.org \
--cc=paul.gortmaker@windriver.com \
--cc=stable-rt@vger.kernel.org \
--cc=tglx@linutronix.de \
/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.