From 18e51dcadb45407368feae9bbcc9a428f346c538 Mon Sep 17 00:00:00 2001 From: shenchenkai Date: Sat, 18 Dec 2021 17:02:01 +0800 Subject: [PATCH] hilog: enhance maintenance for hilog ring buffer ohos inclusion category: feature issue: #I4N4XS CVE: NA -------------------------------- enhance maintenance for hilog ring buffer 1. If hilog ring buffer failed for verification, clean ring buffer to recover. 2. Print the count of dropped hilog if ring buffer is full. 3. Add HILOG_BUFFER_SIZE in Kconfig, so user can customized hlog ring buffer size by means of modifying the value of HILOG_BUFFER_SIZE Signed-off-by: shenchenkai --- drivers/staging/hievent/hievent_driver.c | 15 +++++++++++---- drivers/staging/hilog/Kconfig | 12 +++++++----- drivers/staging/hilog/hilog.c | 14 +++++++++++++- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/drivers/staging/hievent/hievent_driver.c b/drivers/staging/hievent/hievent_driver.c index b1a952c5a082..a22b4fcd7b94 100644 --- a/drivers/staging/hievent/hievent_driver.c +++ b/drivers/staging/hievent/hievent_driver.c @@ -177,6 +177,13 @@ static ssize_t hievent_read(struct file *file, char __user *user_buf, retval = header.len + sizeof(header); out: + if (retval == -ENOMEM) { + // clean ring buffer + hievent_dev.write_offset = 0; + hievent_dev.head_offset = 0; + hievent_dev.size = 0; + hievent_dev.count = 0; + } (void)mutex_unlock(&hievent_dev.mtx); return retval; @@ -286,7 +293,7 @@ static unsigned int hievent_poll(struct file *filep, return (POLLOUT | POLLWRNORM); } -static ssize_t hievent_write_iter(struct kiocb *iocb, struct iov_iter *from) +static ssize_t hievent_write_iter(struct kiocb *iocb, struct iov_iter *from) { int check_code = 0; unsigned char *temp_buffer = NULL; @@ -295,7 +302,7 @@ static ssize_t hievent_write_iter(struct kiocb *iocb, struct iov_iter *from) int buf_len; (void)iocb; - if (from->nr_segs != 3) { /* must contain 3 segments */ + if (from->nr_segs != 3) { /* must contain 3 segments */ retval = -EINVAL; goto out; } @@ -350,8 +357,8 @@ static ssize_t hievent_write_iter(struct kiocb *iocb, struct iov_iter *from) } static const struct file_operations hievent_fops = { - .read = hievent_read, /* read */ - .poll = hievent_poll, /* poll */ + .read = hievent_read, /* read */ + .poll = hievent_poll, /* poll */ .write_iter = hievent_write_iter, /* write_iter */ }; diff --git a/drivers/staging/hilog/Kconfig b/drivers/staging/hilog/Kconfig index 23fe9000b585..2ebe74017908 100644 --- a/drivers/staging/hilog/Kconfig +++ b/drivers/staging/hilog/Kconfig @@ -14,8 +14,10 @@ config HILOG If unsure, say N. -if HILOG -config HI_LOG_BUFFER_SIZE - int "hi log buffer size" - default "2048" -endif +config HILOG_BUFFER_SIZE + int "hilog buffer size" + depends on HILOG + default 4096 + help + Define the default ring buffer size of hilog + diff --git a/drivers/staging/hilog/hilog.c b/drivers/staging/hilog/hilog.c index bdc8f7416987..4ae6b7bf75ac 100644 --- a/drivers/staging/hilog/hilog.c +++ b/drivers/staging/hilog/hilog.c @@ -43,7 +43,7 @@ module_param(hilog_major, int, 0444); struct cdev g_hilog_cdev; -#define HILOG_BUFFER ((size_t)1024) +#define HILOG_BUFFER CONFIG_HILOG_BUFFER_SIZE #define HILOG_DRIVER "/dev/hilog" struct hilog_entry { @@ -186,6 +186,13 @@ static ssize_t hilog_read(struct file *file, hilog_buffer_dec(header.len); retval = header.len + sizeof(header); out: + if (retval == -ENOMEM) { + // clean ring buffer + hilog_dev.wr_off = 0; + hilog_dev.hdr_off = 0; + hilog_dev.size = 0; + hilog_dev.count = 0; + } (void)mutex_unlock(&hilog_dev.mtx); return retval; @@ -250,6 +257,7 @@ static void hilog_cover_old_log(size_t buf_len) int retval; struct hilog_entry header; size_t total_size = buf_len + sizeof(struct hilog_entry); + int drop_log_lines = 0; while (total_size + hilog_dev.size >= HILOG_BUFFER) { retval = hilog_read_ring_head_buffer((unsigned char *)&header, @@ -257,8 +265,12 @@ static void hilog_cover_old_log(size_t buf_len) if (retval < 0) break; + drop_log_lines++; hilog_buffer_dec(sizeof(header) + header.len); } + if (drop_log_lines > 0) + pr_info("hilog ringbuffer full, drop %d line(s) log", + drop_log_lines); } int hilog_write_internal(const char __user *buffer, size_t buf_len) -- Gitee