]> git.droids-corp.org - dpdk.git/commitdiff
common/cnxk: fix soft expiry disable path
authorNithin Dabilpuram <ndabilpuram@marvell.com>
Sun, 8 May 2022 07:48:18 +0000 (13:18 +0530)
committerJerin Jacob <jerinj@marvell.com>
Tue, 10 May 2022 14:26:56 +0000 (16:26 +0200)
Fix issues in mode where soft expiry is disabled in ROC.
When soft expiry support is not enabled in inline device,
memory is not allocated for the ring base array and should
not be accessed.

Fixes: bea5d990a93b ("net/cnxk: support outbound soft expiry notification")
Cc: stable@dpdk.org
Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
drivers/common/cnxk/roc_nix_inl.c
drivers/common/cnxk/roc_nix_inl_dev.c
drivers/common/cnxk/roc_nix_inl_priv.h

index 599e2cf3521399034a9475d115e98b45ee9ad271..a66fbcd66ec12c9c4230e34d7fb6202920ec5bc0 100644 (file)
@@ -210,7 +210,7 @@ roc_nix_inl_inb_sa_sz(struct roc_nix *roc_nix, bool inl_dev_sa)
 uintptr_t
 roc_nix_inl_inb_sa_get(struct roc_nix *roc_nix, bool inb_inl_dev, uint32_t spi)
 {
-       uint32_t max_spi, min_spi, mask;
+       uint32_t max_spi = 0, min_spi = 0, mask;
        uintptr_t sa_base;
        uint64_t sz;
 
@@ -224,7 +224,7 @@ roc_nix_inl_inb_sa_get(struct roc_nix *roc_nix, bool inb_inl_dev, uint32_t spi)
        if (!sz)
                return 0;
 
-       if (roc_nix->custom_sa_action)
+       if (roc_nix && roc_nix->custom_sa_action)
                return (sa_base + (spi * sz));
 
        /* Check if SPI is in range */
@@ -466,7 +466,7 @@ skip_sa_alloc:
        nix->outb_se_ring_base =
                roc_nix->port_id * ROC_NIX_SOFT_EXP_PER_PORT_MAX_RINGS;
 
-       if (inl_dev == NULL) {
+       if (inl_dev == NULL || !inl_dev->set_soft_exp_poll) {
                nix->outb_se_ring_cnt = 0;
                return 0;
        }
@@ -542,11 +542,12 @@ roc_nix_inl_outb_fini(struct roc_nix *roc_nix)
        plt_free(nix->outb_sa_base);
        nix->outb_sa_base = NULL;
 
-       if (idev && idev->nix_inl_dev) {
+       if (idev && idev->nix_inl_dev && nix->outb_se_ring_cnt) {
                inl_dev = idev->nix_inl_dev;
                ring_base = inl_dev->sa_soft_exp_ring;
+               ring_base += nix->outb_se_ring_base;
 
-               for (i = 0; i < ROC_NIX_INL_MAX_SOFT_EXP_RNGS; i++) {
+               for (i = 0; i < nix->outb_se_ring_cnt; i++) {
                        if (ring_base[i])
                                plt_free(PLT_PTR_CAST(ring_base[i]));
                }
index ef2540dd5a1389f0f38a94401ca88f30fd27b5ff..786a6bceff52d120d3e7b30170f599a49843d2f7 100644 (file)
@@ -814,6 +814,7 @@ roc_nix_inl_dev_init(struct roc_nix_inl_dev *roc_inl_dev)
        inl_dev->wqe_skip = roc_inl_dev->wqe_skip;
        inl_dev->spb_drop_pc = NIX_AURA_DROP_PC_DFLT;
        inl_dev->lpb_drop_pc = NIX_AURA_DROP_PC_DFLT;
+       inl_dev->set_soft_exp_poll = roc_inl_dev->set_soft_exp_poll;
 
        if (roc_inl_dev->spb_drop_pc)
                inl_dev->spb_drop_pc = roc_inl_dev->spb_drop_pc;
@@ -849,7 +850,7 @@ roc_nix_inl_dev_init(struct roc_nix_inl_dev *roc_inl_dev)
        if (rc)
                goto sso_release;
 
-       if (roc_inl_dev->set_soft_exp_poll) {
+       if (inl_dev->set_soft_exp_poll) {
                rc = nix_inl_outb_poll_thread_setup(inl_dev);
                if (rc)
                        goto cpt_release;
@@ -898,7 +899,7 @@ roc_nix_inl_dev_fini(struct roc_nix_inl_dev *roc_inl_dev)
        inl_dev = idev->nix_inl_dev;
        pci_dev = inl_dev->pci_dev;
 
-       if (roc_inl_dev->set_soft_exp_poll) {
+       if (inl_dev->set_soft_exp_poll) {
                soft_exp_poll_thread_exit = true;
                pthread_join(inl_dev->soft_exp_poll_thread, NULL);
                plt_bitmap_free(inl_dev->soft_exp_ring_bmap);
index f9646a3d5992d78536aafc62ea5bd0f738280a2f..1ab8470044b51489c4255a24b10de8b67086b09b 100644 (file)
@@ -59,6 +59,7 @@ struct nix_inl_dev {
        pthread_t soft_exp_poll_thread;
        uint32_t soft_exp_poll_freq;
        uint64_t *sa_soft_exp_ring;
+       bool set_soft_exp_poll;
 
        /* Soft expiry ring bitmap */
        struct plt_bitmap *soft_exp_ring_bmap;