Message ID | 1332321903-11704-6-git-send-email-amirv@mellanox.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On 3/21/2012 2:25 AM, Amir Vadai wrote: > From: Amir Vadai <amirv@mellanox.co.il> > > Since vlan egress map is only good for tagged traffic, need to have other > mapping to be used by untagged traffic. > For that, the driver uses sch_mqprio mapping. This mapping could be set by > using tc tool from iproute2 package. > Mapped UP will be used by the HW for QoS purposes, but won't go out on the > wire. > > Signed-off-by: Amir Vadai <amirv@mellanox.com> > --- [...] > diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c > index 445a771..f228728 100644 > --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c > +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c > @@ -570,15 +570,15 @@ static void build_inline_wqe(struct mlx4_en_tx_desc *tx_desc, struct sk_buff *sk > > u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb) > { > - u16 vlan_tag = 0; > + int up = -1; > > - /* If we support per priority flow control and the packet contains > - * a vlan tag, send the packet to the TX ring assigned to that priority > - */ > - if (vlan_tx_tag_present(skb)) { > - vlan_tag = vlan_tx_tag_get(skb); > - return MLX4_EN_NUM_TX_RINGS + (vlan_tag >> 13); > - } > + if (vlan_tx_tag_present(skb)) > + up = (vlan_tx_tag_get(skb) >> 13); > + else if (dev->num_tc) > + up = netdev_get_prio_tc_map(dev, skb->priority); > + > + if (up >= 0) > + return MLX4_EN_NUM_TX_RINGS + up; I expected the else case covered by the netdev_set_tc_queue() setup above? Did I miss something. > > return __skb_tx_hash(dev, skb, MLX4_EN_NUM_TX_RINGS); > } -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 03/21/2012 04:20 PM, John Fastabend wrote: > On 3/21/2012 2:25 AM, Amir Vadai wrote: >> From: Amir Vadai<amirv@mellanox.co.il> >> >> Since vlan egress map is only good for tagged traffic, need to have other >> mapping to be used by untagged traffic. >> For that, the driver uses sch_mqprio mapping. This mapping could be set by >> using tc tool from iproute2 package. >> Mapped UP will be used by the HW for QoS purposes, but won't go out on the >> wire. >> >> Signed-off-by: Amir Vadai<amirv@mellanox.com> >> --- > > [...] > >> diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c >> index 445a771..f228728 100644 >> --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c >> +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c >> @@ -570,15 +570,15 @@ static void build_inline_wqe(struct mlx4_en_tx_desc *tx_desc, struct sk_buff *sk >> >> u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb) >> { >> - u16 vlan_tag = 0; >> + int up = -1; >> >> - /* If we support per priority flow control and the packet contains >> - * a vlan tag, send the packet to the TX ring assigned to that priority >> - */ >> - if (vlan_tx_tag_present(skb)) { >> - vlan_tag = vlan_tx_tag_get(skb); >> - return MLX4_EN_NUM_TX_RINGS + (vlan_tag>> 13); >> - } >> + if (vlan_tx_tag_present(skb)) >> + up = (vlan_tx_tag_get(skb)>> 13); >> + else if (dev->num_tc) >> + up = netdev_get_prio_tc_map(dev, skb->priority); >> + >> + if (up>= 0) >> + return MLX4_EN_NUM_TX_RINGS + up; > > I expected the else case covered by the netdev_set_tc_queue() setup above? Did > I miss something. > It is me who missed something, will fix it in V2 >> >> return __skb_tx_hash(dev, skb, MLX4_EN_NUM_TX_RINGS); >> } > - Amir -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index f45d544..22c4da6 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c @@ -45,6 +45,14 @@ #include "mlx4_en.h" #include "en_port.h" +static int mlx4_en_setup_tc(struct net_device *dev, u8 up) +{ + if (up != MLX4_EN_NUM_UP) + return -EINVAL; + + return 0; +} + static int mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) { struct mlx4_en_priv *priv = netdev_priv(dev); @@ -1055,6 +1063,7 @@ static const struct net_device_ops mlx4_netdev_ops = { .ndo_poll_controller = mlx4_en_netpoll, #endif .ndo_set_features = mlx4_en_set_features, + .ndo_setup_tc = mlx4_en_setup_tc, }; int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, @@ -1143,6 +1152,12 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, netif_set_real_num_tx_queues(dev, priv->tx_ring_num); netif_set_real_num_rx_queues(dev, priv->rx_ring_num); + netdev_set_num_tc(dev, MLX4_EN_NUM_UP); + + /* Partition Tx queues evenly amongst UP's */ + for (i = 0; i < MLX4_EN_NUM_UP; i++) + netdev_set_tc_queue(dev, i, 1, MLX4_EN_NUM_TX_RINGS + i); + SET_ETHTOOL_OPS(dev, &mlx4_en_ethtool_ops); /* Set defualt MAC */ diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index 445a771..f228728 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c @@ -570,15 +570,15 @@ static void build_inline_wqe(struct mlx4_en_tx_desc *tx_desc, struct sk_buff *sk u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb) { - u16 vlan_tag = 0; + int up = -1; - /* If we support per priority flow control and the packet contains - * a vlan tag, send the packet to the TX ring assigned to that priority - */ - if (vlan_tx_tag_present(skb)) { - vlan_tag = vlan_tx_tag_get(skb); - return MLX4_EN_NUM_TX_RINGS + (vlan_tag >> 13); - } + if (vlan_tx_tag_present(skb)) + up = (vlan_tx_tag_get(skb) >> 13); + else if (dev->num_tc) + up = netdev_get_prio_tc_map(dev, skb->priority); + + if (up >= 0) + return MLX4_EN_NUM_TX_RINGS + up; return __skb_tx_hash(dev, skb, MLX4_EN_NUM_TX_RINGS); }