net: flush the softnet backlog in process context
authorPaolo Abeni <pabeni@redhat.com>
Thu, 25 Aug 2016 13:58:44 +0000 (15:58 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 26 Aug 2016 18:51:07 +0000 (11:51 -0700)
commit145dd5f9c88f6ee645662df0be003e8f04bdae93
tree56b9f438ca15357f29ce2c86137877c57b79010c
parent72f4af4e4706a07727765bc6b7bdace4b1543543
net: flush the softnet backlog in process context

Currently in process_backlog(), the process_queue dequeuing is
performed with local IRQ disabled, to protect against
flush_backlog(), which runs in hard IRQ context.

This patch moves the flush operation to a work queue and runs the
callback with bottom half disabled to protect the process_queue
against dequeuing.
Since process_queue is now always manipulated in bottom half context,
the irq disable/enable pair around the dequeue operation are removed.

To keep the flush time as low as possible, the flush
works are scheduled on all online cpu simultaneously, using the
high priority work-queue and statically allocated, per cpu,
work structs.

Overall this change increases the time required to destroy a device
to improve slightly the packets reinjection performances.

Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c