summaryrefslogtreecommitdiffstats
path: root/include/net/gro_cells.h
diff options
context:
space:
mode:
authorEric Dumazet2016-11-15 01:28:42 +0100
committerDavid S. Miller2016-11-16 04:27:27 +0100
commite88a2766143a27bfe6704b4493b214de4094cf29 (patch)
treebb89a8330ce7936f26ef120d829e23b9a9de2527 /include/net/gro_cells.h
parentudp: restore UDPlite many-cast delivery (diff)
downloadkernel-qcow2-linux-e88a2766143a27bfe6704b4493b214de4094cf29.tar.gz
kernel-qcow2-linux-e88a2766143a27bfe6704b4493b214de4094cf29.tar.xz
kernel-qcow2-linux-e88a2766143a27bfe6704b4493b214de4094cf29.zip
gro_cells: mark napi struct as not busy poll candidates
Rolf Neugebauer reported very long delays at netns dismantle. Eric W. Biederman was kind enough to look at this problem and noticed synchronize_net() occurring from netif_napi_del() that was added in linux-4.5 Busy polling makes no sense for tunnels NAPI. If busy poll is used for sessions over tunnels, the poller will need to poll the physical device queue anyway. netif_tx_napi_add() could be used here, but function name is misleading, and renaming it is not stable material, so set NAPI_STATE_NO_BUSY_POLL bit directly. This will avoid inserting gro_cells napi structures in napi_hash[] and avoid the problematic synchronize_net() (per possible cpu) that Rolf reported. Fixes: 93d05d4a320c ("net: provide generic busy polling to all NAPI drivers") Signed-off-by: Eric Dumazet <edumazet@google.com> Reported-by: Rolf Neugebauer <rolf.neugebauer@docker.com> Reported-by: Eric W. Biederman <ebiederm@xmission.com> Acked-by: Cong Wang <xiyou.wangcong@gmail.com> Tested-by: Rolf Neugebauer <rolf.neugebauer@docker.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/gro_cells.h')
-rw-r--r--include/net/gro_cells.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/include/net/gro_cells.h b/include/net/gro_cells.h
index d15214d673b2..2a1abbf8da74 100644
--- a/include/net/gro_cells.h
+++ b/include/net/gro_cells.h
@@ -68,6 +68,9 @@ static inline int gro_cells_init(struct gro_cells *gcells, struct net_device *de
struct gro_cell *cell = per_cpu_ptr(gcells->cells, i);
__skb_queue_head_init(&cell->napi_skbs);
+
+ set_bit(NAPI_STATE_NO_BUSY_POLL, &cell->napi.state);
+
netif_napi_add(dev, &cell->napi, gro_cell_poll, 64);
napi_enable(&cell->napi);
}