[PATCH 3/3] ml/cnxk: updated checks for number of MRVL layers
Srikanth Yalavarthi
syalavarthi at marvell.com
Tue Jun 9 06:42:02 CEST 2026
Add checks to validate the current active MRVL layers
and increased the maximum number of layers supported
to 512 for LLVM only models.
Signed-off-by: Srikanth Yalavarthi <syalavarthi at marvell.com>
---
drivers/ml/cnxk/cn10k_ml_ops.c | 6 +++---
drivers/ml/cnxk/cnxk_ml_dev.h | 4 ++--
drivers/ml/cnxk/cnxk_ml_io.h | 2 +-
drivers/ml/cnxk/cnxk_ml_ops.c | 14 +++++++-------
drivers/ml/cnxk/tvmrt_ml_model.c | 17 +++++++++++++++++
5 files changed, 30 insertions(+), 13 deletions(-)
diff --git a/drivers/ml/cnxk/cn10k_ml_ops.c b/drivers/ml/cnxk/cn10k_ml_ops.c
index b30af7c7a44..00c0d87a6d6 100644
--- a/drivers/ml/cnxk/cn10k_ml_ops.c
+++ b/drivers/ml/cnxk/cn10k_ml_ops.c
@@ -624,15 +624,15 @@ cn10k_ml_layer_load(void *device, uint16_t model_id, const char *layer_name, uin
return ret;
/* Get index */
- for (idx = 0; idx < cnxk_mldev->max_nb_layers; idx++) {
+ for (idx = 0; idx < cnxk_mldev->max_mrvl_layers; idx++) {
if (!cnxk_mldev->index_map[idx].active) {
layer->index = idx;
break;
}
}
- if (idx >= cnxk_mldev->max_nb_layers) {
- plt_err("No slots available for model layers, model_id = %u, layer_id = %u",
+ if (idx >= cnxk_mldev->max_mrvl_layers) {
+ plt_err("No slots available for model MRVL layers, model_id = %u, layer_id = %u",
model->model_id, layer_id);
return -1;
}
diff --git a/drivers/ml/cnxk/cnxk_ml_dev.h b/drivers/ml/cnxk/cnxk_ml_dev.h
index e93d76d1af8..181a04737d7 100644
--- a/drivers/ml/cnxk/cnxk_ml_dev.h
+++ b/drivers/ml/cnxk/cnxk_ml_dev.h
@@ -93,9 +93,9 @@ struct cnxk_ml_dev {
#endif
/* Maximum number of layers */
- uint64_t max_nb_layers;
+ uint64_t max_mrvl_layers;
- /* Index map */
+ /* Index map for MRVL layers */
struct cnxk_ml_index_map *index_map;
};
diff --git a/drivers/ml/cnxk/cnxk_ml_io.h b/drivers/ml/cnxk/cnxk_ml_io.h
index 3ca852706f5..e6efd588f75 100644
--- a/drivers/ml/cnxk/cnxk_ml_io.h
+++ b/drivers/ml/cnxk/cnxk_ml_io.h
@@ -16,7 +16,7 @@
/* Maximum number of layers per model */
#ifdef RTE_MLDEV_CNXK_ENABLE_TVMRT
-#define ML_CNXK_MODEL_MAX_LAYERS 128
+#define ML_CNXK_MODEL_MAX_LAYERS 512
#else
#define ML_CNXK_MODEL_MAX_LAYERS 1
#endif
diff --git a/drivers/ml/cnxk/cnxk_ml_ops.c b/drivers/ml/cnxk/cnxk_ml_ops.c
index 675cdaae2bd..dc057643068 100644
--- a/drivers/ml/cnxk/cnxk_ml_ops.c
+++ b/drivers/ml/cnxk/cnxk_ml_ops.c
@@ -636,30 +636,30 @@ cnxk_ml_dev_configure(struct rte_ml_dev *dev, const struct rte_ml_dev_config *co
/* Set device capabilities */
if (cnxk_mldev->type == CNXK_ML_DEV_TYPE_PCI)
- cnxk_mldev->max_nb_layers =
+ cnxk_mldev->max_mrvl_layers =
cnxk_mldev->cn10k_mldev.fw.req->cn10k_req.jd.fw_load.cap.s.max_models;
else
- cnxk_mldev->max_nb_layers = ML_CNXK_MAX_MODELS;
+ cnxk_mldev->max_mrvl_layers = 0;
cnxk_mldev->mldev->enqueue_burst = cnxk_ml_enqueue_burst;
cnxk_mldev->mldev->dequeue_burst = cnxk_ml_dequeue_burst;
cnxk_mldev->mldev->op_error_get = cnxk_ml_op_error_get;
/* Allocate and initialize index_map */
- if (cnxk_mldev->index_map == NULL) {
+ if (cnxk_mldev->type == CNXK_ML_DEV_TYPE_PCI && cnxk_mldev->index_map == NULL) {
cnxk_mldev->index_map =
rte_zmalloc("cnxk_ml_index_map",
- sizeof(struct cnxk_ml_index_map) * cnxk_mldev->max_nb_layers,
+ sizeof(struct cnxk_ml_index_map) * cnxk_mldev->max_mrvl_layers,
RTE_CACHE_LINE_SIZE);
if (cnxk_mldev->index_map == NULL) {
- plt_err("Failed to get memory for index_map, nb_layers %" PRIu64,
- cnxk_mldev->max_nb_layers);
+ plt_err("Failed to get memory for index_map, nb_mrvl_layers %" PRIu64,
+ cnxk_mldev->max_mrvl_layers);
ret = -ENOMEM;
goto error;
}
}
- for (i = 0; i < cnxk_mldev->max_nb_layers; i++)
+ for (i = 0; i < cnxk_mldev->max_mrvl_layers; i++)
cnxk_mldev->index_map[i].active = false;
/* Initialize xstats */
diff --git a/drivers/ml/cnxk/tvmrt_ml_model.c b/drivers/ml/cnxk/tvmrt_ml_model.c
index 9bff424f0d8..319c53a05b5 100644
--- a/drivers/ml/cnxk/tvmrt_ml_model.c
+++ b/drivers/ml/cnxk/tvmrt_ml_model.c
@@ -398,6 +398,7 @@ tvmrt_ml_json_graph_get_arrays(json_t *json_parsed, json_t **nodes, json_t **arg
int
tvmrt_ml_model_json_parse(struct cnxk_ml_model *model)
{
+ struct cnxk_ml_dev *cnxk_mldev = model->cnxk_mldev;
struct tvmrt_ml_param_names param_names;
json_error_t json_error;
json_t *json_parsed;
@@ -407,6 +408,7 @@ tvmrt_ml_model_json_parse(struct cnxk_ml_model *model)
json_t *json_node_row_ptr;
json_t *json_shape_values;
json_t *json_dtype_values;
+ uint16_t nb_active_mrvl_layers;
uint16_t nb_mrvl_layers;
uint16_t nb_llvm_layers;
DLDevice device;
@@ -511,6 +513,21 @@ tvmrt_ml_model_json_parse(struct cnxk_ml_model *model)
goto error;
}
+ nb_active_mrvl_layers = 0;
+ for (i = 0; i < cnxk_mldev->max_mrvl_layers; i++) {
+ if (cnxk_mldev->index_map[i].active)
+ nb_active_mrvl_layers++;
+ }
+
+ if (nb_active_mrvl_layers + nb_mrvl_layers > cnxk_mldev->max_mrvl_layers) {
+ ret = -ENOSPC;
+ plt_err("TVM runtime: Total MRVL layers (%u) exceeds maximum supported "
+ "MRVL layers (%" PRIu64 "), model_id = %u, error = %d",
+ nb_active_mrvl_layers + nb_mrvl_layers, cnxk_mldev->max_mrvl_layers,
+ model->model_id, ret);
+ goto error;
+ }
+
/* Set model subtype */
if ((nb_llvm_layers == 0) && (nb_mrvl_layers == 1))
model->subtype = ML_CNXK_MODEL_SUBTYPE_TVM_MRVL;
--
2.34.1
More information about the dev
mailing list