[PATCH] drivers: limit SSO interrupt allocation count in cnxk PMD
Jerin Jacob
jerinjacobk at gmail.com
Wed Jan 18 11:06:29 CET 2023
On Fri, Dec 2, 2022 at 8:17 PM Shijith Thotton <sthotton at marvell.com> wrote:
>
> Each SSO PF supports 1024 MSI-X interrupt vectors and the driver is
> allocating that many by default during probe. But this many vectors may
> not be needed for all applications. Required number of vectors can be
> calculated during init and allocation can be limited to that number.
>
> Signed-off-by: Shijith Thotton <sthotton at marvell.com>
Updated the git commit heading as follows and applied to
dpdk-next-net-eventdev/for-main. Thanks
common/cnxk: limit SSO interrupt allocation count
> ---
> drivers/common/cnxk/roc_dev.c | 12 ++---
> drivers/common/cnxk/roc_dev_priv.h | 5 ++
> drivers/common/cnxk/roc_irq.c | 11 ++++
> drivers/common/cnxk/roc_sso.c | 78 ++++++++++++++++++++++++++++-
> drivers/common/cnxk/roc_sso.h | 4 +-
> drivers/common/cnxk/roc_tim.c | 36 +++++++++----
> drivers/common/cnxk/roc_tim_priv.h | 2 +
> drivers/event/cnxk/cn10k_eventdev.c | 5 +-
> drivers/event/cnxk/cn9k_eventdev.c | 5 +-
> 9 files changed, 138 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/common/cnxk/roc_dev.c b/drivers/common/cnxk/roc_dev.c
> index 59128a3552..7b51c56b3b 100644
> --- a/drivers/common/cnxk/roc_dev.c
> +++ b/drivers/common/cnxk/roc_dev.c
> @@ -741,8 +741,8 @@ mbox_register_vf_irq(struct plt_pci_device *pci_dev, struct dev *dev)
> return rc;
> }
>
> -static int
> -mbox_register_irq(struct plt_pci_device *pci_dev, struct dev *dev)
> +int
> +dev_mbox_register_irq(struct plt_pci_device *pci_dev, struct dev *dev)
> {
> if (dev_is_vf(dev))
> return mbox_register_vf_irq(pci_dev, dev);
> @@ -886,8 +886,8 @@ vf_flr_unregister_irqs(struct plt_pci_device *pci_dev, struct dev *dev)
> return 0;
> }
>
> -static int
> -vf_flr_register_irqs(struct plt_pci_device *pci_dev, struct dev *dev)
> +int
> +dev_vf_flr_register_irqs(struct plt_pci_device *pci_dev, struct dev *dev)
> {
> struct plt_intr_handle *handle = pci_dev->intr_handle;
> int i, rc;
> @@ -1199,7 +1199,7 @@ dev_init(struct dev *dev, struct plt_pci_device *pci_dev)
> goto mbox_fini;
>
> /* Register mbox interrupts */
> - rc = mbox_register_irq(pci_dev, dev);
> + rc = dev_mbox_register_irq(pci_dev, dev);
> if (rc)
> goto mbox_fini;
>
> @@ -1242,7 +1242,7 @@ dev_init(struct dev *dev, struct plt_pci_device *pci_dev)
>
> /* Register VF-FLR irq handlers */
> if (!dev_is_vf(dev)) {
> - rc = vf_flr_register_irqs(pci_dev, dev);
> + rc = dev_vf_flr_register_irqs(pci_dev, dev);
> if (rc)
> goto iounmap;
> }
> diff --git a/drivers/common/cnxk/roc_dev_priv.h b/drivers/common/cnxk/roc_dev_priv.h
> index 302dc0feb0..4217ec4af8 100644
> --- a/drivers/common/cnxk/roc_dev_priv.h
> +++ b/drivers/common/cnxk/roc_dev_priv.h
> @@ -89,6 +89,7 @@ struct dev {
> struct dev_ops *ops;
> void *roc_nix;
> void *roc_cpt;
> + void *roc_tim;
> bool disable_shared_lmt; /* false(default): shared lmt mode enabled */
> const struct plt_memzone *lmt_mz;
> } __plt_cache_aligned;
> @@ -110,5 +111,9 @@ int dev_irq_register(struct plt_intr_handle *intr_handle,
> void dev_irq_unregister(struct plt_intr_handle *intr_handle,
> plt_intr_callback_fn cb, void *data, unsigned int vec);
> int dev_irqs_disable(struct plt_intr_handle *intr_handle);
> +int dev_irq_reconfigure(struct plt_intr_handle *intr_handle, uint16_t max_intr);
> +
> +int dev_mbox_register_irq(struct plt_pci_device *pci_dev, struct dev *dev);
> +int dev_vf_flr_register_irqs(struct plt_pci_device *pci_dev, struct dev *dev);
>
> #endif /* _ROC_DEV_PRIV_H */
> diff --git a/drivers/common/cnxk/roc_irq.c b/drivers/common/cnxk/roc_irq.c
> index 010b121176..a709c4047d 100644
> --- a/drivers/common/cnxk/roc_irq.c
> +++ b/drivers/common/cnxk/roc_irq.c
> @@ -124,6 +124,17 @@ dev_irqs_disable(struct plt_intr_handle *intr_handle)
> return plt_intr_disable(intr_handle);
> }
>
> +int
> +dev_irq_reconfigure(struct plt_intr_handle *intr_handle, uint16_t max_intr)
> +{
> + /* Disable interrupts if enabled. */
> + if (plt_intr_max_intr_get(intr_handle))
> + dev_irqs_disable(intr_handle);
> +
> + plt_intr_max_intr_set(intr_handle, max_intr);
> + return irq_init(intr_handle);
> +}
> +
> int
> dev_irq_register(struct plt_intr_handle *intr_handle, plt_intr_callback_fn cb,
> void *data, unsigned int vec)
> diff --git a/drivers/common/cnxk/roc_sso.c b/drivers/common/cnxk/roc_sso.c
> index 6989884373..fcd8869c82 100644
> --- a/drivers/common/cnxk/roc_sso.c
> +++ b/drivers/common/cnxk/roc_sso.c
> @@ -656,11 +656,57 @@ roc_sso_hwgrp_set_priority(struct roc_sso *roc_sso, uint16_t hwgrp,
> return rc;
> }
>
> +static int
> +sso_update_msix_vec_count(struct roc_sso *roc_sso, uint16_t sso_vec_cnt)
> +{
> + struct plt_pci_device *pci_dev = roc_sso->pci_dev;
> + struct sso *sso = roc_sso_to_sso_priv(roc_sso);
> + uint16_t mbox_vec_cnt, npa_vec_cnt;
> + struct dev *dev = &sso->dev;
> + struct idev_cfg *idev;
> + int rc;
> +
> + idev = idev_get_cfg();
> + if (idev == NULL)
> + return -ENODEV;
> +
> + mbox_vec_cnt = RVU_PF_INT_VEC_AFPF_MBOX + 1;
> +
> + /* Allocating vectors for the first time */
> + if (plt_intr_max_intr_get(pci_dev->intr_handle) == 0) {
> + npa_vec_cnt = idev->npa_refcnt ? 0 : NPA_LF_INT_VEC_POISON + 1;
> + return dev_irq_reconfigure(pci_dev->intr_handle, mbox_vec_cnt + npa_vec_cnt);
> + }
> +
> + npa_vec_cnt = (dev->npa.pci_dev == pci_dev) ? NPA_LF_INT_VEC_POISON + 1 : 0;
> +
> + /* Re-configure to include SSO vectors */
> + rc = dev_irq_reconfigure(pci_dev->intr_handle, mbox_vec_cnt + npa_vec_cnt + sso_vec_cnt);
> + if (rc)
> + return rc;
> +
> + rc = dev_mbox_register_irq(pci_dev, dev);
> + if (rc)
> + return rc;
> +
> + if (!dev_is_vf(dev)) {
> + rc = dev_vf_flr_register_irqs(pci_dev, dev);
> + if (rc)
> + return rc;
> + }
> +
> + if (npa_vec_cnt)
> + rc = npa_register_irqs(&dev->npa);
> +
> + return rc;
> +}
> +
> int
> -roc_sso_rsrc_init(struct roc_sso *roc_sso, uint8_t nb_hws, uint16_t nb_hwgrp)
> +roc_sso_rsrc_init(struct roc_sso *roc_sso, uint8_t nb_hws, uint16_t nb_hwgrp, uint16_t nb_tim_lfs)
> {
> struct sso *sso = roc_sso_to_sso_priv(roc_sso);
> struct sso_lf_alloc_rsp *rsp_hwgrp;
> + uint16_t sso_vec_cnt, free_tim_lfs;
> int rc;
>
> if (!nb_hwgrp || roc_sso->max_hwgrp < nb_hwgrp)
> @@ -704,6 +750,30 @@ roc_sso_rsrc_init(struct roc_sso *roc_sso, uint8_t nb_hws, uint16_t nb_hwgrp)
> goto sso_msix_fail;
> }
>
> + /* 1 error interrupt per SSO HWS/HWGRP */
> + sso_vec_cnt = nb_hws + nb_hwgrp;
> +
> + if (sso->dev.roc_tim) {
> + nb_tim_lfs = ((struct roc_tim *)sso->dev.roc_tim)->nb_lfs;
> + } else {
> + rc = tim_free_lf_count_get(&sso->dev, &free_tim_lfs);
> + if (rc < 0) {
> + plt_err("Failed to get TIM resource count");
> + goto sso_msix_fail;
> + }
> +
> + nb_tim_lfs = nb_tim_lfs ? PLT_MIN(nb_tim_lfs, free_tim_lfs) : free_tim_lfs;
> + }
> +
> + /* 2 error interrupt per TIM LF */
> + sso_vec_cnt += 2 * nb_tim_lfs;
> +
> + rc = sso_update_msix_vec_count(roc_sso, sso_vec_cnt);
> + if (rc < 0) {
> + plt_err("Failed to update SSO MSIX vector count");
> + goto sso_msix_fail;
> + }
> +
> rc = sso_register_irqs_priv(roc_sso, sso->pci_dev->intr_handle, nb_hws,
> nb_hwgrp);
> if (rc < 0) {
> @@ -768,6 +838,12 @@ roc_sso_dev_init(struct roc_sso *roc_sso)
> pci_dev = roc_sso->pci_dev;
> plt_spinlock_init(&sso->mbox_lock);
>
> + rc = sso_update_msix_vec_count(roc_sso, 0);
> + if (rc < 0) {
> + plt_err("Failed to set SSO MSIX vector count");
> + return rc;
> + }
> +
> rc = dev_init(&sso->dev, pci_dev);
> if (rc < 0) {
> plt_err("Failed to init roc device");
> diff --git a/drivers/common/cnxk/roc_sso.h b/drivers/common/cnxk/roc_sso.h
> index 5075991ef7..d0dee08b3a 100644
> --- a/drivers/common/cnxk/roc_sso.h
> +++ b/drivers/common/cnxk/roc_sso.h
> @@ -84,8 +84,8 @@ int __roc_api roc_sso_dev_init(struct roc_sso *roc_sso);
> int __roc_api roc_sso_dev_fini(struct roc_sso *roc_sso);
>
> /* SSO device configuration */
> -int __roc_api roc_sso_rsrc_init(struct roc_sso *roc_sso, uint8_t nb_hws,
> - uint16_t nb_hwgrp);
> +int __roc_api roc_sso_rsrc_init(struct roc_sso *roc_sso, uint8_t nb_hws, uint16_t nb_hwgrp,
> + uint16_t nb_tim_lfs);
> void __roc_api roc_sso_rsrc_fini(struct roc_sso *roc_sso);
> int __roc_api roc_sso_hwgrp_qos_config(struct roc_sso *roc_sso,
> struct roc_sso_hwgrp_qos *qos,
> diff --git a/drivers/common/cnxk/roc_tim.c b/drivers/common/cnxk/roc_tim.c
> index 0f9209937b..a03f4006fb 100644
> --- a/drivers/common/cnxk/roc_tim.c
> +++ b/drivers/common/cnxk/roc_tim.c
> @@ -300,14 +300,31 @@ roc_tim_lf_free(struct roc_tim *roc_tim, uint8_t ring_id)
> return 0;
> }
>
> +int
> +tim_free_lf_count_get(struct dev *dev, uint16_t *nb_lfs)
> +{
> + struct free_rsrcs_rsp *rsrc_cnt;
> + int rc;
> +
> + mbox_alloc_msg_free_rsrc_cnt(dev->mbox);
> + rc = mbox_process_msg(dev->mbox, (void **)&rsrc_cnt);
> + if (rc) {
> + plt_err("Failed to get free resource count\n");
> + return -EIO;
> + }
> +
> + *nb_lfs = rsrc_cnt->tim;
> +
> + return 0;
> +}
> +
> int
> roc_tim_init(struct roc_tim *roc_tim)
> {
> struct rsrc_attach_req *attach_req;
> struct rsrc_detach_req *detach_req;
> - struct free_rsrcs_rsp *free_rsrc;
> + uint16_t nb_lfs, nb_free_lfs;
> struct sso *sso;
> - uint16_t nb_lfs;
> struct dev *dev;
> int rc;
>
> @@ -316,20 +333,20 @@ roc_tim_init(struct roc_tim *roc_tim)
>
> sso = roc_sso_to_sso_priv(roc_tim->roc_sso);
> dev = &sso->dev;
> + dev->roc_tim = roc_tim;
> PLT_STATIC_ASSERT(sizeof(struct tim) <= TIM_MEM_SZ);
> nb_lfs = roc_tim->nb_lfs;
> plt_spinlock_lock(&sso->mbox_lock);
> - mbox_alloc_msg_free_rsrc_cnt(dev->mbox);
> - rc = mbox_process_msg(dev->mbox, (void *)&free_rsrc);
> +
> + rc = tim_free_lf_count_get(dev, &nb_free_lfs);
> if (rc) {
> - plt_err("Unable to get free rsrc count.");
> + plt_tim_dbg("Failed to get TIM resource count");
> nb_lfs = 0;
> goto fail;
> }
>
> - if (nb_lfs && (free_rsrc->tim < nb_lfs)) {
> - plt_tim_dbg("Requested LFs : %d Available LFs : %d", nb_lfs,
> - free_rsrc->tim);
> + if (nb_lfs && (nb_free_lfs < nb_lfs)) {
> + plt_tim_dbg("Requested LFs : %d Available LFs : %d", nb_lfs, nb_free_lfs);
> nb_lfs = 0;
> goto fail;
> }
> @@ -340,7 +357,7 @@ roc_tim_init(struct roc_tim *roc_tim)
> goto fail;
> }
> attach_req->modify = true;
> - attach_req->timlfs = nb_lfs ? nb_lfs : free_rsrc->tim;
> + attach_req->timlfs = nb_lfs ? nb_lfs : nb_free_lfs;
> nb_lfs = attach_req->timlfs;
>
> rc = mbox_process(dev->mbox);
> @@ -364,6 +381,7 @@ roc_tim_init(struct roc_tim *roc_tim)
> mbox_process(dev->mbox);
> nb_lfs = 0;
> }
> + roc_tim->nb_lfs = nb_lfs;
>
> fail:
> plt_spinlock_unlock(&sso->mbox_lock);
> diff --git a/drivers/common/cnxk/roc_tim_priv.h b/drivers/common/cnxk/roc_tim_priv.h
> index cc083d2b4a..f6191d2a0e 100644
> --- a/drivers/common/cnxk/roc_tim_priv.h
> +++ b/drivers/common/cnxk/roc_tim_priv.h
> @@ -19,6 +19,8 @@ roc_tim_to_tim_priv(struct roc_tim *roc_tim)
> return (struct tim *)&roc_tim->reserved[0];
> }
>
> +int tim_free_lf_count_get(struct dev *dev, uint16_t *nb_lfs);
> +
> /* TIM IRQ*/
> int tim_register_irq_priv(struct roc_tim *roc_tim,
> struct plt_intr_handle *handle, uint8_t ring_id,
> diff --git a/drivers/event/cnxk/cn10k_eventdev.c b/drivers/event/cnxk/cn10k_eventdev.c
> index 30c922b5fc..401df3c523 100644
> --- a/drivers/event/cnxk/cn10k_eventdev.c
> +++ b/drivers/event/cnxk/cn10k_eventdev.c
> @@ -252,9 +252,12 @@ cn10k_sso_set_rsrc(void *arg)
> static int
> cn10k_sso_rsrc_init(void *arg, uint8_t hws, uint8_t hwgrp)
> {
> + struct cnxk_tim_evdev *tim_dev = cnxk_tim_priv_get();
> struct cnxk_sso_evdev *dev = arg;
> + uint16_t nb_tim_lfs;
>
> - return roc_sso_rsrc_init(&dev->sso, hws, hwgrp);
> + nb_tim_lfs = tim_dev ? tim_dev->nb_rings : 0;
> + return roc_sso_rsrc_init(&dev->sso, hws, hwgrp, nb_tim_lfs);
> }
>
> static int
> diff --git a/drivers/event/cnxk/cn9k_eventdev.c b/drivers/event/cnxk/cn9k_eventdev.c
> index f5a42a86f8..131d42a95b 100644
> --- a/drivers/event/cnxk/cn9k_eventdev.c
> +++ b/drivers/event/cnxk/cn9k_eventdev.c
> @@ -257,12 +257,15 @@ cn9k_sso_set_rsrc(void *arg)
> static int
> cn9k_sso_rsrc_init(void *arg, uint8_t hws, uint8_t hwgrp)
> {
> + struct cnxk_tim_evdev *tim_dev = cnxk_tim_priv_get();
> struct cnxk_sso_evdev *dev = arg;
> + uint16_t nb_tim_lfs;
>
> if (dev->dual_ws)
> hws = hws * CN9K_DUAL_WS_NB_WS;
>
> - return roc_sso_rsrc_init(&dev->sso, hws, hwgrp);
> + nb_tim_lfs = tim_dev ? tim_dev->nb_rings : 0;
> + return roc_sso_rsrc_init(&dev->sso, hws, hwgrp, nb_tim_lfs);
> }
>
> static int
> --
> 2.25.1
>
More information about the dev
mailing list