[patch 2/2] cyclictest: init tracer only once

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The tracer setup happens in every thread, which is nonsense. First of
all it leads to a lot of irritating warnings because the things are
setup multiple times. The worst effect is that one tasks runs already
into the tracer stop condition and the next one reenables the tracer.

Move the tracer setup into the main thread and do it only once.

Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
---
 src/cyclictest/cyclictest.c |  198 ++++++++++++++++++++++----------------------
 1 file changed, 103 insertions(+), 95 deletions(-)

Index: rt-tests/src/cyclictest/cyclictest.c
===================================================================
--- rt-tests.orig/src/cyclictest/cyclictest.c
+++ rt-tests/src/cyclictest/cyclictest.c
@@ -340,6 +340,105 @@ static int settracer(char *tracer)
 	return ret;
 }
 
+static void setup_tracer(void)
+{
+	if (!tracelimit)
+		return;
+
+	if (kernelversion == KV_26_CURR) {
+		char testname[MAX_PATH];
+
+		set_debugfileprefix();
+		fileprefix = debugfileprefix;
+
+		strcpy(testname, debugfileprefix);
+		strcat(testname, "tracing_enabled");
+		if (access(testname, R_OK)) {
+			fprintf(stderr, "ERROR: %s not found\n"
+			    "debug fs not mounted, "
+			    "TRACERs not configured?\n", testname);
+		}
+	} else
+		fileprefix = procfileprefix;
+
+	if (kernelversion == KV_26_CURR) {
+		char buffer[32];
+		int ret;
+
+		sprintf(buffer, "%d", tracelimit);
+		setkernvar("tracing_thresh", buffer);
+
+		/* ftrace_enabled is a sysctl variable */
+		fileprefix = procfileprefix;
+		if (ftrace)
+			setkernvar("ftrace_enabled", "1");
+		else
+			setkernvar("ftrace_enabled", "0");
+		fileprefix = debugfileprefix;
+
+		switch (tracetype) {
+		case NOTRACE:
+			if (ftrace)
+				ret = settracer(functiontracer);
+			else
+				ret = 0;
+			break;
+		case IRQSOFF:
+			ret = settracer("irqsoff");
+			break;
+		case PREEMPTOFF:
+			ret = settracer("preemptoff");
+			break;
+		case IRQPREEMPTOFF:
+			ret = settracer("preemptirqsoff");
+			break;
+		case EVENTS:
+			ret = settracer("events");
+			if (ftrace)
+				ret = settracer(functiontracer);
+			break;
+		case CTXTSWITCH:
+			ret = settracer("sched_switch");
+			break;
+		default:
+			printf("cyclictest: unknown tracer!\n");
+			ret = 0;
+			break;
+		}
+
+		if (ret)
+			fprintf(stderr, "Requested tracer not available\n");
+
+		setkernvar(traceroptions, "print-parent");
+		if (verbose) {
+			setkernvar(traceroptions, "sym-offset");
+			setkernvar(traceroptions, "sym-addr");
+			setkernvar(traceroptions, "verbose");
+		} else {
+			setkernvar(traceroptions, "nosym-offset");
+			setkernvar(traceroptions, "nosym-addr");
+			setkernvar(traceroptions, "noverbose");
+		}
+		setkernvar("tracing_max_latency", "0");
+		setkernvar("latency_hist/wakeup_latency/reset", "1");
+	} else {
+		setkernvar("trace_all_cpus", "1");
+		setkernvar("trace_freerunning", "1");
+		setkernvar("trace_print_on_crash", "0");
+		setkernvar("trace_user_triggered", "1");
+		setkernvar("trace_user_trigger_irq", "-1");
+		setkernvar("trace_verbose", "0");
+		setkernvar("preempt_thresh", "0");
+		setkernvar("wakeup_timing", "0");
+		setkernvar("preempt_max_latency", "0");
+		if (ftrace)
+			setkernvar("mcount_enabled", "1");
+		setkernvar("trace_enabled", "1");
+	}
+
+	tracing(1);
+}
+
 /*
  * parse an input value as a base10 value followed by an optional
  * suffix. The input value is presumed to be in seconds, unless
@@ -414,83 +513,6 @@ void *timerthread(void *param)
 	interval.tv_sec = par->interval / USEC_PER_SEC;
 	interval.tv_nsec = (par->interval % USEC_PER_SEC) * 1000;
 
-	if (tracelimit) {
-		if (kernelversion == KV_26_CURR) {
-			char buffer[32];
-			int ret;
-
-			sprintf(buffer, "%d", tracelimit);
-			setkernvar("tracing_thresh", buffer);
-
-			/* ftrace_enabled is a sysctl variable */
-			fileprefix = procfileprefix;
-			if (ftrace)
-				setkernvar("ftrace_enabled", "1");
-			else
-				setkernvar("ftrace_enabled", "0");
-			fileprefix = debugfileprefix;
-
-			switch (tracetype) {
-			case NOTRACE:
-				if (ftrace)
-					ret = settracer(functiontracer);
-				else
-					ret = 0;
-				break;
-			case IRQSOFF:
-				ret = settracer("irqsoff");
-				break;
-			case PREEMPTOFF:
-				ret = settracer("preemptoff");
-				break;
-			case IRQPREEMPTOFF:
-				ret = settracer("preemptirqsoff");
-				break;
-			case EVENTS:
-				ret = settracer("events");
-				if (ftrace)
-					ret = settracer(functiontracer);
-				break;
-			case CTXTSWITCH:
-				ret = settracer("sched_switch");
-				break;
-			default:
-				printf("cyclictest: unknown tracer!\n");
-				ret = 0;
-				break;
-			}
-
-			if (ret)
-				fprintf(stderr, "Requested tracer not available\n");
-
-			setkernvar(traceroptions, "print-parent");
-			if (verbose) {
-				setkernvar(traceroptions, "sym-offset");
-				setkernvar(traceroptions, "sym-addr");
-				setkernvar(traceroptions, "verbose");
-			} else {
-				setkernvar(traceroptions, "nosym-offset");
-				setkernvar(traceroptions, "nosym-addr");
-				setkernvar(traceroptions, "noverbose");
-			}
-			setkernvar("tracing_max_latency", "0");
-			setkernvar("latency_hist/wakeup_latency/reset", "1");
-		} else {
-			setkernvar("trace_all_cpus", "1");
-			setkernvar("trace_freerunning", "1");
-			setkernvar("trace_print_on_crash", "0");
-			setkernvar("trace_user_triggered", "1");
-			setkernvar("trace_user_trigger_irq", "-1");
-			setkernvar("trace_verbose", "0");
-			setkernvar("preempt_thresh", "0");
-			setkernvar("wakeup_timing", "0");
-			setkernvar("preempt_max_latency", "0");
-			if (ftrace)
-				setkernvar("mcount_enabled", "1");
-			setkernvar("trace_enabled", "1");
-		}
-	}
-
 	stat->tid = gettid();
 
 	sigemptyset(&sigset);
@@ -540,9 +562,6 @@ void *timerthread(void *param)
 
 	stat->threadstarted++;
 
-	if (tracelimit)
-		tracing(1);
-
 	while (!shutdown) {
 
 		long diff;
@@ -987,21 +1006,7 @@ int main(int argc, char **argv)
 	if (kernelversion == KV_NOT_26)
 		fprintf(stderr, "WARNING: Most functions require kernel 2.6\n");
 
-	if (tracelimit && kernelversion == KV_26_CURR) {
-		char testname[MAX_PATH];
-
-		set_debugfileprefix();
-		fileprefix = debugfileprefix;
-
-		strcpy(testname, debugfileprefix);
-		strcat(testname, "tracing_enabled");
-		if (access(testname, R_OK)) {
-			fprintf(stderr, "ERROR: %s not found\n"
-			    "debug fs not mounted, "
-			    "TRACERs not configured?\n", testname);
-		}
-	} else if (tracelimit)
-		fileprefix = procfileprefix;
+	setup_tracer();
 
 	if (check_timer())
 		fprintf(stderr, "WARNING: High resolution timers not available\n");
@@ -1116,6 +1121,9 @@ int main(int argc, char **argv)
  outpar:
 	free(par);
  out:
+	/* ensure that the tracer is stopped */
+	if (tracelimit)
+		tracing(0);
 
 	/* unlock everything */
 	if (lockall)


--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux