net,RT:REmove preemption disabling in netif_rx()
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 Cc: stable-rt@vger.kernel.org Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
d61a0d53b5
commit
82509650d3
|
@ -3261,7 +3261,7 @@ static int netif_rx_internal(struct sk_buff *skb)
|
||||||
struct rps_dev_flow voidflow, *rflow = &voidflow;
|
struct rps_dev_flow voidflow, *rflow = &voidflow;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
preempt_disable();
|
migrate_disable();
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
|
||||||
cpu = get_rps_cpu(skb->dev, skb, &rflow);
|
cpu = get_rps_cpu(skb->dev, skb, &rflow);
|
||||||
|
@ -3271,13 +3271,13 @@ static int netif_rx_internal(struct sk_buff *skb)
|
||||||
ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail);
|
ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail);
|
||||||
|
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
preempt_enable();
|
migrate_enable();
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
unsigned int qtail;
|
unsigned int qtail;
|
||||||
ret = enqueue_to_backlog(skb, get_cpu(), &qtail);
|
ret = enqueue_to_backlog(skb, get_cpu_light(), &qtail);
|
||||||
put_cpu();
|
put_cpu_light();
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue