Эх сурвалжийг харах

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 <[email protected]>
Samantha Tran 4 жил өмнө
parent
commit
ae94f07d6e

+ 1 - 1
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;
 	file->private_data = inode->i_private;
 	mutex_lock(&sde_dbg_base.mutex);
 	mutex_lock(&sde_dbg_base.mutex);
 	sde_dbg_base.cur_evt_index = 0;
 	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->last =
 		sde_dbg_base.evtlog->first + SDE_EVTLOG_ENTRY;
 		sde_dbg_base.evtlog->first + SDE_EVTLOG_ENTRY;
 	mutex_unlock(&sde_dbg_base.mutex);
 	mutex_unlock(&sde_dbg_base.mutex);

+ 1 - 1
msm/sde_dbg.h

@@ -153,7 +153,7 @@ struct sde_dbg_evtlog {
 	u32 first;
 	u32 first;
 	u32 last;
 	u32 last;
 	u32 last_dump;
 	u32 last_dump;
-	u32 curr;
+	atomic_t curr;
 	u32 next;
 	u32 next;
 	u32 enable;
 	u32 enable;
 	u32 dump_mode;
 	u32 dump_mode;

+ 6 - 13
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,
 void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line,
 		int flag, ...)
 		int flag, ...)
 {
 {
-	unsigned long flags;
 	int i, val = 0;
 	int i, val = 0;
 	va_list args;
 	va_list args;
 	struct sde_dbg_evtlog_log *log;
 	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;
 		return;
 
 
-	if (!sde_evtlog_is_enabled(evtlog, flag))
-		return;
-
-	spin_lock_irqsave(&evtlog->spin_lock, flags);
+	index = abs(atomic_inc_return(&evtlog->curr) % SDE_EVTLOG_ENTRY);
 
 
-	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->time = local_clock();
 	log->name = name;
 	log->name = name;
 	log->line = line;
 	log->line = line;
@@ -93,12 +88,9 @@ void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line,
 	}
 	}
 	va_end(args);
 	va_end(args);
 	log->data_cnt = i;
 	log->data_cnt = i;
-	evtlog->curr = (evtlog->curr + 1) % SDE_EVTLOG_ENTRY;
 	evtlog->last++;
 	evtlog->last++;
 
 
 	trace_sde_evtlog(name, line, log->data_cnt, log->data);
 	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)
 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);
 		return ERR_PTR(-ENOMEM);
 
 
 	spin_lock_init(&evtlog->spin_lock);
 	spin_lock_init(&evtlog->spin_lock);
+	atomic_set(&evtlog->curr, 0);
 	evtlog->enable = SDE_EVTLOG_DEFAULT_ENABLE;
 	evtlog->enable = SDE_EVTLOG_DEFAULT_ENABLE;
 	evtlog->dump_mode = SDE_DBG_DEFAULT_DUMP_MODE;
 	evtlog->dump_mode = SDE_DBG_DEFAULT_DUMP_MODE;