On Wed, Mar 2, 2022 at 7:18 PM Vamsi Attunuru <vattun...@marvell.com> wrote: > > Use dynamically allocated memory for storing soft expiry > ring base addresses which fixes the static assertion failure, > as the size of dynamic allocation depends on RTE_MAX_ETHPORTS > which varies based on the build config. > > Bugzilla ID: 940 > Fixes: d26185716d3f ("net/cnxk: support outbound soft expiry notification") > Cc: sta...@dpdk.org > > Reported-by: Wei Ling <weix.l...@intel.com> > Reported-by: Yu Jiang <yux.ji...@intel.com> > Signed-off-by: Vamsi Attunuru <vattun...@marvell.com> > Signed-off-by: Srikanth Yalavarthi <syalavar...@marvell.com>
Acked-by: Jerin Jacob <jer...@marvell.com> Applied to dpdk-next-net-mrvl/for-next-net. Thanks > --- > V2: Add bugzilla & reportee details, remove unused changes. > --- > drivers/common/cnxk/roc_nix_inl.c | 23 +++++++++++++---------- > drivers/common/cnxk/roc_nix_inl.h | 2 +- > drivers/common/cnxk/roc_nix_inl_dev.c | 11 ++++++++++- > drivers/common/cnxk/roc_nix_inl_priv.h | 2 +- > drivers/common/cnxk/roc_platform.h | 7 +++++++ > 5 files changed, 32 insertions(+), 13 deletions(-) > > diff --git a/drivers/common/cnxk/roc_nix_inl.c > b/drivers/common/cnxk/roc_nix_inl.c > index 11ed157703..826c6e99c1 100644 > --- a/drivers/common/cnxk/roc_nix_inl.c > +++ b/drivers/common/cnxk/roc_nix_inl.c > @@ -330,12 +330,13 @@ roc_nix_inl_outb_init(struct roc_nix *roc_nix) > struct dev *dev = &nix->dev; > struct msix_offset_rsp *rsp; > struct nix_inl_dev *inl_dev; > + size_t sa_sz, ring_sz; > uint16_t sso_pffunc; > uint8_t eng_grpmask; > uint64_t blkaddr, i; > + uint64_t *ring_base; > uint16_t nb_lf; > void *sa_base; > - size_t sa_sz; > int j, rc; > void *sa; > > @@ -468,16 +469,16 @@ roc_nix_inl_outb_init(struct roc_nix *roc_nix) > /* Allocate memory to be used as a ring buffer to poll for > * soft expiry event from ucode > */ > + ring_sz = (ROC_IPSEC_ERR_RING_MAX_ENTRY + 1) * sizeof(uint64_t); > + ring_base = inl_dev->sa_soft_exp_ring; > for (i = 0; i < nix->outb_se_ring_cnt; i++) { > - inl_dev->sa_soft_exp_ring[nix->outb_se_ring_base + i] = > - plt_zmalloc((ROC_IPSEC_ERR_RING_MAX_ENTRY + 1) * > - sizeof(uint64_t), > - 0); > - if (!inl_dev->sa_soft_exp_ring[i]) { > + ring_base[nix->outb_se_ring_base + i] = > + PLT_U64_CAST(plt_zmalloc(ring_sz, 0)); > + if (!ring_base[nix->outb_se_ring_base + i]) { > plt_err("Couldn't allocate memory for soft exp ring"); > while (i--) > - plt_free(inl_dev->sa_soft_exp_ring > - [nix->outb_se_ring_base + > i]); > + plt_free(PLT_PTR_CAST( > + ring_base[nix->outb_se_ring_base + > i])); > rc = -ENOMEM; > goto lf_fini; > } > @@ -504,6 +505,7 @@ roc_nix_inl_outb_fini(struct roc_nix *roc_nix) > struct idev_cfg *idev = idev_get_cfg(); > struct dev *dev = &nix->dev; > struct nix_inl_dev *inl_dev; > + uint64_t *ring_base; > int i, rc, ret = 0; > > if (!nix->inl_outb_ena) > @@ -537,10 +539,11 @@ roc_nix_inl_outb_fini(struct roc_nix *roc_nix) > > if (idev && idev->nix_inl_dev) { > inl_dev = idev->nix_inl_dev; > + ring_base = inl_dev->sa_soft_exp_ring; > > for (i = 0; i < ROC_NIX_INL_MAX_SOFT_EXP_RNGS; i++) { > - if (inl_dev->sa_soft_exp_ring[i]) > - plt_free(inl_dev->sa_soft_exp_ring[i]); > + if (ring_base[i]) > + plt_free(PLT_PTR_CAST(ring_base[i])); > } > } > > diff --git a/drivers/common/cnxk/roc_nix_inl.h > b/drivers/common/cnxk/roc_nix_inl.h > index 1dc58f2da2..2c2a4d76f2 100644 > --- a/drivers/common/cnxk/roc_nix_inl.h > +++ b/drivers/common/cnxk/roc_nix_inl.h > @@ -137,7 +137,7 @@ struct roc_nix_inl_dev { > bool set_soft_exp_poll; > /* End of input parameters */ > > -#define ROC_NIX_INL_MEM_SZ (2304) > +#define ROC_NIX_INL_MEM_SZ (1280) > uint8_t reserved[ROC_NIX_INL_MEM_SZ] __plt_cache_aligned; > } __plt_cache_aligned; > > diff --git a/drivers/common/cnxk/roc_nix_inl_dev.c > b/drivers/common/cnxk/roc_nix_inl_dev.c > index 1cfcdba3f2..5a032aab52 100644 > --- a/drivers/common/cnxk/roc_nix_inl_dev.c > +++ b/drivers/common/cnxk/roc_nix_inl_dev.c > @@ -653,7 +653,7 @@ inl_outb_soft_exp_poll(struct nix_inl_dev *inl_dev, > uint32_t ring_idx) > uint32_t port_id; > > port_id = ring_idx / ROC_NIX_SOFT_EXP_PER_PORT_MAX_RINGS; > - ring_base = inl_dev->sa_soft_exp_ring[ring_idx]; > + ring_base = PLT_PTR_CAST(inl_dev->sa_soft_exp_ring[ring_idx]); > if (!ring_base) { > plt_err("Invalid soft exp ring base"); > return; > @@ -751,6 +751,14 @@ nix_inl_outb_poll_thread_setup(struct nix_inl_dev > *inl_dev) > > inl_dev->soft_exp_ring_bmap_mem = mem; > inl_dev->soft_exp_ring_bmap = bmap; > + inl_dev->sa_soft_exp_ring = plt_zmalloc( > + ROC_NIX_INL_MAX_SOFT_EXP_RNGS * sizeof(uint64_t), 0); > + if (!inl_dev->sa_soft_exp_ring) { > + plt_err("soft expiry ring pointer array alloc failed"); > + plt_free(mem); > + rc = -ENOMEM; > + goto exit; > + } > > for (i = 0; i < ROC_NIX_INL_MAX_SOFT_EXP_RNGS; i++) > plt_bitmap_clear(inl_dev->soft_exp_ring_bmap, i); > @@ -896,6 +904,7 @@ roc_nix_inl_dev_fini(struct roc_nix_inl_dev *roc_inl_dev) > pthread_join(inl_dev->soft_exp_poll_thread, NULL); > plt_bitmap_free(inl_dev->soft_exp_ring_bmap); > plt_free(inl_dev->soft_exp_ring_bmap_mem); > + plt_free(inl_dev->sa_soft_exp_ring); > } > > /* Flush Inbound CTX cache entries */ > diff --git a/drivers/common/cnxk/roc_nix_inl_priv.h > b/drivers/common/cnxk/roc_nix_inl_priv.h > index da6d6e9b03..0fa5e090d4 100644 > --- a/drivers/common/cnxk/roc_nix_inl_priv.h > +++ b/drivers/common/cnxk/roc_nix_inl_priv.h > @@ -58,7 +58,7 @@ struct nix_inl_dev { > /* OUTB soft expiry poll thread */ > pthread_t soft_exp_poll_thread; > uint32_t soft_exp_poll_freq; > - void *sa_soft_exp_ring[ROC_NIX_INL_MAX_SOFT_EXP_RNGS]; > + uint64_t *sa_soft_exp_ring; > > /* Soft expiry ring bitmap */ > struct plt_bitmap *soft_exp_ring_bmap; > diff --git a/drivers/common/cnxk/roc_platform.h > b/drivers/common/cnxk/roc_platform.h > index fa285446bd..28004b1743 100644 > --- a/drivers/common/cnxk/roc_platform.h > +++ b/drivers/common/cnxk/roc_platform.h > @@ -63,6 +63,13 @@ > #ifndef PLT_ETHER_ADDR_LEN > #define PLT_ETHER_ADDR_LEN RTE_ETHER_ADDR_LEN > #endif > + > +/* Cast to specific datatypes */ > +#define PLT_PTR_CAST(val) ((void *)(val)) > +#define PLT_U64_CAST(val) ((uint64_t)(val)) > +#define PLT_U32_CAST(val) ((uint32_t)(val)) > +#define PLT_U16_CAST(val) ((uint16_t)(val)) > + > /** Divide ceil */ > #define PLT_DIV_CEIL(x, y) \ > ({ \ > -- > 2.25.1 >