1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) 2022 Marvell. 3 */ 4 5 #include <rte_common.h> 6 #include <rte_launch.h> 7 8 #include "ml_common.h" 9 #include "test_inference_common.h" 10 11 static int 12 test_inference_interleave_driver(struct ml_test *test, struct ml_options *opt) 13 { 14 struct test_inference *t; 15 uint16_t fid = 0; 16 int ret = 0; 17 18 t = ml_test_priv(test); 19 20 ret = ml_inference_mldev_setup(test, opt); 21 if (ret != 0) 22 return ret; 23 24 ret = ml_inference_mem_setup(test, opt); 25 if (ret != 0) 26 return ret; 27 28 /* load and start all models */ 29 for (fid = 0; fid < opt->nb_filelist; fid++) { 30 ret = ml_model_load(test, opt, &t->model[fid], fid); 31 if (ret != 0) 32 goto error; 33 34 ret = ml_model_start(test, opt, &t->model[fid], fid); 35 if (ret != 0) 36 goto error; 37 38 ret = ml_inference_iomem_setup(test, opt, fid); 39 if (ret != 0) 40 goto error; 41 } 42 43 /* launch inference requests */ 44 ret = ml_inference_launch_cores(test, opt, 0, opt->nb_filelist - 1); 45 if (ret != 0) { 46 ml_err("failed to launch cores"); 47 goto error; 48 } 49 50 rte_eal_mp_wait_lcore(); 51 52 /* stop and unload all models */ 53 for (fid = 0; fid < opt->nb_filelist; fid++) { 54 ret = ml_inference_result(test, opt, fid); 55 if (ret != ML_TEST_SUCCESS) 56 goto error; 57 58 ml_inference_iomem_destroy(test, opt, fid); 59 } 60 61 ml_inference_stats_get(test, opt); 62 63 for (fid = 0; fid < opt->nb_filelist; fid++) { 64 ret = ml_model_stop(test, opt, &t->model[fid], fid); 65 if (ret != 0) 66 goto error; 67 68 ret = ml_model_unload(test, opt, &t->model[fid], fid); 69 if (ret != 0) 70 goto error; 71 } 72 73 ml_inference_mem_destroy(test, opt); 74 75 ret = ml_inference_mldev_destroy(test, opt); 76 if (ret != 0) 77 return ret; 78 79 t->cmn.result = ML_TEST_SUCCESS; 80 81 return 0; 82 83 error: 84 ml_inference_mem_destroy(test, opt); 85 for (fid = 0; fid < opt->nb_filelist; fid++) { 86 ml_inference_iomem_destroy(test, opt, fid); 87 ml_model_stop(test, opt, &t->model[fid], fid); 88 ml_model_unload(test, opt, &t->model[fid], fid); 89 } 90 91 t->cmn.result = ML_TEST_FAILED; 92 93 return ret; 94 } 95 96 static int 97 test_inference_interleave_result(struct ml_test *test, struct ml_options *opt) 98 { 99 struct test_inference *t; 100 101 RTE_SET_USED(opt); 102 103 t = ml_test_priv(test); 104 105 return t->cmn.result; 106 } 107 108 static const struct ml_test_ops inference_interleave = { 109 .cap_check = test_inference_cap_check, 110 .opt_check = test_inference_opt_check, 111 .opt_dump = test_inference_opt_dump, 112 .test_setup = test_inference_setup, 113 .test_destroy = test_inference_destroy, 114 .test_driver = test_inference_interleave_driver, 115 .test_result = test_inference_interleave_result, 116 }; 117 118 ML_TEST_REGISTER(inference_interleave); 119