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 Marchandeal_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 Marchandeal_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 Marchandeal_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