macvlan: Move broadcasts into a work queue
authorHerbert Xu <herbert@gondor.apana.org.au>
Thu, 17 Apr 2014 05:45:59 +0000 (13:45 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 20 Apr 2014 22:18:55 +0000 (18:18 -0400)
commit412ca1550cbecb2cbed6086df51af08aa3452c86
tree8f7b15d976f7e68e36e8b787154e3943fbc39192
parenta0265d28b3a5877b5b8edd14eb12a2ccb60ab1f3
macvlan: Move broadcasts into a work queue

Currently broadcasts are handled in network RX context, where
the packets are sent through netif_rx.  This means that the number
of macvlans will be constrained by the capacity of netif_rx.

For example, setting up 4096 macvlans practically causes all
broadcast packets to be dropped as the default netif_rx queue
size simply can't handle 4096 skbs being stuffed into it all
at once.

Fundamentally, we need to ensure that the amount of work handled
in each netif_rx backlog run is constrained.  As broadcasts are
anything but constrained, it either needs to be limited per run
or moved to process context.

This patch picks the second option and moves all broadcast handling
bar the trivial case of packets going to a single interface into
a work queue.  Obviously there also needs to be a limit on how
many broadcast packets we postpone in this way.  I've arbitrarily
chosen tx_queue_len of the master device as the limit (act_mirred
also happens to use this parameter in a similar way).

In order to ensure we don't exceed the backlog queue we will use
netif_rx_ni instead of netif_rx for broadcast packets.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Thanks,
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/macvlan.c