Added checks for null pointers. Removed logically dead code.
Fix division or modulo by zero. Fix evaluation order violation
issues. Fix potential memory leak in xstats function.

Coverity issue: 383658 383659, 383664, 383665
Fixes: 817e3e55bb18 ("ml/cnxk: support simulator environment")
Fixes: da3325131d71 ("ml/cnxk: find OCM mask and page slots for a model")
Fixes: b7d0650ebce0 ("ml/cnxk: reserve and free OCM pages")
Fixes: 515e3608c741 ("ml/cnxk: configure OCM page size")
Fixes: 4ff4ab8e1a20 ("ml/cnxk: support extended statistics")

Signed-off-by: Srikanth Yalavarthi <syalavar...@marvell.com>
---

v2:
* additional null pointer checks
* xstats memory leak fix

 drivers/ml/cnxk/cn10k_ml_dev.c |  4 ++--
 drivers/ml/cnxk/cn10k_ml_ocm.c | 39 ++++++++++++----------------------
 drivers/ml/cnxk/cn10k_ml_ops.c | 17 +++++++++++++--
 3 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/drivers/ml/cnxk/cn10k_ml_dev.c b/drivers/ml/cnxk/cn10k_ml_dev.c
index 6f9a1015a6..bba3c9022e 100644
--- a/drivers/ml/cnxk/cn10k_ml_dev.c
+++ b/drivers/ml/cnxk/cn10k_ml_dev.c
@@ -779,8 +779,8 @@ cn10k_ml_fw_load(struct cn10k_ml_dev *mldev)
        if (roc_env_is_emulator() || roc_env_is_hw()) {
                /* Read firmware image to a buffer */
                ret = rte_firmware_read(fw->path, &fw_buffer, &fw_size);
-               if (ret < 0) {
-                       plt_err("Can't read firmware data: %s\n", fw->path);
+               if ((ret < 0) || (fw_buffer == NULL)) {
+                       plt_err("Unable to read firmware data: %s\n", fw->path);
                        return ret;
                }
 
diff --git a/drivers/ml/cnxk/cn10k_ml_ocm.c b/drivers/ml/cnxk/cn10k_ml_ocm.c
index d8d2c71a3c..edc1e5dd4b 100644
--- a/drivers/ml/cnxk/cn10k_ml_ocm.c
+++ b/drivers/ml/cnxk/cn10k_ml_ocm.c
@@ -224,7 +224,6 @@ cn10k_ml_ocm_tilemask_find(struct rte_ml_dev *dev, uint8_t 
num_tiles, uint16_t w
        uint16_t scratch_page_start;
        int used_last_wb_page_max;
        uint16_t scratch_page_end;
-       uint8_t search_start_tile;
        uint8_t search_end_tile;
        uint8_t *local_ocm_mask;
        int wb_page_start_curr;
@@ -235,7 +234,6 @@ cn10k_ml_ocm_tilemask_find(struct rte_ml_dev *dev, uint8_t 
num_tiles, uint16_t w
        uint16_t word_id;
        uint8_t tile_idx;
        int max_slot_sz;
-       int start_tile;
        int page_id;
 
        mldev = dev->data->dev_private;
@@ -250,28 +248,18 @@ cn10k_ml_ocm_tilemask_find(struct rte_ml_dev *dev, 
uint8_t num_tiles, uint16_t w
        wb_page_start = -1;
        used_scratch_pages_max = 0;
        used_last_wb_page_max = -1;
-       start_tile = -1;
        max_slot_sz_curr = 0;
        max_slot_sz = 0;
        tile_idx = 0;
+       tile_start = 0;
+       search_end_tile = ocm->num_tiles - num_tiles;
 
-       if ((start_tile != -1) && (start_tile % num_tiles != 0)) {
-               plt_err("Invalid start_tile, %d", start_tile);
+       local_ocm_mask = rte_zmalloc("local_ocm_mask", mldev->ocm.mask_words, 
RTE_CACHE_LINE_SIZE);
+       if (local_ocm_mask == NULL) {
+               plt_err("Unable to allocate memory for local_ocm_mask");
                return -1;
        }
 
-       if (start_tile < 0) {
-               search_start_tile = 0;
-               search_end_tile = ocm->num_tiles - num_tiles;
-       } else {
-               search_start_tile = start_tile;
-               search_end_tile = start_tile;
-       }
-
-       /* nibbles + prefix '0x' */
-       local_ocm_mask = rte_zmalloc("local_ocm_mask", mldev->ocm.mask_words, 
RTE_CACHE_LINE_SIZE);
-
-       tile_start = search_start_tile;
 start_search:
        used_scratch_pages_max = 0;
        used_last_wb_page_max = -1;
@@ -423,10 +411,8 @@ cn10k_ml_ocm_free_pages(struct rte_ml_dev *dev, uint16_t 
model_id)
        wb_page_end = wb_page_start + model->model_mem_map.wb_pages - 1;
        for (tile_id = model->addr.tile_start; tile_id <= model->addr.tile_end; 
tile_id++) {
                for (page_id = wb_page_start; page_id <= wb_page_end; 
page_id++) {
-                       ocm->tile_ocm_info[tile_id].ocm_mask[page_id / 
OCM_MAP_WORD_SIZE] =
-                               CLEAR_BIT(ocm->tile_ocm_info[tile_id]
-                                                 .ocm_mask[page_id / 
OCM_MAP_WORD_SIZE],
-                                         page_id % OCM_MAP_WORD_SIZE);
+                       CLEAR_BIT(ocm->tile_ocm_info[tile_id].ocm_mask[page_id 
/ OCM_MAP_WORD_SIZE],
+                                 page_id % OCM_MAP_WORD_SIZE);
                }
 
                /* Update last_wb_page size */
@@ -452,10 +438,9 @@ cn10k_ml_ocm_free_pages(struct rte_ml_dev *dev, uint16_t 
model_id)
                        prev_start = ocm->num_pages - 
ocm->tile_ocm_info[tile_id].scratch_pages;
                        curr_start = ocm->num_pages - scratch_resize_pages;
                        for (page_id = prev_start; page_id < curr_start; 
page_id++) {
-                               ocm->tile_ocm_info[tile_id].ocm_mask[page_id / 
OCM_MAP_WORD_SIZE] =
-                                       CLEAR_BIT(ocm->tile_ocm_info[tile_id]
-                                                         .ocm_mask[page_id / 
OCM_MAP_WORD_SIZE],
-                                                 page_id % OCM_MAP_WORD_SIZE);
+                               CLEAR_BIT(ocm->tile_ocm_info[tile_id]
+                                                 .ocm_mask[page_id / 
OCM_MAP_WORD_SIZE],
+                                         page_id % OCM_MAP_WORD_SIZE);
                        }
                        ocm->tile_ocm_info[tile_id].scratch_pages = 
scratch_resize_pages;
                }
@@ -497,6 +482,10 @@ cn10k_ml_ocm_print(struct rte_ml_dev *dev, FILE *fp)
 
        /* nibbles + prefix '0x' */
        str = rte_zmalloc("ocm_mask_str", mldev->ocm.num_pages / 4 + 2, 
RTE_CACHE_LINE_SIZE);
+       if (str == NULL) {
+               plt_err("Unable to allocate memory for ocm_mask_str");
+               return;
+       }
 
        fprintf(fp, "OCM State:\n");
        for (tile_id = 0; tile_id < ocm->num_tiles; tile_id++) {
diff --git a/drivers/ml/cnxk/cn10k_ml_ops.c b/drivers/ml/cnxk/cn10k_ml_ops.c
index 7d5eb97668..4df2ca0e8c 100644
--- a/drivers/ml/cnxk/cn10k_ml_ops.c
+++ b/drivers/ml/cnxk/cn10k_ml_ops.c
@@ -444,7 +444,8 @@ cn10k_ml_prep_fp_job_descriptor(struct rte_ml_dev *dev, 
struct cn10k_ml_req *req
                        count += model->burst_stats[qp_id].dequeued_count -     
                   \
                                 model->burst_stats[qp_id].str##_reset_count;   
                   \
                }                                                               
                   \
-               value = value / count;                                          
                   \
+               if (count != 0)                                                 
                   \
+                       value = value / count;                                  
                   \
        } while (0)
 
 #define ML_MIN_FOREACH_QP(dev, model, qp_id, str, value, count)                
                    \
@@ -788,6 +789,11 @@ cn10k_ml_dev_configure(struct rte_ml_dev *dev, const 
struct rte_ml_dev_config *c
        /* Allocate memory for ocm_mask */
        ocm->ocm_mask =
                rte_zmalloc("ocm_mask", ocm->mask_words * ocm->num_tiles, 
RTE_CACHE_LINE_SIZE);
+       if (ocm->ocm_mask == NULL) {
+               plt_err("Unable to allocate memory for OCM mask");
+               ret = -ENOMEM;
+               goto error;
+       }
 
        for (tile_id = 0; tile_id < ocm->num_tiles; tile_id++) {
                ocm->tile_ocm_info[tile_id].ocm_mask = ocm->ocm_mask + tile_id 
* ocm->mask_words;
@@ -1106,6 +1112,11 @@ cn10k_ml_dev_xstats_by_name_get(struct rte_ml_dev *dev, 
const char *name, uint16
        num_xstats = PLT_DIM(cn10k_ml_model_xstats_table) * 
mldev->nb_models_loaded;
        xstats_map = rte_zmalloc("cn10k_ml_xstats_map",
                                 sizeof(struct rte_ml_dev_xstats_map) * 
num_xstats, 0);
+       if (xstats_map == NULL) {
+               plt_err("Unable to allocate memory for cn10k_ml_xstats_map");
+               return -ENOMEM;
+       }
+
        cn10k_ml_dev_xstats_names_get(dev, xstats_map, num_xstats);
 
        cn10k_ml_dev_info_get(dev, &dev_info);
@@ -1117,8 +1128,10 @@ cn10k_ml_dev_xstats_by_name_get(struct rte_ml_dev *dev, 
const char *name, uint16
                }
        }
 
-       if (id == PLT_DIM(cn10k_ml_model_xstats_table) * dev_info.max_models)
+       if (id == PLT_DIM(cn10k_ml_model_xstats_table) * dev_info.max_models) {
+               rte_free(xstats_map);
                return -EINVAL;
+       }
 
        model_id = id / PLT_DIM(cn10k_ml_model_xstats_table);
        type = id % PLT_DIM(cn10k_ml_model_xstats_table);
-- 
2.17.1

Reply via email to