path: root/drivers/net/ethernet/lantiq_etop.c
diff options
authorJason Wang <>2014-01-10 16:18:26 +0800
committerDavid S. Miller <>2014-01-10 13:23:08 -0500
commitf663dd9aaf9ed124f25f0f8452edf238f087ad50 (patch)
tree2aee7dfcfd373c6905de5b2a9f810f9e209156b6 /drivers/net/ethernet/lantiq_etop.c
parentb13ba1b83f524732523db1079e56478b32c85c96 (diff)
net: core: explicitly select a txq before doing l2 forwarding
Currently, the tx queue were selected implicitly in ndo_dfwd_start_xmit(). The will cause several issues: - NETIF_F_LLTX were removed for macvlan, so txq lock were done for macvlan instead of lower device which misses the necessary txq synchronization for lower device such as txq stopping or frozen required by dev watchdog or control path. - dev_hard_start_xmit() was called with NULL txq which bypasses the net device watchdog. - dev_hard_start_xmit() does not check txq everywhere which will lead a crash when tso is disabled for lower device. Fix this by explicitly introducing a new param for .ndo_select_queue() for just selecting queues in the case of l2 forwarding offload. netdev_pick_tx() was also extended to accept this parameter and dev_queue_xmit_accel() was used to do l2 forwarding transmission. With this fixes, NETIF_F_LLTX could be preserved for macvlan and there's no need to check txq against NULL in dev_hard_start_xmit(). Also there's no need to keep a dedicated ndo_dfwd_start_xmit() and we can just reuse the code of dev_queue_xmit() to do the transmission. In the future, it was also required for macvtap l2 forwarding support since it provides a necessary synchronization method. Cc: John Fastabend <> Cc: Neil Horman <> Cc: Signed-off-by: Jason Wang <> Acked-by: Neil Horman <> Acked-by: John Fastabend <> Signed-off-by: David S. Miller <>
Diffstat (limited to 'drivers/net/ethernet/lantiq_etop.c')
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/ethernet/lantiq_etop.c b/drivers/net/ethernet/lantiq_etop.c
index 6a6c1f76d8e0..ec94a20d7099 100644
--- a/drivers/net/ethernet/lantiq_etop.c
+++ b/drivers/net/ethernet/lantiq_etop.c
@@ -619,7 +619,8 @@ ltq_etop_set_multicast_list(struct net_device *dev)
static u16
-ltq_etop_select_queue(struct net_device *dev, struct sk_buff *skb)
+ltq_etop_select_queue(struct net_device *dev, struct sk_buff *skb,
+ void *accel_priv)
/* we are currently only using the first queue */
return 0;