diff --git a/drivers/staging/hievent/hievent_driver.c b/drivers/staging/hievent/hievent_driver.c index b1a952c5a082292dcb3747420610e31dc88f8d84..a22b4fcd7b9475110ed73bd49e4d3acfdb6c358b 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 23fe9000b58510ba9e656781ebd49862bafd781b..2ebe740179085897de1dc75c870d0d093d3195af 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 bdc8f7416987f0d45140f5318068dda28451f9bc..4ae6b7bf75ac7bf40d3fbe66aece5d2bb8e61774 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)