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 <quic_bingchua@quicinc.com>
This commit is contained in:
Bruce Hoo
2022-03-08 12:54:16 +08:00
parent 231eb36b84
commit 522b0cee4c
2 changed files with 41 additions and 9 deletions

View File

@@ -304,6 +304,8 @@ struct sde_dbg_base {
u32 cur_reglog_index; u32 cur_reglog_index;
enum sde_dbg_dump_context dump_mode; enum sde_dbg_dump_context dump_mode;
bool hw_ownership; bool hw_ownership;
char *read_buf;
bool is_dumped;
} sde_dbg_base; } sde_dbg_base;
static LIST_HEAD(sde_dbg_dsi_list); 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 #ifdef CONFIG_DEV_COREDUMP
static ssize_t sde_devcoredump_read(char *buffer, loff_t offset, #define MAX_BUFF_SIZE ((3072 - 256) * 1024)
size_t count, void *data, size_t datalen)
static ssize_t sde_devcoredump_drm_read(char *buffer, size_t size)
{ {
struct drm_print_iterator iter; struct drm_print_iterator iter;
struct drm_printer p; struct drm_printer p;
iter.data = buffer; iter.data = buffer;
iter.offset = 0; iter.start = 0;
iter.start = offset; iter.remain = size;
iter.remain = count;
p = drm_coredump_printer(&iter); p = drm_coredump_printer(&iter);
drm_printf(&p, "---\n"); drm_printf(&p, "---\n");
drm_printf(&p, "module: " KBUILD_MODNAME "\n"); drm_printf(&p, "module: " KBUILD_MODNAME "\n");
drm_printf(&p, "sde devcoredump\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_dump_array(false, "devcoredump", sde_dbg_base.dump_secure,
sde_dbg_base.dump_blk_mask); 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) 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; 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_reading = false;
sde_dbg_base.coredump_pending = false; sde_dbg_base.coredump_pending = false;
} }

View File

@@ -217,7 +217,7 @@ u32 sde_evtlog_count(struct sde_dbg_evtlog *evtlog)
last_dump += SDE_EVTLOG_ENTRY; 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 SDE_EVTLOG_ENTRY;
return last_dump - first; return last_dump - first;