From 522b0cee4c25ea926d0acd9448c9af77bff3e7ca Mon Sep 17 00:00:00 2001 From: Bruce Hoo Date: Tue, 8 Mar 2022 12:54:16 +0800 Subject: [PATCH] disp: msm: optimize devcoredump read operation duration Set a flag to avoid multiple reading of sde_dbg info, that reduces devcoredump reading time. Change-Id: I83f77dea35bb818d51b0982124a54ffeef7db8af Signed-off-by: Bruce Hoo --- msm/sde_dbg.c | 48 ++++++++++++++++++++++++++++++++++++-------- msm/sde_dbg_evtlog.c | 2 +- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/msm/sde_dbg.c b/msm/sde_dbg.c index b48c57c5c2..e87ee53033 100644 --- a/msm/sde_dbg.c +++ b/msm/sde_dbg.c @@ -304,6 +304,8 @@ struct sde_dbg_base { u32 cur_reglog_index; enum sde_dbg_dump_context dump_mode; bool hw_ownership; + char *read_buf; + bool is_dumped; } sde_dbg_base; static LIST_HEAD(sde_dbg_dsi_list); @@ -1339,21 +1341,19 @@ static void _sde_dump_array(bool do_panic, const char *name, bool dump_secure, u } #ifdef CONFIG_DEV_COREDUMP -static ssize_t sde_devcoredump_read(char *buffer, loff_t offset, - size_t count, void *data, size_t datalen) +#define MAX_BUFF_SIZE ((3072 - 256) * 1024) + +static ssize_t sde_devcoredump_drm_read(char *buffer, size_t size) { struct drm_print_iterator iter; struct drm_printer p; iter.data = buffer; - iter.offset = 0; - iter.start = offset; - iter.remain = count; + iter.start = 0; + iter.remain = size; p = drm_coredump_printer(&iter); - drm_printf(&p, "---\n"); - drm_printf(&p, "module: " KBUILD_MODNAME "\n"); drm_printf(&p, "sde devcoredump\n"); @@ -1363,7 +1363,34 @@ static ssize_t sde_devcoredump_read(char *buffer, loff_t offset, _sde_dump_array(false, "devcoredump", sde_dbg_base.dump_secure, sde_dbg_base.dump_blk_mask); - return count - iter.remain; + return size - iter.remain; +} + +static ssize_t sde_devcoredump_read(char *buffer, loff_t offset, + size_t count, void *data, size_t datalen) +{ + static u32 read_size; + + if (!sde_dbg_base.read_buf) { + sde_dbg_base.read_buf = kvzalloc(MAX_BUFF_SIZE, GFP_KERNEL); + if (!sde_dbg_base.read_buf) + return -ENOMEM; + sde_dbg_base.is_dumped = false; + } + + if (!sde_dbg_base.is_dumped) { + read_size = sde_devcoredump_drm_read(sde_dbg_base.read_buf, MAX_BUFF_SIZE); + sde_dbg_base.is_dumped = true; + } + + if (read_size > offset) { + memcpy(buffer, sde_dbg_base.read_buf + offset, + min(count, (size_t)(read_size - offset))); + } else { + return 0; + } + + return min(count, (size_t)(read_size - offset)); } static void sde_devcoredump_free(void *data) @@ -1373,6 +1400,11 @@ static void sde_devcoredump_free(void *data) sde_dbg_base.evtlog->dumped_evtlog = NULL; } + if (sde_dbg_base.read_buf) { + kvfree(sde_dbg_base.read_buf); + sde_dbg_base.read_buf = NULL; + } + sde_dbg_base.coredump_reading = false; sde_dbg_base.coredump_pending = false; } diff --git a/msm/sde_dbg_evtlog.c b/msm/sde_dbg_evtlog.c index 197578f507..ecd2fc529b 100644 --- a/msm/sde_dbg_evtlog.c +++ b/msm/sde_dbg_evtlog.c @@ -217,7 +217,7 @@ u32 sde_evtlog_count(struct sde_dbg_evtlog *evtlog) last_dump += SDE_EVTLOG_ENTRY; } - if ((last_dump - first) > SDE_EVTLOG_PRINT_ENTRY) + if ((last_dump - first) > SDE_EVTLOG_ENTRY) return SDE_EVTLOG_ENTRY; return last_dump - first;