Skip to content

Commit 99932d4

Browse files
Daniel Borkmanndavem330
authored andcommitted
netdevice: add queue selection fallback handler for ndo_select_queue
Add a new argument for ndo_select_queue() callback that passes a fallback handler. This gets invoked through netdev_pick_tx(); fallback handler is currently __netdev_pick_tx() as most drivers invoke this function within their customized implementation in case for skbs that don't need any special handling. This fallback handler can then be replaced on other call-sites with different queue selection methods (e.g. in packet sockets, pktgen etc). This also has the nice side-effect that __netdev_pick_tx() is then only invoked from netdev_pick_tx() and export of that function to modules can be undone. Suggested-by: David S. Miller <davem@davemloft.net> Signed-off-by: Daniel Borkmann <dborkman@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent c321f7d commit 99932d4

17 files changed

Lines changed: 31 additions & 27 deletions

File tree

drivers/net/bonding/bond_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3707,7 +3707,7 @@ static inline int bond_slave_override(struct bonding *bond,
37073707

37083708

37093709
static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb,
3710-
void *accel_priv)
3710+
void *accel_priv, select_queue_fallback_t fallback)
37113711
{
37123712
/*
37133713
* This helper function exists to help dev_pick_tx get the correct

drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1873,7 +1873,7 @@ void bnx2x_netif_stop(struct bnx2x *bp, int disable_hw)
18731873
}
18741874

18751875
u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
1876-
void *accel_priv)
1876+
void *accel_priv, select_queue_fallback_t fallback)
18771877
{
18781878
struct bnx2x *bp = netdev_priv(dev);
18791879

@@ -1895,7 +1895,7 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
18951895
}
18961896

18971897
/* select a non-FCoE queue */
1898-
return __netdev_pick_tx(dev, skb) % BNX2X_NUM_ETH_QUEUES(bp);
1898+
return fallback(dev, skb) % BNX2X_NUM_ETH_QUEUES(bp);
18991899
}
19001900

19011901
void bnx2x_set_num_queues(struct bnx2x *bp)

drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ int bnx2x_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos);
496496

497497
/* select_queue callback */
498498
u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
499-
void *accel_priv);
499+
void *accel_priv, select_queue_fallback_t fallback);
500500

501501
static inline void bnx2x_update_rx_prod(struct bnx2x *bp,
502502
struct bnx2x_fastpath *fp,

drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6881,7 +6881,7 @@ static inline int ixgbe_maybe_stop_tx(struct ixgbe_ring *tx_ring, u16 size)
68816881
}
68826882

68836883
static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb,
6884-
void *accel_priv)
6884+
void *accel_priv, select_queue_fallback_t fallback)
68856885
{
68866886
struct ixgbe_fwd_adapter *fwd_adapter = accel_priv;
68876887
#ifdef IXGBE_FCOE
@@ -6907,7 +6907,7 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb,
69076907
if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED)
69086908
break;
69096909
default:
6910-
return __netdev_pick_tx(dev, skb);
6910+
return fallback(dev, skb);
69116911
}
69126912

69136913
f = &adapter->ring_feature[RING_F_FCOE];
@@ -6920,7 +6920,7 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb,
69206920

69216921
return txq + f->offset;
69226922
#else
6923-
return __netdev_pick_tx(dev, skb);
6923+
return fallback(dev, skb);
69246924
#endif
69256925
}
69266926

drivers/net/ethernet/lantiq_etop.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ ltq_etop_set_multicast_list(struct net_device *dev)
619619

620620
static u16
621621
ltq_etop_select_queue(struct net_device *dev, struct sk_buff *skb,
622-
void *accel_priv)
622+
void *accel_priv, select_queue_fallback_t fallback)
623623
{
624624
/* we are currently only using the first queue */
625625
return 0;

drivers/net/ethernet/mellanox/mlx4/en_tx.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ static void build_inline_wqe(struct mlx4_en_tx_desc *tx_desc, struct sk_buff *sk
629629
}
630630

631631
u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb,
632-
void *accel_priv)
632+
void *accel_priv, select_queue_fallback_t fallback)
633633
{
634634
struct mlx4_en_priv *priv = netdev_priv(dev);
635635
u16 rings_p_up = priv->num_tx_rings_p_up;
@@ -641,7 +641,7 @@ u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb,
641641
if (vlan_tx_tag_present(skb))
642642
up = vlan_tx_tag_get(skb) >> VLAN_PRIO_SHIFT;
643643

644-
return __netdev_pick_tx(dev, skb) % rings_p_up + up * rings_p_up;
644+
return fallback(dev, skb) % rings_p_up + up * rings_p_up;
645645
}
646646

647647
static void mlx4_bf_copy(void __iomem *dst, unsigned long *src, unsigned bytecnt)

drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,7 @@ int mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq);
723723

724724
void mlx4_en_tx_irq(struct mlx4_cq *mcq);
725725
u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb,
726-
void *accel_priv);
726+
void *accel_priv, select_queue_fallback_t fallback);
727727
netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev);
728728

729729
int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,

drivers/net/ethernet/tile/tilegx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2071,7 +2071,7 @@ static int tile_net_tx(struct sk_buff *skb, struct net_device *dev)
20712071

20722072
/* Return subqueue id on this core (one per core). */
20732073
static u16 tile_net_select_queue(struct net_device *dev, struct sk_buff *skb,
2074-
void *accel_priv)
2074+
void *accel_priv, select_queue_fallback_t fallback)
20752075
{
20762076
return smp_processor_id();
20772077
}

drivers/net/team/team.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1648,7 +1648,7 @@ static netdev_tx_t team_xmit(struct sk_buff *skb, struct net_device *dev)
16481648
}
16491649

16501650
static u16 team_select_queue(struct net_device *dev, struct sk_buff *skb,
1651-
void *accel_priv)
1651+
void *accel_priv, select_queue_fallback_t fallback)
16521652
{
16531653
/*
16541654
* This helper function exists to help dev_pick_tx get the correct

drivers/net/tun.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ static inline void tun_flow_save_rps_rxhash(struct tun_flow_entry *e, u32 hash)
366366
* hope the rxq no. may help here.
367367
*/
368368
static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb,
369-
void *accel_priv)
369+
void *accel_priv, select_queue_fallback_t fallback)
370370
{
371371
struct tun_struct *tun = netdev_priv(dev);
372372
struct tun_flow_entry *e;

0 commit comments

Comments
 (0)