From: Srikanth Yalavarthi <syalavarthi@marvell.com>
To: Srikanth Yalavarthi <syalavarthi@marvell.com>,
Prince Takkar <ptakkar@marvell.com>,
Shivah Shankar S <sshankarnara@marvell.com>
Cc: <dev@dpdk.org>, <aprabhu@marvell.com>
Subject: [PATCH v2 1/1] ml/cnxk: fix multiple coverity issues
Date: Thu, 16 Mar 2023 02:33:41 -0700 [thread overview]
Message-ID: <20230316093341.18829-1-syalavarthi@marvell.com> (raw)
In-Reply-To: <20230315135427.11489-1-syalavarthi@marvell.com>
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 <syalavarthi@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
next prev parent reply other threads:[~2023-03-16 9:33 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-15 13:54 [PATCH " Srikanth Yalavarthi
2023-03-16 9:33 ` Srikanth Yalavarthi [this message]
2023-03-16 17:00 ` [PATCH v2 " Thomas Monjalon
2023-03-16 17:02 ` [EXT] " Srikanth Yalavarthi
2023-03-16 17:07 ` Thomas Monjalon
2023-03-16 21:28 ` [PATCH v3 0/8] Fixes to ml/cnxk driver Srikanth Yalavarthi
2023-03-16 21:28 ` [PATCH v3 1/8] ml/cnxk: fix evaluation order violation issues Srikanth Yalavarthi
2023-03-16 21:28 ` [PATCH v3 2/8] ml/cnxk: fix potential division by zero Srikanth Yalavarthi
2023-03-16 21:28 ` [PATCH v3 3/8] ml/cnxk: add pointer check after memory allocation Srikanth Yalavarthi
2023-03-16 21:29 ` [PATCH v3 4/8] ml/cnxk: remove logically dead code Srikanth Yalavarthi
2023-03-16 21:29 ` [PATCH v3 5/8] ml/cnxk: fix potential memory leak in xstats Srikanth Yalavarthi
2023-03-16 21:29 ` [PATCH v3 6/8] ml/cnxk: check for null pointer before dereference Srikanth Yalavarthi
2023-03-16 21:29 ` [PATCH v3 7/8] ml/cnxk: avoid variable name reuse in a function Srikanth Yalavarthi
2023-03-16 21:29 ` [PATCH v3 8/8] ml/cnxk: reduce levels of nested variables access Srikanth Yalavarthi
2023-03-19 19:01 ` [PATCH v3 0/8] Fixes to ml/cnxk driver Thomas Monjalon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230316093341.18829-1-syalavarthi@marvell.com \
--to=syalavarthi@marvell.com \
--cc=aprabhu@marvell.com \
--cc=dev@dpdk.org \
--cc=ptakkar@marvell.com \
--cc=sshankarnara@marvell.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).