From ae94f07d6e28816bd377b91e9ca39d8fabaecb5c Mon Sep 17 00:00:00 2001 From: Samantha Tran Date: Fri, 2 Jul 2021 09:48:43 -0700 Subject: [PATCH] disp: msm: avoid using spinlock while adding evtlog entry Add support to use atomic variable instead of spinlog for event log while adding enries. This change will help optimize event log writing time. Change-Id: I83661b85cd76ca738729ac51aa5afd97d162508d Signed-off-by: Samantha Tran --- msm/sde_dbg.c | 2 +- msm/sde_dbg.h | 2 +- msm/sde_dbg_evtlog.c | 19 ++++++------------- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/msm/sde_dbg.c b/msm/sde_dbg.c index 712cefd63b..a7717f3e15 100755 --- a/msm/sde_dbg.c +++ b/msm/sde_dbg.c @@ -1154,7 +1154,7 @@ static int sde_dbg_debugfs_open(struct inode *inode, struct file *file) file->private_data = inode->i_private; mutex_lock(&sde_dbg_base.mutex); sde_dbg_base.cur_evt_index = 0; - sde_dbg_base.evtlog->first = sde_dbg_base.evtlog->curr + 1; + sde_dbg_base.evtlog->first = (u32)atomic_add_return(0, &sde_dbg_base.evtlog->curr) + 1; sde_dbg_base.evtlog->last = sde_dbg_base.evtlog->first + SDE_EVTLOG_ENTRY; mutex_unlock(&sde_dbg_base.mutex); diff --git a/msm/sde_dbg.h b/msm/sde_dbg.h index 03c02f20a9..95598e094e 100644 --- a/msm/sde_dbg.h +++ b/msm/sde_dbg.h @@ -153,7 +153,7 @@ struct sde_dbg_evtlog { u32 first; u32 last; u32 last_dump; - u32 curr; + atomic_t curr; u32 next; u32 enable; u32 dump_mode; diff --git a/msm/sde_dbg_evtlog.c b/msm/sde_dbg_evtlog.c index 1b18d4a49b..c6d3746d6a 100644 --- a/msm/sde_dbg_evtlog.c +++ b/msm/sde_dbg_evtlog.c @@ -58,23 +58,18 @@ bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog, u32 flag) void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line, int flag, ...) { - unsigned long flags; int i, val = 0; va_list args; struct sde_dbg_evtlog_log *log; + u32 index; - if (!evtlog) + if (!evtlog || !sde_evtlog_is_enabled(evtlog, flag) || + _sde_evtlog_is_filtered_no_lock(evtlog, name)) return; - if (!sde_evtlog_is_enabled(evtlog, flag)) - return; + index = abs(atomic_inc_return(&evtlog->curr) % SDE_EVTLOG_ENTRY); - spin_lock_irqsave(&evtlog->spin_lock, flags); - - if (_sde_evtlog_is_filtered_no_lock(evtlog, name)) - goto exit; - - log = &evtlog->logs[evtlog->curr]; + log = &evtlog->logs[index]; log->time = local_clock(); log->name = name; log->line = line; @@ -93,12 +88,9 @@ void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line, } va_end(args); log->data_cnt = i; - evtlog->curr = (evtlog->curr + 1) % SDE_EVTLOG_ENTRY; evtlog->last++; trace_sde_evtlog(name, line, log->data_cnt, log->data); -exit: - spin_unlock_irqrestore(&evtlog->spin_lock, flags); } void sde_reglog_log(u8 blk_id, u32 val, u32 addr) @@ -224,6 +216,7 @@ struct sde_dbg_evtlog *sde_evtlog_init(void) return ERR_PTR(-ENOMEM); spin_lock_init(&evtlog->spin_lock); + atomic_set(&evtlog->curr, 0); evtlog->enable = SDE_EVTLOG_DEFAULT_ENABLE; evtlog->dump_mode = SDE_DBG_DEFAULT_DUMP_MODE;