Branch data Line data Source code
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 : 1 : run_secondary_instances(void)
67 : : {
68 : : int ret = 0;
69 : : char core_str[10];
70 : :
71 : : #ifdef RTE_EXEC_ENV_LINUX
72 : 1 : char tmp[PATH_MAX] = {0};
73 : 1 : char prefix[PATH_MAX] = {0};
74 : :
75 : 1 : 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 : 1 : const char *argv1[] = {
84 : : prgname, "-l", core_str, "--proc-type=secondary",
85 : : prefix
86 : : };
87 : : /* good case, using auto */
88 : 1 : const char *argv2[] = {
89 : : prgname, "-l", core_str, "--proc-type=auto",
90 : : prefix
91 : : };
92 : : /* bad case, using invalid type */
93 : 1 : const char *argv3[] = {
94 : : prgname, "-l", core_str, "--proc-type=ERROR",
95 : : prefix
96 : : };
97 : : #ifdef RTE_EXEC_ENV_LINUX
98 : : /* bad case, using invalid file prefix */
99 : 1 : const char *argv4[] = {
100 : : prgname, "-l", core_str, "--proc-type=secondary",
101 : : "--file-prefix=ERROR"
102 : : };
103 : : #endif
104 : :
105 : 1 : snprintf(core_str, sizeof(core_str), "%u", rte_get_main_lcore());
106 : :
107 : 1 : ret |= launch_proc(argv1);
108 : : printf("### Testing rte_mp_disable() reject:\n");
109 [ - + ]: 1 : if (rte_mp_disable()) {
110 : : printf("Error: rte_mp_disable() has been accepted\n");
111 : : ret |= -1;
112 : : } else {
113 : : printf("# Checked rte_mp_disable() is refused\n");
114 : : }
115 : 1 : ret |= launch_proc(argv2);
116 : :
117 : 1 : ret |= !(launch_proc(argv3));
118 : : #ifdef RTE_EXEC_ENV_LINUX
119 : 1 : ret |= !(launch_proc(argv4));
120 : : #endif
121 : :
122 : 1 : return ret;
123 : : }
124 : :
125 : : /*
126 : : * This function is run in the secondary instance to test that creation of
127 : : * objects fails in a secondary
128 : : */
129 : : static int
130 : 2 : run_object_creation_tests(void)
131 : : {
132 : : const unsigned flags = 0;
133 : : const unsigned size = 1024;
134 : : const unsigned elt_size = 64;
135 : : const unsigned cache_size = 64;
136 : : const unsigned priv_data_size = 32;
137 : :
138 : : printf("### Testing object creation - expect lots of mz reserve errors!\n");
139 : :
140 : 2 : rte_errno = 0;
141 [ + + ]: 2 : if ((rte_memzone_reserve("test_mz", size, rte_socket_id(),
142 [ - + ]: 1 : flags) == NULL) &&
143 : 1 : (rte_memzone_lookup("test_mz") == NULL)) {
144 : : printf("Error: unexpected return value from rte_memzone_reserve\n");
145 : 0 : return -1;
146 : : }
147 : : printf("# Checked rte_memzone_reserve() OK\n");
148 : :
149 : 2 : rte_errno = 0;
150 [ + + ]: 2 : if ((rte_ring_create(
151 [ - + ]: 3 : "test_ring", size, rte_socket_id(), flags) == NULL) &&
152 : 1 : (rte_ring_lookup("test_ring") == NULL)){
153 : : printf("Error: unexpected return value from rte_ring_create()\n");
154 : 0 : return -1;
155 : : }
156 : : printf("# Checked rte_ring_create() OK\n");
157 : :
158 : 2 : rte_errno = 0;
159 [ + + ]: 2 : if ((rte_mempool_create("test_mp", size, elt_size, cache_size,
160 : : priv_data_size, NULL, NULL, NULL, NULL,
161 [ - + ]: 3 : rte_socket_id(), flags) == NULL) &&
162 : 1 : (rte_mempool_lookup("test_mp") == NULL)){
163 : : printf("Error: unexpected return value from rte_mempool_create()\n");
164 : 0 : return -1;
165 : : }
166 : : printf("# Checked rte_mempool_create() OK\n");
167 : :
168 : : #ifdef RTE_LIB_HASH
169 : 2 : const struct rte_hash_parameters hash_params = { .name = "test_mp_hash" };
170 : 2 : rte_errno=0;
171 [ - + - - ]: 2 : if ((rte_hash_create(&hash_params) != NULL) &&
172 : 0 : (rte_hash_find_existing(hash_params.name) == NULL)){
173 : : printf("Error: unexpected return value from rte_hash_create()\n");
174 : 0 : return -1;
175 : : }
176 : : printf("# Checked rte_hash_create() OK\n");
177 : :
178 : 2 : const struct rte_fbk_hash_params fbk_params = { .name = "test_fbk_mp_hash" };
179 : 2 : rte_errno=0;
180 [ - + - - ]: 2 : if ((rte_fbk_hash_create(&fbk_params) != NULL) &&
181 : 0 : (rte_fbk_hash_find_existing(fbk_params.name) == NULL)){
182 : : printf("Error: unexpected return value from rte_fbk_hash_create()\n");
183 : 0 : return -1;
184 : : }
185 : : printf("# Checked rte_fbk_hash_create() OK\n");
186 : : #endif
187 : :
188 : : #ifdef RTE_LIB_LPM
189 : 2 : rte_errno=0;
190 : : struct rte_lpm_config config;
191 : :
192 : 2 : config.max_rules = rte_socket_id();
193 : 2 : config.number_tbl8s = 256;
194 : 2 : config.flags = 0;
195 [ - + - - ]: 2 : if ((rte_lpm_create("test_lpm", size, &config) != NULL) &&
196 : 0 : (rte_lpm_find_existing("test_lpm") == NULL)){
197 : : printf("Error: unexpected return value from rte_lpm_create()\n");
198 : 0 : return -1;
199 : : }
200 : : printf("# Checked rte_lpm_create() OK\n");
201 : : #endif
202 : :
203 : 2 : return 0;
204 : : }
205 : :
206 : : /* if called in a primary process, just spawns off a secondary process to
207 : : * run validation tests - which brings us right back here again...
208 : : * if called in a secondary process, this runs a series of API tests to check
209 : : * how things run in a secondary instance.
210 : : */
211 : : int
212 : 3 : test_mp_secondary(void)
213 : : {
214 [ + + ]: 3 : if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
215 : 1 : return run_secondary_instances();
216 : : }
217 : :
218 : : printf("IN SECONDARY PROCESS\n");
219 : :
220 : 2 : return run_object_creation_tests();
221 : : }
222 : :
223 : : #endif /* !RTE_EXEC_ENV_WINDOWS */
224 : :
225 : 258 : REGISTER_FAST_TEST(multiprocess_autotest, NOHUGE_SKIP, ASAN_SKIP, test_mp_secondary);
|