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