xref: /dpdk/lib/eal/unix/eal_unix_thread.c (revision 9856af40449d73ed4c342df343355aa99cbc4b8a)
1a95d7054SDavid Marchand /* SPDX-License-Identifier: BSD-3-Clause
2a95d7054SDavid Marchand  * Copyright(c) 2022 Red Hat, Inc.
3a95d7054SDavid Marchand  */
4a95d7054SDavid Marchand 
5a95d7054SDavid Marchand #include <errno.h>
6a95d7054SDavid Marchand #include <unistd.h>
7a95d7054SDavid Marchand 
8a95d7054SDavid Marchand #include <rte_debug.h>
9a95d7054SDavid Marchand 
10a95d7054SDavid Marchand #include "eal_private.h"
11a95d7054SDavid Marchand 
12*9856af40SBruce Richardson int
eal_thread_wake_worker(unsigned int worker_id)13a95d7054SDavid Marchand eal_thread_wake_worker(unsigned int worker_id)
14a95d7054SDavid Marchand {
15a95d7054SDavid Marchand 	int m2w = lcore_config[worker_id].pipe_main2worker[1];
16a95d7054SDavid Marchand 	int w2m = lcore_config[worker_id].pipe_worker2main[0];
17a95d7054SDavid Marchand 	char c = 0;
18a95d7054SDavid Marchand 	int n;
19a95d7054SDavid Marchand 
20a95d7054SDavid Marchand 	do {
21a95d7054SDavid Marchand 		n = write(m2w, &c, 1);
22a95d7054SDavid Marchand 	} while (n == 0 || (n < 0 && errno == EINTR));
23a95d7054SDavid Marchand 	if (n < 0)
24*9856af40SBruce Richardson 		return -EPIPE;
25a95d7054SDavid Marchand 
26a95d7054SDavid Marchand 	do {
27a95d7054SDavid Marchand 		n = read(w2m, &c, 1);
28a95d7054SDavid Marchand 	} while (n < 0 && errno == EINTR);
29a95d7054SDavid Marchand 	if (n <= 0)
30*9856af40SBruce Richardson 		return -EPIPE;
31*9856af40SBruce Richardson 	return 0;
32a95d7054SDavid Marchand }
33a95d7054SDavid Marchand 
34a95d7054SDavid Marchand void
eal_thread_wait_command(void)35a95d7054SDavid Marchand eal_thread_wait_command(void)
36a95d7054SDavid Marchand {
37a95d7054SDavid Marchand 	unsigned int lcore_id = rte_lcore_id();
38a95d7054SDavid Marchand 	int m2w;
39a95d7054SDavid Marchand 	char c;
40a95d7054SDavid Marchand 	int n;
41a95d7054SDavid Marchand 
42a95d7054SDavid Marchand 	m2w = lcore_config[lcore_id].pipe_main2worker[0];
43a95d7054SDavid Marchand 	do {
44a95d7054SDavid Marchand 		n = read(m2w, &c, 1);
45a95d7054SDavid Marchand 	} while (n < 0 && errno == EINTR);
46a95d7054SDavid Marchand 	if (n <= 0)
47a95d7054SDavid Marchand 		rte_panic("cannot read on configuration pipe\n");
48a95d7054SDavid Marchand }
49a95d7054SDavid Marchand 
50a95d7054SDavid Marchand void
eal_thread_ack_command(void)51a95d7054SDavid Marchand eal_thread_ack_command(void)
52a95d7054SDavid Marchand {
53a95d7054SDavid Marchand 	unsigned int lcore_id = rte_lcore_id();
54a95d7054SDavid Marchand 	char c = 0;
55a95d7054SDavid Marchand 	int w2m;
56a95d7054SDavid Marchand 	int n;
57a95d7054SDavid Marchand 
58a95d7054SDavid Marchand 	w2m = lcore_config[lcore_id].pipe_worker2main[1];
59a95d7054SDavid Marchand 	do {
60a95d7054SDavid Marchand 		n = write(w2m, &c, 1);
61a95d7054SDavid Marchand 	} while (n == 0 || (n < 0 && errno == EINTR));
62a95d7054SDavid Marchand 	if (n < 0)
63a95d7054SDavid Marchand 		rte_panic("cannot write on configuration pipe\n");
64a95d7054SDavid Marchand }
65