[Devel] [PATCH 01/14] netpoll: don't free skb from completion_queue in interrupt context

Konstantin Khorenko khorenko at virtuozzo.com
Wed Jun 10 01:33:20 PDT 2015


Do we need to send it upstream if the problem still not resolved in 3.10?
May be it's still valid for 4.x as well?

--
Best regards,

Konstantin Khorenko,
Virtuozzo Linux Kernel Team

On 06/08/2015 05:20 PM, Kirill Tkhai wrote:
> Porting patch diff-netpoll-dont-free-skb-from-completion_queue-in-interrupt-context
> from 2.6.32:
> 
> skb is queued to completion_queue from dev_kfree_skb_irq,
> because skb can't be freed in irq context.
> 
> This patch fixes the warning:
> [ 6253.592727] WARNING: at kernel/softirq.c:161 local_bh_enable_ip+0x7d/0xb0()
> [ 6253.592727] Call Trace:
> [ 6253.592727]  <IRQ>  [<ffffffff81071927>] ? warn_slowpath_common+0x87/0xc0
> [ 6253.592727]  [<ffffffff8107197a>] ? warn_slowpath_null+0x1a/0x20
> [ 6253.592727]  [<ffffffff8107a72d>] ? local_bh_enable_ip+0x7d/0xb0
> [ 6253.592727]  [<ffffffff8151997b>] ? _spin_unlock_bh+0x1b/0x20
> [ 6253.592727]  [<ffffffffa041c928>] ? destroy_conntrack+0xd8/0x190 [nf_conntrack]
> [ 6253.592727]  [<ffffffff81484247>] ? nf_conntrack_destroy+0x17/0x30
> [ 6253.592727]  [<ffffffff8144b205>] ? skb_release_head_state+0xf5/0x120
> [ 6253.592727]  [<ffffffff8144af76>] ? __kfree_skb+0x16/0xa0
> [ 6253.592727]  [<ffffffff8146da54>] ? zap_completion_queue+0x84/0xa0
> [ 6253.592727]  [<ffffffff8146db95>] ? netpoll_poll_dev+0x125/0x490
> [ 6253.592727]  [<ffffffff8146e101>] ? netpoll_send_skb_on_dev+0x151/0x230
> [ 6253.592727]  [<ffffffff8146e3f3>] ? netpoll_send_udp+0x213/0x230
> [ 6253.592727]  [<ffffffffa001c31b>] ? write_msg+0xbb/0x110 [netconsole]
> 
> write_msg calls spin_lock_irqsave, which disables interrupts.
> Then destroy_conntrack calls spin_lock_bh and we get this warning.
> 
> https://jira.sw.ru/browse/PSBM-23346
> https://bugzilla.openvz.org/show_bug.cgi?id=2526
> 
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> Signed-off-by: Kirill Tkhai <ktkhai at odin.com>
> ---
>  net/core/netpoll.c |    6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/net/core/netpoll.c b/net/core/netpoll.c
> index 99091a2..18eeb81 100644
> --- a/net/core/netpoll.c
> +++ b/net/core/netpoll.c
> @@ -291,8 +291,12 @@ static void refill_skbs(void)
>  static void zap_completion_queue(void)
>  {
>  	unsigned long flags;
> -	struct softnet_data *sd = &get_cpu_var(softnet_data);
> +	struct softnet_data *sd;
>  
> +	if (in_irq() || irqs_disabled())
> +		return;
> +
> +	sd = &get_cpu_var(softnet_data);
>  	if (sd->completion_queue) {
>  		struct sk_buff *clist;
>  
> 
> _______________________________________________
> Devel mailing list
> Devel at openvz.org
> https://lists.openvz.org/mailman/listinfo/devel
> 



More information about the Devel mailing list