1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2014 Intel Corporation 3 */ 4 5 #include <stdio.h> 6 7 #include "test.h" 8 9 #include <stdint.h> 10 #include <stdlib.h> 11 #include <stdarg.h> 12 #include <inttypes.h> 13 #include <sys/queue.h> 14 #include <errno.h> 15 #include <string.h> 16 #include <unistd.h> 17 18 #ifdef RTE_EXEC_ENV_WINDOWS 19 int 20 test_mp_secondary(void) 21 { 22 printf("mp_secondary not supported on Windows, skipping test\n"); 23 return TEST_SKIPPED; 24 } 25 #else 26 27 #include <sys/wait.h> 28 #include <libgen.h> 29 #include <dirent.h> 30 #include <limits.h> 31 32 #include <rte_common.h> 33 #include <rte_memory.h> 34 #include <rte_memzone.h> 35 #include <rte_eal.h> 36 #include <rte_launch.h> 37 #include <rte_per_lcore.h> 38 #include <rte_lcore.h> 39 #include <rte_errno.h> 40 #include <rte_branch_prediction.h> 41 #include <rte_ring.h> 42 #include <rte_debug.h> 43 #include <rte_log.h> 44 #include <rte_mempool.h> 45 46 #ifdef RTE_LIB_HASH 47 #include <rte_hash.h> 48 #include <rte_fbk_hash.h> 49 #endif /* RTE_LIB_HASH */ 50 51 #ifdef RTE_LIB_LPM 52 #include <rte_lpm.h> 53 #endif /* RTE_LIB_LPM */ 54 55 #include <rte_string_fns.h> 56 57 #include "process.h" 58 59 #define launch_proc(ARGV) process_dup(ARGV, RTE_DIM(ARGV), __func__) 60 61 /* 62 * This function is called in the primary i.e. main test, to spawn off secondary 63 * processes to run actual mp tests. Uses fork() and exec pair 64 */ 65 static int 66 run_secondary_instances(void) 67 { 68 int ret = 0; 69 char coremask[10]; 70 71 #ifdef RTE_EXEC_ENV_LINUX 72 char tmp[PATH_MAX] = {0}; 73 char prefix[PATH_MAX] = {0}; 74 75 get_current_prefix(tmp, sizeof(tmp)); 76 77 snprintf(prefix, sizeof(prefix), "--file-prefix=%s", tmp); 78 #else 79 const char *prefix = ""; 80 #endif 81 82 /* good case, using secondary */ 83 const char *argv1[] = { 84 prgname, "-c", coremask, "--proc-type=secondary", 85 prefix 86 }; 87 /* good case, using auto */ 88 const char *argv2[] = { 89 prgname, "-c", coremask, "--proc-type=auto", 90 prefix 91 }; 92 /* bad case, using invalid type */ 93 const char *argv3[] = { 94 prgname, "-c", coremask, "--proc-type=ERROR", 95 prefix 96 }; 97 #ifdef RTE_EXEC_ENV_LINUX 98 /* bad case, using invalid file prefix */ 99 const char *argv4[] = { 100 prgname, "-c", coremask, "--proc-type=secondary", 101 "--file-prefix=ERROR" 102 }; 103 #endif 104 105 snprintf(coremask, sizeof(coremask), "%x", \ 106 (1 << rte_get_main_lcore())); 107 108 ret |= launch_proc(argv1); 109 printf("### Testing rte_mp_disable() reject:\n"); 110 if (rte_mp_disable()) { 111 printf("Error: rte_mp_disable() has been accepted\n"); 112 ret |= -1; 113 } else { 114 printf("# Checked rte_mp_disable() is refused\n"); 115 } 116 ret |= launch_proc(argv2); 117 118 ret |= !(launch_proc(argv3)); 119 #ifdef RTE_EXEC_ENV_LINUX 120 ret |= !(launch_proc(argv4)); 121 #endif 122 123 return ret; 124 } 125 126 /* 127 * This function is run in the secondary instance to test that creation of 128 * objects fails in a secondary 129 */ 130 static int 131 run_object_creation_tests(void) 132 { 133 const unsigned flags = 0; 134 const unsigned size = 1024; 135 const unsigned elt_size = 64; 136 const unsigned cache_size = 64; 137 const unsigned priv_data_size = 32; 138 139 printf("### Testing object creation - expect lots of mz reserve errors!\n"); 140 141 rte_errno = 0; 142 if ((rte_memzone_reserve("test_mz", size, rte_socket_id(), 143 flags) == NULL) && 144 (rte_memzone_lookup("test_mz") == NULL)) { 145 printf("Error: unexpected return value from rte_memzone_reserve\n"); 146 return -1; 147 } 148 printf("# Checked rte_memzone_reserve() OK\n"); 149 150 rte_errno = 0; 151 if ((rte_ring_create( 152 "test_ring", size, rte_socket_id(), flags) == NULL) && 153 (rte_ring_lookup("test_ring") == NULL)){ 154 printf("Error: unexpected return value from rte_ring_create()\n"); 155 return -1; 156 } 157 printf("# Checked rte_ring_create() OK\n"); 158 159 rte_errno = 0; 160 if ((rte_mempool_create("test_mp", size, elt_size, cache_size, 161 priv_data_size, NULL, NULL, NULL, NULL, 162 rte_socket_id(), flags) == NULL) && 163 (rte_mempool_lookup("test_mp") == NULL)){ 164 printf("Error: unexpected return value from rte_mempool_create()\n"); 165 return -1; 166 } 167 printf("# Checked rte_mempool_create() OK\n"); 168 169 #ifdef RTE_LIB_HASH 170 const struct rte_hash_parameters hash_params = { .name = "test_mp_hash" }; 171 rte_errno=0; 172 if ((rte_hash_create(&hash_params) != NULL) && 173 (rte_hash_find_existing(hash_params.name) == NULL)){ 174 printf("Error: unexpected return value from rte_hash_create()\n"); 175 return -1; 176 } 177 printf("# Checked rte_hash_create() OK\n"); 178 179 const struct rte_fbk_hash_params fbk_params = { .name = "test_fbk_mp_hash" }; 180 rte_errno=0; 181 if ((rte_fbk_hash_create(&fbk_params) != NULL) && 182 (rte_fbk_hash_find_existing(fbk_params.name) == NULL)){ 183 printf("Error: unexpected return value from rte_fbk_hash_create()\n"); 184 return -1; 185 } 186 printf("# Checked rte_fbk_hash_create() OK\n"); 187 #endif 188 189 #ifdef RTE_LIB_LPM 190 rte_errno=0; 191 struct rte_lpm_config config; 192 193 config.max_rules = rte_socket_id(); 194 config.number_tbl8s = 256; 195 config.flags = 0; 196 if ((rte_lpm_create("test_lpm", size, &config) != NULL) && 197 (rte_lpm_find_existing("test_lpm") == NULL)){ 198 printf("Error: unexpected return value from rte_lpm_create()\n"); 199 return -1; 200 } 201 printf("# Checked rte_lpm_create() OK\n"); 202 #endif 203 204 return 0; 205 } 206 207 /* if called in a primary process, just spawns off a secondary process to 208 * run validation tests - which brings us right back here again... 209 * if called in a secondary process, this runs a series of API tests to check 210 * how things run in a secondary instance. 211 */ 212 int 213 test_mp_secondary(void) 214 { 215 if (rte_eal_process_type() == RTE_PROC_PRIMARY) { 216 return run_secondary_instances(); 217 } 218 219 printf("IN SECONDARY PROCESS\n"); 220 221 return run_object_creation_tests(); 222 } 223 224 #endif /* !RTE_EXEC_ENV_WINDOWS */ 225 226 REGISTER_TEST_COMMAND(multiprocess_autotest, test_mp_secondary); 227