[Intel-wired-lan] [PATCH S30 2/9] ice: get rid of per-tc flow in Tx queue configuration routines
Bowers, AndrewX
andrewx.bowers at intel.com
Tue Oct 15 18:18:43 UTC 2019
> -----Original Message-----
> From: Intel-wired-lan [mailto:intel-wired-lan-bounces at osuosl.org] On
> Behalf Of Tony Nguyen
> Sent: Wednesday, October 9, 2019 7:09 AM
> To: intel-wired-lan at lists.osuosl.org
> Subject: [Intel-wired-lan] [PATCH S30 2/9] ice: get rid of per-tc flow in Tx
> queue configuration routines
>
> From: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
>
> There's no reason for treating DCB as first class citizen when configuring the
> Tx queues and going through TCs. Reverse the logic and base the
> configuration logic on rings, which is the object of interest anyway.
>
> Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski at intel.com>
> Signed-off-by: Tony Nguyen <anthony.l.nguyen at intel.com>
> ---
> drivers/net/ethernet/intel/ice/ice_base.c | 29 +++++++++--
> drivers/net/ethernet/intel/ice/ice_base.h | 4 +-
> drivers/net/ethernet/intel/ice/ice_lib.c | 63 ++++++++---------------
> 3 files changed, 47 insertions(+), 49 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_base.c
> b/drivers/net/ethernet/intel/ice/ice_base.c
> index 735922a4d632..1dd9c18ecd8c 100644
> --- a/drivers/net/ethernet/intel/ice/ice_base.c
> +++ b/drivers/net/ethernet/intel/ice/ice_base.c
> @@ -190,6 +190,21 @@ static void ice_cfg_itr_gran(struct ice_hw *hw)
> wr32(hw, GLINT_CTL, regval);
> }
>
> +/**
> + * ice_calc_q_handle - calculate the queue handle
> + * @vsi: VSI that ring belongs to
> + * @ring: ring to get the absolute queue index
> + * @tc: traffic class number
> + */
> +static u16 ice_calc_q_handle(struct ice_vsi *vsi, struct ice_ring
> +*ring, u8 tc) {
> + /* idea here for calculation is that we subtract the number of queue
> + * count from TC that ring belongs to from its absolute queue index
> + * and as a result we get the queue's index within TC.
> + */
This should be reworded; as is it's confusing.
> + return ring->q_index - vsi->tc_cfg.tc_info[tc].qoffset; }
> +
> /**
> * ice_setup_tx_ctx - setup a struct ice_tlan_ctx instance
> * @ring: The Tx ring to configure
> @@ -522,13 +537,11 @@ void ice_vsi_free_q_vectors(struct ice_vsi *vsi)
> * ice_vsi_cfg_txq - Configure single Tx queue
> * @vsi: the VSI that queue belongs to
> * @ring: Tx ring to be configured
> - * @tc_q_idx: queue index within given TC
> * @qg_buf: queue group buffer
> - * @tc: TC that Tx ring belongs to
> */
> int
> -ice_vsi_cfg_txq(struct ice_vsi *vsi, struct ice_ring *ring, u16 tc_q_idx,
> - struct ice_aqc_add_tx_qgrp *qg_buf, u8 tc)
> +ice_vsi_cfg_txq(struct ice_vsi *vsi, struct ice_ring *ring,
> + struct ice_aqc_add_tx_qgrp *qg_buf)
> {
> struct ice_tlan_ctx tlan_ctx = { 0 };
> struct ice_aqc_add_txqs_perq *txq;
> @@ -536,6 +549,7 @@ ice_vsi_cfg_txq(struct ice_vsi *vsi, struct ice_ring
> *ring, u16 tc_q_idx,
> u8 buf_len = sizeof(*qg_buf);
> enum ice_status status;
> u16 pf_q;
> + u8 tc;
>
> pf_q = ring->reg_idx;
> ice_setup_tx_ctx(ring, &tlan_ctx, pf_q); @@ -549,10 +563,15 @@
> ice_vsi_cfg_txq(struct ice_vsi *vsi, struct ice_ring *ring, u16 tc_q_idx,
> */
> ring->tail = pf->hw.hw_addr + QTX_COMM_DBELL(pf_q);
>
> + if (IS_ENABLED(CONFIG_DCB))
> + tc = ring->dcb_tc;
> + else
> + tc = 0;
> +
> /* Add unique software queue handle of the Tx queue per
> * TC into the VSI Tx ring
> */
> - ring->q_handle = tc_q_idx;
> + ring->q_handle = ice_calc_q_handle(vsi, ring, tc);
>
> status = ice_ena_vsi_txq(vsi->port_info, vsi->idx, tc, ring->q_handle,
> 1, qg_buf, buf_len, NULL);
> diff --git a/drivers/net/ethernet/intel/ice/ice_base.h
> b/drivers/net/ethernet/intel/ice/ice_base.h
> index db456862b35b..407995e8e944 100644
> --- a/drivers/net/ethernet/intel/ice/ice_base.h
> +++ b/drivers/net/ethernet/intel/ice/ice_base.h
> @@ -13,8 +13,8 @@ int ice_vsi_alloc_q_vectors(struct ice_vsi *vsi); void
> ice_vsi_map_rings_to_vectors(struct ice_vsi *vsi); void
> ice_vsi_free_q_vectors(struct ice_vsi *vsi); int -ice_vsi_cfg_txq(struct
> ice_vsi *vsi, struct ice_ring *ring, u16 tc_q_idx,
> - struct ice_aqc_add_tx_qgrp *qg_buf, u8 tc);
> +ice_vsi_cfg_txq(struct ice_vsi *vsi, struct ice_ring *ring,
> + struct ice_aqc_add_tx_qgrp *qg_buf);
> void ice_cfg_itr(struct ice_hw *hw, struct ice_q_vector *q_vector); void
> ice_cfg_txq_interrupt(struct ice_vsi *vsi, u16 txq, u16 msix_idx, u16 itr_idx);
> diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c
> b/drivers/net/ethernet/intel/ice/ice_lib.c
> index fe7f43d2e734..74c3bd191671 100644
> --- a/drivers/net/ethernet/intel/ice/ice_lib.c
> +++ b/drivers/net/ethernet/intel/ice/ice_lib.c
> @@ -1260,42 +1260,31 @@ int ice_vsi_cfg_rxqs(struct ice_vsi *vsi)
> * ice_vsi_cfg_txqs - Configure the VSI for Tx
> * @vsi: the VSI being configured
> * @rings: Tx ring array to be configured
> - * @offset: offset within vsi->txq_map
> *
> * Return 0 on success and a negative value on error
> * Configure the Tx VSI for operation.
> */
> static int
> -ice_vsi_cfg_txqs(struct ice_vsi *vsi, struct ice_ring **rings, int offset)
> +ice_vsi_cfg_txqs(struct ice_vsi *vsi, struct ice_ring **rings)
> {
> struct ice_aqc_add_tx_qgrp *qg_buf;
> - struct ice_pf *pf = vsi->back;
> - u16 q_idx = 0, i;
> + u16 q_idx = 0;
> int err = 0;
> - u8 tc;
>
> - qg_buf = devm_kzalloc(&pf->pdev->dev, sizeof(*qg_buf),
> GFP_KERNEL);
> + qg_buf = kzalloc(sizeof(*qg_buf), GFP_KERNEL);
> if (!qg_buf)
> return -ENOMEM;
>
> qg_buf->num_txqs = 1;
>
> - /* set up and configure the Tx queues for each enabled TC */
> - ice_for_each_traffic_class(tc) {
> - if (!(vsi->tc_cfg.ena_tc & BIT(tc)))
> - break;
> -
> - for (i = 0; i < vsi->tc_cfg.tc_info[tc].qcount_tx; i++) {
> - err = ice_vsi_cfg_txq(vsi, rings[q_idx], i + offset,
> - qg_buf, tc);
> - if (err)
> - goto err_cfg_txqs;
> -
> - q_idx++;
> - }
> + for (q_idx = 0; q_idx < vsi->num_txq; q_idx++) {
> + err = ice_vsi_cfg_txq(vsi, rings[q_idx], qg_buf);
> + if (err)
> + goto err_cfg_txqs;
> }
> +
> err_cfg_txqs:
> - devm_kfree(&pf->pdev->dev, qg_buf);
> + kfree(qg_buf);
> return err;
> }
>
> @@ -1308,7 +1297,7 @@ ice_vsi_cfg_txqs(struct ice_vsi *vsi, struct ice_ring
> **rings, int offset)
> */
> int ice_vsi_cfg_lan_txqs(struct ice_vsi *vsi) {
> - return ice_vsi_cfg_txqs(vsi, vsi->tx_rings, 0);
> + return ice_vsi_cfg_txqs(vsi, vsi->tx_rings);
> }
>
> /**
> @@ -1498,34 +1487,24 @@ static int
> ice_vsi_stop_tx_rings(struct ice_vsi *vsi, enum ice_disq_rst_src rst_src,
> u16 rel_vmvf_num, struct ice_ring **rings) {
> - u16 i, q_idx = 0;
> - int status;
> - u8 tc;
> + u16 q_idx;
>
> if (vsi->num_txq > ICE_LAN_TXQ_MAX_QDIS)
> return -EINVAL;
>
> - /* set up the Tx queue list to be disabled for each enabled TC */
> - ice_for_each_traffic_class(tc) {
> - if (!(vsi->tc_cfg.ena_tc & BIT(tc)))
> - break;
> -
> - for (i = 0; i < vsi->tc_cfg.tc_info[tc].qcount_tx; i++) {
> - struct ice_txq_meta txq_meta = { };
> + for (q_idx = 0; q_idx < vsi->num_txq; q_idx++) {
> + struct ice_txq_meta txq_meta = { };
> + int status;
>
> - if (!rings || !rings[q_idx])
> - return -EINVAL;
> + if (!rings || !rings[q_idx])
> + return -EINVAL;
>
> - ice_fill_txq_meta(vsi, rings[q_idx], &txq_meta);
> - status = ice_vsi_stop_tx_ring(vsi, rst_src,
> - rel_vmvf_num,
> - rings[q_idx], &txq_meta);
> + ice_fill_txq_meta(vsi, rings[q_idx], &txq_meta);
> + status = ice_vsi_stop_tx_ring(vsi, rst_src, rel_vmvf_num,
> + rings[q_idx], &txq_meta);
>
> - if (status)
> - return status;
> -
> - q_idx++;
> - }
> + if (status)
> + return status;
> }
>
> return 0;
> --
> 2.20.1
>
> _______________________________________________
> Intel-wired-lan mailing list
> Intel-wired-lan at osuosl.org
> https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
More information about the Intel-wired-lan
mailing list