From: Brett Creeley <bcreeley@amd.com>
To: Michal Kubiak <michal.kubiak@intel.com>,
intel-wired-lan@lists.osuosl.org
Cc: maciej.fijalkowski@intel.com, emil.s.tantilov@intel.com,
larysa.zaremba@intel.com, netdev@vger.kernel.org,
joshua.a.hay@intel.com, aleksander.lobakin@intel.com,
alan.brady@intel.com,
Przemek Kitszel <przemyslaw.kitszel@intel.com>
Subject: Re: [Intel-wired-lan] [PATCH iwl-net] idpf: enable WB_ON_ITR
Date: Fri, 15 Dec 2023 10:01:36 -0800 [thread overview]
Message-ID: <9ea0484d-a2a4-308c-95fd-c9accdcdc424@amd.com> (raw)
In-Reply-To: <20231212145546.396273-1-michal.kubiak@intel.com>
On 12/12/2023 6:55 AM, Michal Kubiak wrote:
> Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.
>
>
> From: Joshua Hay <joshua.a.hay@intel.com>
>
> Tell hardware to writeback completed descriptors even when interrupts
> are disabled. Otherwise, descriptors might not be written back until
> the hardware can flush a full cacheline of descriptors. This can cause
> unnecessary delays when traffic is light (or even trigger Tx queue
> timeout).
>
> Fixes: c2d548cad150 ("idpf: add TX splitq napi poll support")
> Fixes: a5ab9ee0df0b ("idpf: add singleq start_xmit and napi poll")
> Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
> Reviewed-by: Alexander Lobakin <aleksander.lobakin@intel.com>
> Signed-off-by: Joshua Hay <joshua.a.hay@intel.com>
> Co-developed-by: Michal Kubiak <michal.kubiak@intel.com>
> Signed-off-by: Michal Kubiak <michal.kubiak@intel.com>
> ---
> drivers/net/ethernet/intel/idpf/idpf_dev.c | 2 ++
> .../ethernet/intel/idpf/idpf_singleq_txrx.c | 6 ++++-
> drivers/net/ethernet/intel/idpf/idpf_txrx.c | 7 +++++-
> drivers/net/ethernet/intel/idpf/idpf_txrx.h | 23 +++++++++++++++++++
> drivers/net/ethernet/intel/idpf/idpf_vf_dev.c | 2 ++
> 5 files changed, 38 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/idpf/idpf_dev.c b/drivers/net/ethernet/intel/idpf/idpf_dev.c
> index 34ad1ac46b78..2c6776086130 100644
> --- a/drivers/net/ethernet/intel/idpf/idpf_dev.c
> +++ b/drivers/net/ethernet/intel/idpf/idpf_dev.c
> @@ -96,8 +96,10 @@ static int idpf_intr_reg_init(struct idpf_vport *vport)
> intr->dyn_ctl = idpf_get_reg_addr(adapter,
> reg_vals[vec_id].dyn_ctl_reg);
> intr->dyn_ctl_intena_m = PF_GLINT_DYN_CTL_INTENA_M;
> + intr->dyn_ctl_intena_msk_m = PF_GLINT_DYN_CTL_INTENA_MSK_M;
> intr->dyn_ctl_itridx_s = PF_GLINT_DYN_CTL_ITR_INDX_S;
> intr->dyn_ctl_intrvl_s = PF_GLINT_DYN_CTL_INTERVAL_S;
> + intr->dyn_ctl_wb_on_itr_m = PF_GLINT_DYN_CTL_WB_ON_ITR_M;
>
> spacing = IDPF_ITR_IDX_SPACING(reg_vals[vec_id].itrn_index_spacing,
> IDPF_PF_ITR_IDX_SPACING);
> diff --git a/drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c
> index 81288a17da2a..8e1478b7d86c 100644
> --- a/drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c
> +++ b/drivers/net/ethernet/intel/idpf/idpf_singleq_txrx.c
> @@ -1168,8 +1168,10 @@ int idpf_vport_singleq_napi_poll(struct napi_struct *napi, int budget)
> &work_done);
>
> /* If work not completed, return budget and polling will return */
> - if (!clean_complete)
> + if (!clean_complete) {
> + idpf_vport_intr_set_wb_on_itr(q_vector);
> return budget;
> + }
>
> work_done = min_t(int, work_done, budget - 1);
>
> @@ -1178,6 +1180,8 @@ int idpf_vport_singleq_napi_poll(struct napi_struct *napi, int budget)
> */
> if (likely(napi_complete_done(napi, work_done)))
> idpf_vport_intr_update_itr_ena_irq(q_vector);
> + else
> + idpf_vport_intr_set_wb_on_itr(q_vector);
>
> return work_done;
> }
> diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.c b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
> index 1646ff3877ba..b496566ee2aa 100644
> --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.c
> +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.c
> @@ -3639,6 +3639,7 @@ void idpf_vport_intr_update_itr_ena_irq(struct idpf_q_vector *q_vector)
> IDPF_NO_ITR_UPDATE_IDX, 0);
>
> writel(intval, q_vector->intr_reg.dyn_ctl);
> + q_vector->wb_on_itr = false;
> }
>
> /**
> @@ -3930,8 +3931,10 @@ static int idpf_vport_splitq_napi_poll(struct napi_struct *napi, int budget)
> clean_complete &= idpf_tx_splitq_clean_all(q_vector, budget, &work_done);
>
> /* If work not completed, return budget and polling will return */
> - if (!clean_complete)
> + if (!clean_complete) {
> + idpf_vport_intr_set_wb_on_itr(q_vector);
> return budget;
> + }
>
> work_done = min_t(int, work_done, budget - 1);
>
> @@ -3940,6 +3943,8 @@ static int idpf_vport_splitq_napi_poll(struct napi_struct *napi, int budget)
> */
> if (likely(napi_complete_done(napi, work_done)))
> idpf_vport_intr_update_itr_ena_irq(q_vector);
> + else
> + idpf_vport_intr_set_wb_on_itr(q_vector);
>
> /* Switch to poll mode in the tear-down path after sending disable
> * queues virtchnl message, as the interrupts will be disabled after
> diff --git a/drivers/net/ethernet/intel/idpf/idpf_txrx.h b/drivers/net/ethernet/intel/idpf/idpf_txrx.h
> index df76493faa75..50761c2d9f3b 100644
> --- a/drivers/net/ethernet/intel/idpf/idpf_txrx.h
> +++ b/drivers/net/ethernet/intel/idpf/idpf_txrx.h
> @@ -495,9 +495,11 @@ struct idpf_vec_regs {
> struct idpf_intr_reg {
> void __iomem *dyn_ctl;
> u32 dyn_ctl_intena_m;
> + u32 dyn_ctl_intena_msk_m;
> u32 dyn_ctl_itridx_s;
> u32 dyn_ctl_itridx_m;
> u32 dyn_ctl_intrvl_s;
> + u32 dyn_ctl_wb_on_itr_m;
> void __iomem *rx_itr;
> void __iomem *tx_itr;
> void __iomem *icr_ena;
> @@ -534,6 +536,7 @@ struct idpf_q_vector {
> struct napi_struct napi;
> u16 v_idx;
> struct idpf_intr_reg intr_reg;
> + bool wb_on_itr;
Not sure if this was considered, but it might be best to put this before
intr_reg so it's on the same cacheline as intr_reg.
>
> u16 num_txq;
> struct idpf_queue **tx;
> @@ -973,6 +976,26 @@ static inline void idpf_rx_sync_for_cpu(struct idpf_rx_buf *rx_buf, u32 len)
> page_pool_get_dma_dir(pp));
> }
>
> +/**
> + * idpf_vport_intr_set_wb_on_itr - enable descriptor writeback on disabled interrupts
> + * @q_vector: pointer to queue vector struct
> + */
> +static inline void idpf_vport_intr_set_wb_on_itr(struct idpf_q_vector *q_vector)
> +{
> + struct idpf_intr_reg *reg;
> +
> + if (q_vector->wb_on_itr)
> + return;
> +
> + reg = &q_vector->intr_reg;
> +
> + writel(reg->dyn_ctl_wb_on_itr_m | reg->dyn_ctl_intena_msk_m |
> + IDPF_NO_ITR_UPDATE_IDX << reg->dyn_ctl_itridx_s,
> + reg->dyn_ctl);
> +
> + q_vector->wb_on_itr = true;
> +}
> +
> int idpf_vport_singleq_napi_poll(struct napi_struct *napi, int budget);
> void idpf_vport_init_num_qs(struct idpf_vport *vport,
> struct virtchnl2_create_vport *vport_msg);
> diff --git a/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c b/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c
> index 8ade4e3a9fe1..f5b0a0666636 100644
> --- a/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c
> +++ b/drivers/net/ethernet/intel/idpf/idpf_vf_dev.c
> @@ -96,7 +96,9 @@ static int idpf_vf_intr_reg_init(struct idpf_vport *vport)
> intr->dyn_ctl = idpf_get_reg_addr(adapter,
> reg_vals[vec_id].dyn_ctl_reg);
> intr->dyn_ctl_intena_m = VF_INT_DYN_CTLN_INTENA_M;
> + intr->dyn_ctl_intena_msk_m = VF_INT_DYN_CTLN_INTENA_MSK_M;
> intr->dyn_ctl_itridx_s = VF_INT_DYN_CTLN_ITR_INDX_S;
> + intr->dyn_ctl_wb_on_itr_m = VF_INT_DYN_CTLN_WB_ON_ITR_M;
>
> spacing = IDPF_ITR_IDX_SPACING(reg_vals[vec_id].itrn_index_spacing,
> IDPF_VF_ITR_IDX_SPACING);
> --
> 2.33.1
>
>
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
next prev parent reply other threads:[~2023-12-15 18:01 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-12 14:55 [Intel-wired-lan] [PATCH iwl-net] idpf: enable WB_ON_ITR Michal Kubiak
2023-12-12 16:50 ` Paul Menzel
2023-12-13 13:23 ` Michal Kubiak
2023-12-13 13:51 ` Michal Kubiak
2023-12-13 22:22 ` Nguyen, Anthony L
2023-12-13 23:06 ` Tony Nguyen
2023-12-15 17:27 ` Michal Kubiak
2023-12-14 12:59 ` Paul Menzel
2023-12-15 17:32 ` Michal Kubiak
2023-12-15 18:01 ` Brett Creeley [this message]
2023-12-15 19:04 ` Michal Kubiak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9ea0484d-a2a4-308c-95fd-c9accdcdc424@amd.com \
--to=bcreeley@amd.com \
--cc=alan.brady@intel.com \
--cc=aleksander.lobakin@intel.com \
--cc=emil.s.tantilov@intel.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=joshua.a.hay@intel.com \
--cc=larysa.zaremba@intel.com \
--cc=maciej.fijalkowski@intel.com \
--cc=michal.kubiak@intel.com \
--cc=netdev@vger.kernel.org \
--cc=przemyslaw.kitszel@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox