From fb9bd2a19af1fee78ea9b99ca43ad5f39bd877a1 Mon Sep 17 00:00:00 2001 From: Jian Jun Chen Date: Tue, 23 Apr 2019 09:39:45 +0800 Subject: [PATCH] dm: uart: use mevent_add only when it is a tty When acrn-dm is started by acrnd as a background process, STDIN is redirected to journal. In this case mevent_add cannot be called on the fd of STDIN. Tracked-On: #2998 Signed-off-by: Jian Jun Chen Acked-by: Yu Wang --- devicemodel/hw/uart_core.c | 43 ++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/devicemodel/hw/uart_core.c b/devicemodel/hw/uart_core.c index 6a56dbe81..f545c4fc0 100644 --- a/devicemodel/hw/uart_core.c +++ b/devicemodel/hw/uart_core.c @@ -790,10 +790,12 @@ uart_reset_backend(struct uart_backend *be) break; } - error = mevent_enable(evp); - if (error) { - WPRINTF(("mevent_enable error\n")); - return -1; + if (evp) { + error = mevent_enable(evp); + if (error) { + WPRINTF(("mevent_enable error\n")); + return -1; + } } return 0; @@ -821,13 +823,15 @@ uart_enable_backend(struct uart_backend *be, bool enable) return -1; } - if (enable) - error = mevent_enable(evp); - else - error = mevent_disable(evp); - if (error) { - WPRINTF(("mevent %s error\n", enable ? "enable" : "disable")); - return -1; + if (evp) { + if (enable) + error = mevent_enable(evp); + else + error = mevent_disable(evp); + if (error) { + WPRINTF(("mevent %s error\n", enable ? "enable" : "disable")); + return -1; + } } return 0; @@ -909,11 +913,18 @@ uart_config_backend(struct uart_vdev *uart, struct uart_backend *be, long port) atexit(uart_reset_stdio); } be->opened = true; - be->evp = mevent_add(fd, EVF_READ, uart_drain, uart, - uart_mevent_teardown, uart); - if (!be->evp) { - WPRINTF(("uart: mevent_add failed\n")); - return -1; + /* + * When acrn-dm is started by acrnd as a background process, + * STDIO is redirected to journal log file. In this case epoll + * cannot be used on a regular file. + */ + if (isatty(fd)) { + be->evp = mevent_add(fd, EVF_READ, uart_drain, uart, + uart_mevent_teardown, uart); + if (!be->evp) { + WPRINTF(("uart: mevent_add failed\n")); + return -1; + } } break; case UART_BE_SOCK: