parse_integer_arg() used atoi(), which cannot report an error, so a
malformed value became zero and the negative check never fired.
parse_uint_arg() open coded the errno and end pointer checks.

parse_uint_arg() also stored through a uint32_t pointer, but max_nb_qpairs
is a uint16_t followed by an int in the same struct, so parsing that
argument wrote past the field.

Neither handler did anything beyond a range checked store, so drop them
and pass rte_kvargs_handle_u16() directly for max_qps.

cache_model_data is a boolean, so make the field bool and use
rte_kvargs_handle_bool(), which makes the "< 0 || > 1" check that
followed it dead code. cache_model_data_set stays, since it still
tells an unset argument from one set to false. A bare key now enables
the option, and the usual spellings are accepted.

Bugzilla ID: 2043
Fixes: 48c6081ab4b3 ("ml/cnxk: enable creation of MVTVM virtual device")

Signed-off-by: Stephen Hemminger <[email protected]>
---
 drivers/ml/cnxk/mvtvm_ml_dev.c | 47 ++++------------------------------
 drivers/ml/cnxk/mvtvm_ml_dev.h |  2 +-
 2 files changed, 6 insertions(+), 43 deletions(-)

diff --git a/drivers/ml/cnxk/mvtvm_ml_dev.c b/drivers/ml/cnxk/mvtvm_ml_dev.c
index 74959a12fc..cbaf17698e 100644
--- a/drivers/ml/cnxk/mvtvm_ml_dev.c
+++ b/drivers/ml/cnxk/mvtvm_ml_dev.c
@@ -20,36 +20,6 @@
 
 static const char *const valid_args[] = {MVTVM_ML_DEV_MAX_QPS, 
MVTVM_ML_DEV_CACHE_MODEL_DATA, NULL};
 
-static int
-parse_integer_arg(const char *key __rte_unused, const char *value, void 
*extra_args)
-{
-       int *i = (int *)extra_args;
-
-       *i = atoi(value);
-       if (*i < 0) {
-               plt_err("Argument has to be positive.");
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static int
-parse_uint_arg(const char *key __rte_unused, const char *value, void 
*extra_args)
-{
-       int i;
-       char *end;
-       errno = 0;
-
-       i = strtol(value, &end, 10);
-       if (*end != 0 || errno != 0 || i < 0)
-               return -EINVAL;
-
-       *((uint32_t *)extra_args) = i;
-
-       return 0;
-}
-
 static int
 mvtvm_mldev_parse_devargs(const char *args, struct mvtvm_ml_dev *mvtvm_mldev)
 {
@@ -68,7 +38,7 @@ mvtvm_mldev_parse_devargs(const char *args, struct 
mvtvm_ml_dev *mvtvm_mldev)
        }
 
        if (rte_kvargs_count(kvlist, MVTVM_ML_DEV_MAX_QPS) == 1) {
-               ret = rte_kvargs_process(kvlist, MVTVM_ML_DEV_MAX_QPS, 
&parse_uint_arg,
+               ret = rte_kvargs_process(kvlist, MVTVM_ML_DEV_MAX_QPS, 
rte_kvargs_handle_u16,
                                         &mvtvm_mldev->max_nb_qpairs);
                if (ret < 0) {
                        plt_err("Error processing arguments, key = %s", 
MVTVM_ML_DEV_MAX_QPS);
@@ -79,8 +49,9 @@ mvtvm_mldev_parse_devargs(const char *args, struct 
mvtvm_ml_dev *mvtvm_mldev)
        }
 
        if (rte_kvargs_count(kvlist, MVTVM_ML_DEV_CACHE_MODEL_DATA) == 1) {
-               ret = rte_kvargs_process(kvlist, MVTVM_ML_DEV_CACHE_MODEL_DATA, 
&parse_integer_arg,
-                                        &mvtvm_mldev->cache_model_data);
+               ret = rte_kvargs_process_opt(kvlist, 
MVTVM_ML_DEV_CACHE_MODEL_DATA,
+                                            rte_kvargs_handle_bool,
+                                            &mvtvm_mldev->cache_model_data);
                if (ret < 0) {
                        plt_err("Error processing arguments, key = %s",
                                MVTVM_ML_DEV_CACHE_MODEL_DATA);
@@ -95,16 +66,8 @@ mvtvm_mldev_parse_devargs(const char *args, struct 
mvtvm_ml_dev *mvtvm_mldev)
                mvtvm_mldev->max_nb_qpairs = MVTVM_ML_DEV_MAX_QPS_DEFAULT;
        plt_ml_dbg("ML: %s = %u", MVTVM_ML_DEV_MAX_QPS, 
mvtvm_mldev->max_nb_qpairs);
 
-       if (!cache_model_data_set) {
+       if (!cache_model_data_set)
                mvtvm_mldev->cache_model_data = 
CN10K_ML_DEV_CACHE_MODEL_DATA_DEFAULT;
-       } else {
-               if ((mvtvm_mldev->cache_model_data < 0) || 
(mvtvm_mldev->cache_model_data > 1)) {
-                       plt_err("Invalid argument, %s = %d", 
MVTVM_ML_DEV_CACHE_MODEL_DATA,
-                               mvtvm_mldev->cache_model_data);
-                       ret = -EINVAL;
-                       goto exit;
-               }
-       }
        plt_ml_dbg("ML: %s = %d", MVTVM_ML_DEV_CACHE_MODEL_DATA, 
mvtvm_mldev->cache_model_data);
 
 exit:
diff --git a/drivers/ml/cnxk/mvtvm_ml_dev.h b/drivers/ml/cnxk/mvtvm_ml_dev.h
index 05e30f094c..f8b34ecd3a 100644
--- a/drivers/ml/cnxk/mvtvm_ml_dev.h
+++ b/drivers/ml/cnxk/mvtvm_ml_dev.h
@@ -31,7 +31,7 @@ struct mvtvm_ml_dev {
        uint16_t max_nb_qpairs;
 
        /* Enable / disable model data caching */
-       int cache_model_data;
+       bool cache_model_data;
 };
 
 #endif /* _MVTVM_ML_DEV_H_ */
-- 
2.53.0

Reply via email to