75 lines
2.5 KiB
Diff
75 lines
2.5 KiB
Diff
From 5c6867fa8aa3dc6fa2aa3e332bafcd0a6b3beea7 Mon Sep 17 00:00:00 2001
|
|
Message-Id: <5c6867fa8aa3dc6fa2aa3e332bafcd0a6b3beea7.1594742966.git.zanussi@kernel.org>
|
|
In-Reply-To: <832f7d97d6b989a5b4860dd2dbec58ad6ad5ab81.1594742966.git.zanussi@kernel.org>
|
|
References: <832f7d97d6b989a5b4860dd2dbec58ad6ad5ab81.1594742966.git.zanussi@kernel.org>
|
|
From: Priyanka Jain <Priyanka.Jain@freescale.com>
|
|
Date: Thu, 17 May 2012 09:35:11 +0530
|
|
Subject: [PATCH 231/329] net: Remove preemption disabling in netif_rx()
|
|
Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.132-rt59.tar.xz
|
|
|
|
1)enqueue_to_backlog() (called from netif_rx) should be
|
|
bind to a particluar CPU. This can be achieved by
|
|
disabling migration. No need to disable preemption
|
|
|
|
2)Fixes crash "BUG: scheduling while atomic: ksoftirqd"
|
|
in case of RT.
|
|
If preemption is disabled, enqueue_to_backog() is called
|
|
in atomic context. And if backlog exceeds its count,
|
|
kfree_skb() is called. But in RT, kfree_skb() might
|
|
gets scheduled out, so it expects non atomic context.
|
|
|
|
3)When CONFIG_PREEMPT_RT_FULL is not defined,
|
|
migrate_enable(), migrate_disable() maps to
|
|
preempt_enable() and preempt_disable(), so no
|
|
change in functionality in case of non-RT.
|
|
|
|
-Replace preempt_enable(), preempt_disable() with
|
|
migrate_enable(), migrate_disable() respectively
|
|
-Replace get_cpu(), put_cpu() with get_cpu_light(),
|
|
put_cpu_light() respectively
|
|
|
|
Signed-off-by: Priyanka Jain <Priyanka.Jain@freescale.com>
|
|
Acked-by: Rajan Srivastava <Rajan.Srivastava@freescale.com>
|
|
Cc: <rostedt@goodmis.orgn>
|
|
Link: http://lkml.kernel.org/r/1337227511-2271-1-git-send-email-Priyanka.Jain@freescale.com
|
|
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
---
|
|
net/core/dev.c | 8 ++++----
|
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/net/core/dev.c b/net/core/dev.c
|
|
index 1e58809817b2..2e69aded30e7 100644
|
|
--- a/net/core/dev.c
|
|
+++ b/net/core/dev.c
|
|
@@ -4483,7 +4483,7 @@ static int netif_rx_internal(struct sk_buff *skb)
|
|
struct rps_dev_flow voidflow, *rflow = &voidflow;
|
|
int cpu;
|
|
|
|
- preempt_disable();
|
|
+ migrate_disable();
|
|
rcu_read_lock();
|
|
|
|
cpu = get_rps_cpu(skb->dev, skb, &rflow);
|
|
@@ -4493,14 +4493,14 @@ static int netif_rx_internal(struct sk_buff *skb)
|
|
ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail);
|
|
|
|
rcu_read_unlock();
|
|
- preempt_enable();
|
|
+ migrate_enable();
|
|
} else
|
|
#endif
|
|
{
|
|
unsigned int qtail;
|
|
|
|
- ret = enqueue_to_backlog(skb, get_cpu(), &qtail);
|
|
- put_cpu();
|
|
+ ret = enqueue_to_backlog(skb, get_cpu_light(), &qtail);
|
|
+ put_cpu_light();
|
|
}
|
|
return ret;
|
|
}
|
|
--
|
|
2.17.1
|
|
|