Commit 479cdfe3 authored by Sridhar Samudrala's avatar Sridhar Samudrala Committed by Tony Nguyen

ice: Fix tx queue rate limit when TCs are configured

Configuring tx_maxrate via sysfs interface
/sys/class/net/eth0/queues/tx-1/tx_maxrate was not working when
TCs are configured because always main VSI was being used. Fix by
using correct VSI in ice_set_tx_maxrate when TCs are configured.

Fixes: 1ddef455 ("ice: Add NDO callback to set the maximum per-queue bitrate")
Signed-off-by: default avatarSridhar Samudrala <sridhar.samudrala@intel.com>
Signed-off-by: default avatarSudheer Mogilappagari <sudheer.mogilappagari@intel.com>
Tested-by: default avatarBharathi Sreenivas <bharathi.sreenivas@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 5f16da6e
...@@ -5739,6 +5739,13 @@ ice_set_tx_maxrate(struct net_device *netdev, int queue_index, u32 maxrate) ...@@ -5739,6 +5739,13 @@ ice_set_tx_maxrate(struct net_device *netdev, int queue_index, u32 maxrate)
q_handle = vsi->tx_rings[queue_index]->q_handle; q_handle = vsi->tx_rings[queue_index]->q_handle;
tc = ice_dcb_get_tc(vsi, queue_index); tc = ice_dcb_get_tc(vsi, queue_index);
vsi = ice_locate_vsi_using_queue(vsi, queue_index);
if (!vsi) {
netdev_err(netdev, "Invalid VSI for given queue %d\n",
queue_index);
return -EINVAL;
}
/* Set BW back to default, when user set maxrate to 0 */ /* Set BW back to default, when user set maxrate to 0 */
if (!maxrate) if (!maxrate)
status = ice_cfg_q_bw_dflt_lmt(vsi->port_info, vsi->idx, tc, status = ice_cfg_q_bw_dflt_lmt(vsi->port_info, vsi->idx, tc,
......
...@@ -750,17 +750,16 @@ ice_eswitch_add_tc_fltr(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr) ...@@ -750,17 +750,16 @@ ice_eswitch_add_tc_fltr(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr)
/** /**
* ice_locate_vsi_using_queue - locate VSI using queue (forward to queue action) * ice_locate_vsi_using_queue - locate VSI using queue (forward to queue action)
* @vsi: Pointer to VSI * @vsi: Pointer to VSI
* @tc_fltr: Pointer to tc_flower_filter * @queue: Queue index
* *
* Locate the VSI using specified queue. When ADQ is not enabled, always * Locate the VSI using specified "queue". When ADQ is not enabled,
* return input VSI, otherwise locate corresponding VSI based on per channel * always return input VSI, otherwise locate corresponding
* offset and qcount * VSI based on per channel "offset" and "qcount"
*/ */
static struct ice_vsi * struct ice_vsi *
ice_locate_vsi_using_queue(struct ice_vsi *vsi, ice_locate_vsi_using_queue(struct ice_vsi *vsi, int queue)
struct ice_tc_flower_fltr *tc_fltr)
{ {
int num_tc, tc, queue; int num_tc, tc;
/* if ADQ is not active, passed VSI is the candidate VSI */ /* if ADQ is not active, passed VSI is the candidate VSI */
if (!ice_is_adq_active(vsi->back)) if (!ice_is_adq_active(vsi->back))
...@@ -770,7 +769,6 @@ ice_locate_vsi_using_queue(struct ice_vsi *vsi, ...@@ -770,7 +769,6 @@ ice_locate_vsi_using_queue(struct ice_vsi *vsi,
* upon queue number) * upon queue number)
*/ */
num_tc = vsi->mqprio_qopt.qopt.num_tc; num_tc = vsi->mqprio_qopt.qopt.num_tc;
queue = tc_fltr->action.fwd.q.queue;
for (tc = 0; tc < num_tc; tc++) { for (tc = 0; tc < num_tc; tc++) {
int qcount = vsi->mqprio_qopt.qopt.count[tc]; int qcount = vsi->mqprio_qopt.qopt.count[tc];
...@@ -812,6 +810,7 @@ ice_tc_forward_action(struct ice_vsi *vsi, struct ice_tc_flower_fltr *tc_fltr) ...@@ -812,6 +810,7 @@ ice_tc_forward_action(struct ice_vsi *vsi, struct ice_tc_flower_fltr *tc_fltr)
struct ice_pf *pf = vsi->back; struct ice_pf *pf = vsi->back;
struct device *dev; struct device *dev;
u32 tc_class; u32 tc_class;
int q;
dev = ice_pf_to_dev(pf); dev = ice_pf_to_dev(pf);
...@@ -840,7 +839,8 @@ ice_tc_forward_action(struct ice_vsi *vsi, struct ice_tc_flower_fltr *tc_fltr) ...@@ -840,7 +839,8 @@ ice_tc_forward_action(struct ice_vsi *vsi, struct ice_tc_flower_fltr *tc_fltr)
/* Determine destination VSI even though the action is /* Determine destination VSI even though the action is
* FWD_TO_QUEUE, because QUEUE is associated with VSI * FWD_TO_QUEUE, because QUEUE is associated with VSI
*/ */
dest_vsi = tc_fltr->dest_vsi; q = tc_fltr->action.fwd.q.queue;
dest_vsi = ice_locate_vsi_using_queue(vsi, q);
break; break;
default: default:
dev_err(dev, dev_err(dev,
...@@ -1716,7 +1716,7 @@ ice_tc_forward_to_queue(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr, ...@@ -1716,7 +1716,7 @@ ice_tc_forward_to_queue(struct ice_vsi *vsi, struct ice_tc_flower_fltr *fltr,
/* If ADQ is configured, and the queue belongs to ADQ VSI, then prepare /* If ADQ is configured, and the queue belongs to ADQ VSI, then prepare
* ADQ switch filter * ADQ switch filter
*/ */
ch_vsi = ice_locate_vsi_using_queue(vsi, fltr); ch_vsi = ice_locate_vsi_using_queue(vsi, fltr->action.fwd.q.queue);
if (!ch_vsi) if (!ch_vsi)
return -EINVAL; return -EINVAL;
fltr->dest_vsi = ch_vsi; fltr->dest_vsi = ch_vsi;
......
...@@ -204,6 +204,7 @@ static inline int ice_chnl_dmac_fltr_cnt(struct ice_pf *pf) ...@@ -204,6 +204,7 @@ static inline int ice_chnl_dmac_fltr_cnt(struct ice_pf *pf)
return pf->num_dmac_chnl_fltrs; return pf->num_dmac_chnl_fltrs;
} }
struct ice_vsi *ice_locate_vsi_using_queue(struct ice_vsi *vsi, int queue);
int int
ice_add_cls_flower(struct net_device *netdev, struct ice_vsi *vsi, ice_add_cls_flower(struct net_device *netdev, struct ice_vsi *vsi,
struct flow_cls_offload *cls_flower); struct flow_cls_offload *cls_flower);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment