Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87d93e0a authored by Clarence Ip's avatar Clarence Ip
Browse files

drm/msm: limit sde_dbg_dump output to current entries



Update the sde_dbg_dump function to only dump event log
entries up to the time the dump is initiated, and increase
the number of recorded event log entries.

This places a limit on the total number of entries that are
output to the dmesg log even if more entries would have been
added while the dump is executing (e.g., interrupt events),
while still allowing the extra events to be recorded properly.

Change-Id: I66f850d21a2d0217f9049facffce074831b7e17d
Signed-off-by: default avatarClarence Ip <cip@codeaurora.org>
parent 6bf4cf1b
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -2558,6 +2558,7 @@ static void _sde_dump_array(struct sde_dbg_reg_base *blk_arr[],

	mutex_lock(&sde_dbg_base.mutex);

	if (dump_all)
		sde_evtlog_dump_all(sde_dbg_base.evtlog);

	if (dump_all || !blk_arr || !len) {
@@ -2711,7 +2712,7 @@ static ssize_t sde_evtlog_dump_read(struct file *file, char __user *buff,
		return -EINVAL;

	len = sde_evtlog_dump_to_buffer(sde_dbg_base.evtlog, evtlog_buf,
			SDE_EVTLOG_BUF_MAX);
			SDE_EVTLOG_BUF_MAX, true);
	if (copy_to_user(buff, evtlog_buf, len))
		return -EFAULT;
	*ppos += len;
+10 −4
Original line number Diff line number Diff line
@@ -17,7 +17,8 @@
#include <linux/debugfs.h>
#include <linux/list.h>

#define SDE_EVTLOG_DATA_LIMITER	(-1)
/* select an uncommon hex value for the limiter */
#define SDE_EVTLOG_DATA_LIMITER	(0xC0DEBEEF)
#define SDE_EVTLOG_FUNC_ENTRY	0x1111
#define SDE_EVTLOG_FUNC_EXIT	0x2222
#define SDE_EVTLOG_FUNC_CASE1	0x3333
@@ -66,7 +67,7 @@ enum sde_dbg_dump_flag {
 * number must be greater than print entry to prevent out of bound evtlog
 * entry array access.
 */
#define SDE_EVTLOG_ENTRY	(SDE_EVTLOG_PRINT_ENTRY * 4)
#define SDE_EVTLOG_ENTRY	(SDE_EVTLOG_PRINT_ENTRY * 8)
#define SDE_EVTLOG_MAX_DATA 15
#define SDE_EVTLOG_BUF_MAX 512
#define SDE_EVTLOG_BUF_ALIGN 32
@@ -87,12 +88,14 @@ struct sde_dbg_evtlog_log {
};

/**
 * @last_dump: Index of last entry to be output during evtlog dumps
 * @filter_list: Linked list of currently active filter strings
 */
struct sde_dbg_evtlog {
	struct sde_dbg_evtlog_log logs[SDE_EVTLOG_ENTRY];
	u32 first;
	u32 last;
	u32 last_dump;
	u32 curr;
	u32 next;
	u32 enable;
@@ -197,10 +200,12 @@ bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog, u32 flag);
 * @evtlog:		pointer to evtlog
 * @evtlog_buf:		target buffer to print into
 * @evtlog_buf_size:	size of target buffer
 * @update_last_entry:	whether or not to stop at most recent entry
 * Returns:		number of bytes written to buffer
 */
ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
		char *evtlog_buf, ssize_t evtlog_buf_size);
		char *evtlog_buf, ssize_t evtlog_buf_size,
		bool update_last_entry);

/**
 * sde_dbg_init_dbg_buses - initialize debug bus dumping support for the chipset
@@ -352,7 +357,8 @@ static inline bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog,
}

static inline ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
		char *evtlog_buf, ssize_t evtlog_buf_size)
		char *evtlog_buf, ssize_t evtlog_buf_size,
		bool update_last_entry)
{
	return 0;
}
+22 −12
Original line number Diff line number Diff line
@@ -105,27 +105,32 @@ void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line,
}

/* always dump the last entries which are not dumped yet */
static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog)
static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog,
		bool update_last_entry)
{
	if (!evtlog)
		return false;

	evtlog->first = evtlog->next;

	if (evtlog->last == evtlog->first)
	if (update_last_entry)
		evtlog->last_dump = evtlog->last;

	if (evtlog->last_dump == evtlog->first)
		return false;

	if (evtlog->last < evtlog->first) {
	if (evtlog->last_dump < evtlog->first) {
		evtlog->first %= SDE_EVTLOG_ENTRY;
		if (evtlog->last < evtlog->first)
			evtlog->last += SDE_EVTLOG_ENTRY;
		if (evtlog->last_dump < evtlog->first)
			evtlog->last_dump += SDE_EVTLOG_ENTRY;
	}

	if ((evtlog->last - evtlog->first) > SDE_EVTLOG_PRINT_ENTRY) {
	if ((evtlog->last_dump - evtlog->first) > SDE_EVTLOG_PRINT_ENTRY) {
		pr_info("evtlog skipping %d entries, last=%d\n",
			evtlog->last - evtlog->first - SDE_EVTLOG_PRINT_ENTRY,
			evtlog->last - 1);
		evtlog->first = evtlog->last - SDE_EVTLOG_PRINT_ENTRY;
			evtlog->last_dump - evtlog->first -
			SDE_EVTLOG_PRINT_ENTRY,
			evtlog->last_dump - 1);
		evtlog->first = evtlog->last_dump - SDE_EVTLOG_PRINT_ENTRY;
	}
	evtlog->next = evtlog->first + 1;

@@ -133,7 +138,8 @@ static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog)
}

ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
		char *evtlog_buf, ssize_t evtlog_buf_size)
		char *evtlog_buf, ssize_t evtlog_buf_size,
		bool update_last_entry)
{
	int i;
	ssize_t off = 0;
@@ -146,7 +152,7 @@ ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
	spin_lock_irqsave(&evtlog->spin_lock, flags);

	/* update markers, exit if nothing to print */
	if (!_sde_evtlog_dump_calc_range(evtlog))
	if (!_sde_evtlog_dump_calc_range(evtlog, update_last_entry))
		goto exit;

	log = &evtlog->logs[evtlog->first % SDE_EVTLOG_ENTRY];
@@ -179,12 +185,16 @@ ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
void sde_evtlog_dump_all(struct sde_dbg_evtlog *evtlog)
{
	char buf[SDE_EVTLOG_BUF_MAX];
	bool update_last_entry = true;

	if (!evtlog)
		return;

	while (sde_evtlog_dump_to_buffer(evtlog, buf, sizeof(buf)))
	while (sde_evtlog_dump_to_buffer(
				evtlog, buf, sizeof(buf), update_last_entry)) {
		pr_info("%s", buf);
		update_last_entry = false;
	}
}

struct sde_dbg_evtlog *sde_evtlog_init(void)