|  | Subject: net: Remove preemption disabling in netif_rx() | 
|  | From: Priyanka Jain <Priyanka.Jain@freescale.com> | 
|  | Date: Thu, 17 May 2012 09:35:11 +0530 | 
|  |  | 
|  | 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> | 
|  | --- | 
|  | Testing: Tested successfully on p4080ds(8-core SMP system) | 
|  |  | 
|  | net/core/dev.c |    8 ++++---- | 
|  | 1 file changed, 4 insertions(+), 4 deletions(-) | 
|  |  | 
|  | --- a/net/core/dev.c | 
|  | +++ b/net/core/dev.c | 
|  | @@ -4147,7 +4147,7 @@ static int netif_rx_internal(struct sk_b | 
|  | struct rps_dev_flow voidflow, *rflow = &voidflow; | 
|  | int cpu; | 
|  |  | 
|  | -		preempt_disable(); | 
|  | +		migrate_disable(); | 
|  | rcu_read_lock(); | 
|  |  | 
|  | cpu = get_rps_cpu(skb->dev, skb, &rflow); | 
|  | @@ -4157,14 +4157,14 @@ static int netif_rx_internal(struct sk_b | 
|  | 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; | 
|  | } |