From patchwork Thu Mar 23 15:28:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srikanth Yalavarthi X-Patchwork-Id: 125459 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id EF9A442826; Thu, 23 Mar 2023 16:28:25 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CE27040689; Thu, 23 Mar 2023 16:28:25 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id B064F4021E for ; Thu, 23 Mar 2023 16:28:24 +0100 (CET) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 32NBaCEY024300 for ; Thu, 23 Mar 2023 08:28:20 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : mime-version : content-type; s=pfpt0220; bh=VuzZBen8ktmFrQ3MGRQ/NRl5wJUqg7XY/ouFzYj8pZs=; b=MX1D56tTvB54LUBRPquyxjq8b9es33zDeDHhuMaMUCCRs3SOJh4Qln09ZXEhs2L0TgRI +E0fWTiUrMjAF4dA1FFCOvcAZouWuKTPn7OgbHa0WAy6aJsBoqYEez06jKfovY5s9Ocy P5TRew8876ZfxPXJsT4Jc5FZQNIz+BeeT3vjzk+iOs1cVcwQT073Jct3Ub6jZNtz4vIj giW87yXX3+0WsXasfnInOnbVl289PoFOOT1g96rxVcG9iSga5ASEztKwccXztIpLX85F y4b8KiDRQZsPsv5zIq3Hw5i4/sqZYA6MvQAlyRchFdSE0m6HWIV6mHJEiboR2QzAl0Ew 8g== Received: from dc5-exch02.marvell.com ([199.233.59.182]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3pg9urc89x-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Thu, 23 Mar 2023 08:28:14 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Thu, 23 Mar 2023 08:28:03 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.42 via Frontend Transport; Thu, 23 Mar 2023 08:28:03 -0700 Received: from ml-host-33.caveonetworks.com (unknown [10.110.143.233]) by maili.marvell.com (Postfix) with ESMTP id D20AA3F7076; Thu, 23 Mar 2023 08:28:03 -0700 (PDT) From: Srikanth Yalavarthi To: Srikanth Yalavarthi , Anup Prabhu CC: , , Subject: [PATCH 1/1] app/mldev: add internal function for file read Date: Thu, 23 Mar 2023 08:28:01 -0700 Message-ID: <20230323152801.27666-1-syalavarthi@marvell.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 X-Proofpoint-GUID: e4pzS0_bkHYHaY9w1IgOXiVo2QCujgP3 X-Proofpoint-ORIG-GUID: e4pzS0_bkHYHaY9w1IgOXiVo2QCujgP3 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-03-22_21,2023-03-23_02,2023-02-09_01 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Added internal function to read model, input and reference files with required error checks. This change fixes the unchecked return value and improper use of negative value issues reported by coverity scan for file read operations. Coverity issue: 383742, 383743 Fixes: f6661e6d9a3a ("app/mldev: validate model operations") Fixes: da6793390596 ("app/mldev: support inference validation") Signed-off-by: Srikanth Yalavarthi --- app/test-mldev/test_common.c | 59 ++++++++++++++++++++++++++ app/test-mldev/test_common.h | 2 + app/test-mldev/test_inference_common.c | 54 +++++++++-------------- app/test-mldev/test_model_common.c | 33 +++----------- 4 files changed, 87 insertions(+), 61 deletions(-) diff --git a/app/test-mldev/test_common.c b/app/test-mldev/test_common.c index 016b31c6ba..3f450d6a4d 100644 --- a/app/test-mldev/test_common.c +++ b/app/test-mldev/test_common.c @@ -5,12 +5,71 @@ #include #include +#include #include #include #include "ml_common.h" #include "test_common.h" +int +ml_read_file(char *file, size_t *size, char **buffer) +{ + char *file_buffer = NULL; + long file_size = 0; + int ret = 0; + FILE *fp; + + fp = fopen(file, "r"); + if (fp == NULL) { + ml_err("Failed to open file: %s\n", file); + return -EIO; + } + + if (fseek(fp, 0, SEEK_END) == 0) { + file_size = ftell(fp); + if (file_size == -1) { + ret = -EIO; + goto error; + } + + file_buffer = rte_malloc(NULL, file_size, RTE_CACHE_LINE_SIZE); + if (file_buffer == NULL) { + ml_err("Failed to allocate memory: %s\n", file); + ret = -ENOMEM; + goto error; + } + + if (fseek(fp, 0, SEEK_SET) != 0) { + ret = -EIO; + goto error; + } + + if (fread(file_buffer, sizeof(char), file_size, fp) != (unsigned long)file_size) { + ml_err("Failed to read file : %s\n", file); + ret = -EIO; + goto error; + } + fclose(fp); + } else { + ret = -EIO; + goto error; + } + + *buffer = file_buffer; + *size = file_size; + + return 0; + +error: + rte_free(file_buffer); + + if (fp != NULL) + fclose(fp); + + return ret; +} + bool ml_test_cap_check(struct ml_options *opt) { diff --git a/app/test-mldev/test_common.h b/app/test-mldev/test_common.h index a7b2ea652a..7e3634b0c6 100644 --- a/app/test-mldev/test_common.h +++ b/app/test-mldev/test_common.h @@ -24,4 +24,6 @@ int ml_test_device_close(struct ml_test *test, struct ml_options *opt); int ml_test_device_start(struct ml_test *test, struct ml_options *opt); int ml_test_device_stop(struct ml_test *test, struct ml_options *opt); +int ml_read_file(char *file, size_t *size, char **buffer); + #endif /* TEST_COMMON_H */ diff --git a/app/test-mldev/test_inference_common.c b/app/test-mldev/test_inference_common.c index af831fc1bf..c8cd80d69f 100644 --- a/app/test-mldev/test_inference_common.c +++ b/app/test-mldev/test_inference_common.c @@ -604,10 +604,10 @@ ml_inference_iomem_setup(struct ml_test *test, struct ml_options *opt, uint16_t char mp_name[RTE_MEMPOOL_NAMESIZE]; const struct rte_memzone *mz; uint64_t nb_buffers; + char *buffer = NULL; uint32_t buff_size; uint32_t mz_size; - uint32_t fsize; - FILE *fp; + size_t fsize; int ret; /* get input buffer size */ @@ -647,51 +647,35 @@ ml_inference_iomem_setup(struct ml_test *test, struct ml_options *opt, uint16_t t->model[fid].reference = NULL; /* load input file */ - fp = fopen(opt->filelist[fid].input, "r"); - if (fp == NULL) { - ml_err("Failed to open input file : %s\n", opt->filelist[fid].input); - ret = -errno; + ret = ml_read_file(opt->filelist[fid].input, &fsize, &buffer); + if (ret != 0) goto error; - } - fseek(fp, 0, SEEK_END); - fsize = ftell(fp); - fseek(fp, 0, SEEK_SET); - if (fsize != t->model[fid].inp_dsize) { - ml_err("Invalid input file, size = %u (expected size = %" PRIu64 ")\n", fsize, + if (fsize == t->model[fid].inp_dsize) { + rte_memcpy(t->model[fid].input, buffer, fsize); + rte_free(buffer); + } else { + ml_err("Invalid input file, size = %zu (expected size = %" PRIu64 ")\n", fsize, t->model[fid].inp_dsize); ret = -EINVAL; - fclose(fp); - goto error; - } - - if (fread(t->model[fid].input, 1, t->model[fid].inp_dsize, fp) != t->model[fid].inp_dsize) { - ml_err("Failed to read input file : %s\n", opt->filelist[fid].input); - ret = -errno; - fclose(fp); goto error; } - fclose(fp); /* load reference file */ if (t->model[fid].reference != NULL) { - fp = fopen(opt->filelist[fid].reference, "r"); - if (fp == NULL) { - ml_err("Failed to open reference file : %s\n", - opt->filelist[fid].reference); - ret = -errno; + ret = ml_read_file(opt->filelist[fid].reference, &fsize, &buffer); + if (ret != 0) goto error; - } - if (fread(t->model[fid].reference, 1, t->model[fid].out_dsize, fp) != - t->model[fid].out_dsize) { - ml_err("Failed to read reference file : %s\n", - opt->filelist[fid].reference); - ret = -errno; - fclose(fp); + if (fsize == t->model[fid].out_dsize) { + rte_memcpy(t->model[fid].reference, buffer, fsize); + rte_free(buffer); + } else { + ml_err("Invalid reference file, size = %zu (expected size = %" PRIu64 ")\n", + fsize, t->model[fid].out_dsize); + ret = -EINVAL; goto error; } - fclose(fp); } /* create mempool for quantized input and output buffers. ml_request_initialize is @@ -723,6 +707,8 @@ ml_inference_iomem_setup(struct ml_test *test, struct ml_options *opt, uint16_t t->model[fid].io_pool = NULL; } + rte_free(buffer); + return ret; } diff --git a/app/test-mldev/test_model_common.c b/app/test-mldev/test_model_common.c index c28e452f29..7a8c284d13 100644 --- a/app/test-mldev/test_model_common.c +++ b/app/test-mldev/test_model_common.c @@ -14,11 +14,11 @@ int ml_model_load(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid) { - struct test_common *t = ml_test_priv(test); struct rte_ml_model_params model_params; - FILE *fp; int ret; + RTE_SET_USED(test); + if (model->state == MODEL_LOADED) return 0; @@ -26,31 +26,10 @@ ml_model_load(struct ml_test *test, struct ml_options *opt, struct ml_model *mod return -EINVAL; /* read model binary */ - fp = fopen(opt->filelist[fid].model, "r"); - if (fp == NULL) { - ml_err("Failed to open model file : %s\n", opt->filelist[fid].model); - return -1; - } - - fseek(fp, 0, SEEK_END); - model_params.size = ftell(fp); - fseek(fp, 0, SEEK_SET); - - model_params.addr = rte_malloc_socket("ml_model", model_params.size, - t->dev_info.min_align_size, opt->socket_id); - if (model_params.addr == NULL) { - ml_err("Failed to allocate memory for model: %s\n", opt->filelist[fid].model); - fclose(fp); - return -ENOMEM; - } - - if (fread(model_params.addr, 1, model_params.size, fp) != model_params.size) { - ml_err("Failed to read model file : %s\n", opt->filelist[fid].model); - rte_free(model_params.addr); - fclose(fp); - return -1; - } - fclose(fp); + ret = ml_read_file(opt->filelist[fid].model, &model_params.size, + (char **)&model_params.addr); + if (ret != 0) + return ret; /* load model to device */ ret = rte_ml_model_load(opt->dev_id, &model_params, &model->id);