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

Commit b807c3d0 authored by Steven Rostedt's avatar Steven Rostedt Committed by Ingo Molnar
Browse files

ftrace: nmi update statistics



Impact: add more debug info to /debugfs/tracing/dyn_ftrace_total_info

This patch adds dynamic ftrace NMI update statistics to the
/debugfs/tracing/dyn_ftrace_total_info stat file.

Signed-off-by: default avatarSteven Rostedt <srostedt@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 17666f02
Loading
Loading
Loading
Loading
+24 −2
Original line number Diff line number Diff line
@@ -91,6 +91,19 @@ static int mod_code_write;
static void *mod_code_ip;
static void *mod_code_newcode;

static int nmi_wait_count;
static atomic_t nmi_update_count;

int ftrace_arch_read_dyn_info(char *buf, int size)
{
	int r;

	r = snprintf(buf, size, "%u %u",
		     nmi_wait_count,
		     atomic_read(&nmi_update_count));
	return r;
}

static void ftrace_mod_code(void)
{
	/*
@@ -109,8 +122,10 @@ void ftrace_nmi_enter(void)
	atomic_inc(&in_nmi);
	/* Must have in_nmi seen before reading write flag */
	smp_mb();
	if (mod_code_write)
	if (mod_code_write) {
		ftrace_mod_code();
		atomic_inc(&nmi_update_count);
	}
}

void ftrace_nmi_exit(void)
@@ -122,10 +137,17 @@ void ftrace_nmi_exit(void)

static void wait_for_nmi(void)
{
	while (atomic_read(&in_nmi))
	int waited = 0;

	while (atomic_read(&in_nmi)) {
		waited = 1;
		cpu_relax();
	}

	if (waited)
		nmi_wait_count++;
}

static int
do_ftrace_mod_code(unsigned long ip, void *new_code)
{
+24 −7
Original line number Diff line number Diff line
@@ -2815,22 +2815,39 @@ static struct file_operations tracing_mark_fops = {

#ifdef CONFIG_DYNAMIC_FTRACE

#define DYN_INFO_BUF_SIZE 1023
static char ftrace_dyn_info_buffer[DYN_INFO_BUF_SIZE+1];
static DEFINE_MUTEX(dyn_info_mutex);

int __weak ftrace_arch_read_dyn_info(char *buf, int size)
{
	return 0;
}

static ssize_t
tracing_read_long(struct file *filp, char __user *ubuf,
tracing_read_dyn_info(struct file *filp, char __user *ubuf,
		  size_t cnt, loff_t *ppos)
{
	unsigned long *p = filp->private_data;
	char buf[64];
	char *buf = ftrace_dyn_info_buffer;
	int r;

	r = sprintf(buf, "%ld\n", *p);
	mutex_lock(&dyn_info_mutex);
	r = sprintf(buf, "%ld ", *p);

	return simple_read_from_buffer(ubuf, cnt, ppos, buf, r);
	r += ftrace_arch_read_dyn_info(buf+r, DYN_INFO_BUF_SIZE-r);
	buf[r++] = '\n';

	r = simple_read_from_buffer(ubuf, cnt, ppos, buf, r);

	mutex_unlock(&dyn_info_mutex);

	return r;
}

static struct file_operations tracing_read_long_fops = {
static struct file_operations tracing_dyn_info_fops = {
	.open		= tracing_open_generic,
	.read		= tracing_read_long,
	.read		= tracing_read_dyn_info,
};
#endif

@@ -2939,7 +2956,7 @@ static __init int tracer_init_debugfs(void)
#ifdef CONFIG_DYNAMIC_FTRACE
	entry = debugfs_create_file("dyn_ftrace_total_info", 0444, d_tracer,
				    &ftrace_update_tot_cnt,
				    &tracing_read_long_fops);
				    &tracing_dyn_info_fops);
	if (!entry)
		pr_warning("Could not create debugfs "
			   "'dyn_ftrace_total_info' entry\n");