diff options
author | Matthew Smith <mgsmith@netgate.com> | 2018-07-17 11:40:04 -0500 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2018-07-19 12:47:35 +0000 |
commit | 43f02bb8a77337e2f56016529c9e46c8b8dc455a (patch) | |
tree | b4957bc45f1a9f91f6da097277538b100cb71cf1 /src/plugins | |
parent | 25668c899e5ee44c7a62e2782a2376f152c0a9cc (diff) |
dpdk: set log write fd to non-blocking
If a PMD writes too many log messages using rte_vlog(), the
pipe for logging can fill and then rte_vlog() will block
on fflush() while it waits for something to read from the other
side of the pipe. That will never happen since the process node
that would read the other side of the pipe runs in the
same thread.
Set the write fd to non-blocking before the call to
rte_openlog_stream(). If the pipe is full, calls to write() or
fflush() will fail but execution will continue.
Change-Id: I0e5d710629633acda5617ff29897d6582c255d57
Signed-off-by: Matthew Smith <mgsmith@netgate.com>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/dpdk/device/init.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/plugins/dpdk/device/init.c b/src/plugins/dpdk/device/init.c index ebb43d1a86f..a08ed6d908f 100644 --- a/src/plugins/dpdk/device/init.c +++ b/src/plugins/dpdk/device/init.c @@ -1356,14 +1356,22 @@ dpdk_config (vlib_main_t * vm, unformat_input_t * input) int log_fds[2] = { 0 }; if (pipe (log_fds) == 0) { - FILE *f = fdopen (log_fds[1], "a"); - if (f && rte_openlog_stream (f) == 0) + if (fcntl (log_fds[1], F_SETFL, O_NONBLOCK) == 0) { - clib_file_t t = { 0 }; - t.read_function = dpdk_log_read_ready; - t.file_descriptor = log_fds[0]; - t.description = format (0, "DPDK logging pipe"); - clib_file_add (&file_main, &t); + FILE *f = fdopen (log_fds[1], "a"); + if (f && rte_openlog_stream (f) == 0) + { + clib_file_t t = { 0 }; + t.read_function = dpdk_log_read_ready; + t.file_descriptor = log_fds[0]; + t.description = format (0, "DPDK logging pipe"); + clib_file_add (&file_main, &t); + } + } + else + { + close (log_fds[0]); + close (log_fds[1]); } } |