[1/1] common/cnxk: fix static assertion failure
Checks
Commit Message
use dynamically allocated memory for storing soft expiry
ring base addresses which fixes the static assertion failure,
size of this dynamic allocation depends on RTE_MAX_ETHPORTS
which varies based on the build config.
Fixes: d26185716d3f ("net/cnxk: support outbound soft expiry
notification")
Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
Signed-off-by: Srikanth Yalavarthi <syalavarthi@marvell.com>
---
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 | 16 ++++++++++++++++
5 files changed, 41 insertions(+), 13 deletions(-)
Comments
On Wed, Mar 2, 2022 at 5:37 PM Vamsi Attunuru <vattunuru@marvell.com> wrote:
>
> use dynamically allocated memory for storing soft expiry
Use
> ring base addresses which fixes the static assertion failure,
> size of this dynamic allocation depends on RTE_MAX_ETHPORTS
as the size of
> which varies based on the build config.
>
Fill Bugzilla ID:
> Fixes: d26185716d3f ("net/cnxk: support outbound soft expiry
> notification")
Please move word "notification" to same line.
Add Cc: stable@dpdk.org
+ @yux.jiang@intel.com
Add Reported-by:
>
> Signed-off-by: Vamsi Attunuru <vattunuru@marvell.com>
> Signed-off-by: Srikanth Yalavarthi <syalavarthi@marvell.com>
> ---
> +
> +/* Add / Sub pointer with scalar and cast to uint64_t */
> +#define PLT_PTR_ADD_U64_CAST(__ptr, __x) PLT_U64_CAST(PLT_PTR_ADD(__ptr, __x))
> +#define PLT_PTR_SUB_U64_CAST(__ptr, __x) PLT_U64_CAST(PLT_PTR_SUB(__ptr, __x))
Since it is not used in this patch, This line can be removed
> +
> /** Divide ceil */
> #define PLT_DIV_CEIL(x, y) \
> ({ \
> @@ -158,6 +170,10 @@
> #define plt_write64(val, addr) \
> rte_write64_relaxed((val), (volatile void *)(addr))
>
> +#define plt_read32(addr) rte_read32_relaxed((volatile void *)(addr))
> +#define plt_write32(val, addr) \
> + rte_write32_relaxed((val), (volatile void *)(addr))
Since it is not used in this patch, This line can be removed
@@ -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]));
}
}
@@ -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;
@@ -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 */
@@ -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;
@@ -41,6 +41,7 @@
#define PLT_MEMZONE_NAMESIZE RTE_MEMZONE_NAMESIZE
#define PLT_STD_C11 RTE_STD_C11
#define PLT_PTR_ADD RTE_PTR_ADD
+#define PLT_PTR_SUB RTE_PTR_SUB
#define PLT_PTR_DIFF RTE_PTR_DIFF
#define PLT_MAX_RXTX_INTR_VEC_ID RTE_MAX_RXTX_INTR_VEC_ID
#define PLT_INTR_VEC_RXTX_OFFSET RTE_INTR_VEC_RXTX_OFFSET
@@ -63,6 +64,17 @@
#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))
+
+/* Add / Sub pointer with scalar and cast to uint64_t */
+#define PLT_PTR_ADD_U64_CAST(__ptr, __x) PLT_U64_CAST(PLT_PTR_ADD(__ptr, __x))
+#define PLT_PTR_SUB_U64_CAST(__ptr, __x) PLT_U64_CAST(PLT_PTR_SUB(__ptr, __x))
+
/** Divide ceil */
#define PLT_DIV_CEIL(x, y) \
({ \
@@ -158,6 +170,10 @@
#define plt_write64(val, addr) \
rte_write64_relaxed((val), (volatile void *)(addr))
+#define plt_read32(addr) rte_read32_relaxed((volatile void *)(addr))
+#define plt_write32(val, addr) \
+ rte_write32_relaxed((val), (volatile void *)(addr))
+
#define plt_wmb() rte_wmb()
#define plt_rmb() rte_rmb()
#define plt_io_wmb() rte_io_wmb()