From fd121f0d42ffb807da229e7842d1c4779ff2e8cd Mon Sep 17 00:00:00 2001 From: Michal Bloch Date: Wed, 22 Apr 2020 20:18:08 +0200 Subject: [PATCH] logger: allow polling time control through config "epoll_time_ms" entry. Change-Id: I0c911978902d18b2d922663a24fe1caeb6d330e8 Signed-off-by: Michal Bloch --- configs/dlog.conf | 6 ++++++ src/logger/logger.c | 8 +++++++- src/logger/logger_internal.h | 2 ++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/configs/dlog.conf b/configs/dlog.conf index 6702bc6..f50a6fd 100644 --- a/configs/dlog.conf +++ b/configs/dlog.conf @@ -63,6 +63,12 @@ syslog_size=1048576 # This only affects some "external" buffers not populated by libdlog, currently only kmsg. handle_kmsg=1 +# epoll delay, meaning how often the daemon wakes up to do bookkeeping +# and flush passive logging files when no new logs are incoming. +# Higher values mean lower CPU usage, but can also mean some log delay +# for continuous dlogutil instances. +epoll_time_ms=1000 + # Syslog handling currently disabled in the daemon - not needed in Tizen. #dlog_logger_conf_syslog=dlogutil -b syslog -r 256 -n 1 -f /var/log/dlog/syslog -v recv_realtime diff --git a/src/logger/logger.c b/src/logger/logger.c index 23737f4..07378ba 100644 --- a/src/logger/logger.c +++ b/src/logger/logger.c @@ -56,6 +56,8 @@ static struct { .reader_init = NULL }; +static const int DEFAULT_EPOLL_TIME_MS = 1000; + /** * @brief Parse permissions * @details Parse a string representation of permissions to the internal integral one @@ -1760,6 +1762,7 @@ static int logger_create(struct logger_config_data *data, struct logger *l) l->epollfd = epoll_create1(0); if (l->epollfd == -1) return -errno; + l->epolltime = data->epoll_time; l->buf_params = data->buf_params; @@ -1931,12 +1934,13 @@ static int do_logger(struct logger* server) int r = initialize_epoll_size(&events, &events_size); if (r < 0) return r; + while (g_logger_run) { clock_gettime(CLOCK_MONOTONIC, &server->now); ensure_epoll_size(&events, &events_size, server->epollcnt); - int nfds = epoll_wait(server->epollfd, events, events_size, 1000); + int nfds = epoll_wait(server->epollfd, events, events_size, server->epolltime); if (nfds < 0 && errno == EINTR) // TODO: This is *almost* TEMP_FAILURE_RETRY. Is it equivalent? continue; @@ -2100,6 +2104,8 @@ int prepare_config_data(struct logger_config_data *data) g_backend.logger_device_throttling[i] = max_int(1, log_config_get_int(&conf, key, throttling_default)); } + data->epoll_time = log_config_get_int(&conf, "epoll_time_ms", DEFAULT_EPOLL_TIME_MS); + memset(data->is_buffer_enabled, 0, sizeof(data->is_buffer_enabled)); if (!strcmp(backend, "pipe")) { data->is_buffer_enabled[LOG_ID_MAIN] = diff --git a/src/logger/logger_internal.h b/src/logger/logger_internal.h index 4a13150..c32dd62 100644 --- a/src/logger/logger_internal.h +++ b/src/logger/logger_internal.h @@ -204,6 +204,7 @@ struct buf_params { struct logger { int epollfd; unsigned epollcnt; + int epolltime; list_head writers; list_head extra_readers; struct log_buffer* buffers[LOG_ID_MAX]; @@ -227,6 +228,7 @@ struct buffer_config_data { struct logger_config_data { struct buf_params buf_params; list_head logfile_configs; + int epoll_time; int is_buffer_enabled[LOG_ID_MAX]; struct buffer_config_data buffers[LOG_ID_MAX]; }; -- 2.7.4