lkml.org 
[lkml]   [2008]   [Oct]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH v2] ftrace: Add a C-state tracer to help power optimization

My comments are more towards Ingo than to Arjan.

On Sat, 4 Oct 2008, Arjan van de Ven wrote:
> +++ b/kernel/trace/Kconfig
> @@ -134,6 +134,17 @@ config BOOT_TRACER
> be enabled if this tracer is selected since only one tracer
> should touch the tracing buffer at a time.
>
> +config CSTATE_TRACER
> + bool "Trace C-state behavior"
> + depends on HAVE_FTRACE

Ingo, here's the confusion again between the FTRACE infrastructure and
the ftrace "function tracer". the HAVE_FTRACE should really be
HAVE_FUNCTION_TRACER. The infrastructure of a lot of the ftrace tracers
do not depend on the function tracer.

The CSTATE_TRACER also does not depend on HAVE_FTRACE. Think we should
rename this? Otherwise more kernel developers will get confused by it. :-(

> + depends on DEBUG_KERNEL
> + depends on X86
> + select TRACING
> + help
> + This tracer helps developers to analyize and optimize the kernels
> + power management decisions, specifically the C-state behavior.
> +
> +
> config STACK_TRACER
> bool "Trace max stack"
> depends on HAVE_FTRACE
> diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile
> index a85dfba..2b85724 100644
> --- a/kernel/trace/Makefile
> +++ b/kernel/trace/Makefile
> @@ -24,5 +24,6 @@ obj-$(CONFIG_NOP_TRACER) += trace_nop.o
> obj-$(CONFIG_STACK_TRACER) += trace_stack.o
> obj-$(CONFIG_MMIOTRACE) += trace_mmiotrace.o
> obj-$(CONFIG_BOOT_TRACER) += trace_boot.o
> +obj-$(CONFIG_CSTATE_TRACER) += trace_cstate.o
>
> libftrace-y := ftrace.o
> diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
> index a921ba5..1ef1ded 100644
> --- a/kernel/trace/trace.h
> +++ b/kernel/trace/trace.h
> @@ -117,6 +117,11 @@ struct trace_boot {
> struct boot_trace initcall;
> };
>
> +struct trace_cstate {
> + struct trace_entry ent;
> + struct cstate_trace state_data;
> +};
> +
> /*
> * trace_flag_type is an enumeration that holds different
> * states when a trace occurs. These are:
> diff --git a/kernel/trace/trace_cstate.c b/kernel/trace/trace_cstate.c
> new file mode 100644
> index 0000000..272c577
> --- /dev/null
> +++ b/kernel/trace/trace_cstate.c
> @@ -0,0 +1,131 @@
> +/*
> + * ring buffer based C-state tracer
> + *
> + * Arjan van de Ven <arjan@linux.intel.com>
> + * Copyright (C) 2009 Intel Corporation
> + *
> + * Much is borrowed from trace_boot.c which is
> + * Copyright (C) 2008 Frederic Weisbecker <fweisbec@gmail.com>
> + *
> + */
> +
> +#include <linux/init.h>
> +#include <linux/debugfs.h>
> +#include <linux/ftrace.h>
> +#include <linux/kallsyms.h>
> +
> +#include "trace.h"
> +
> +static struct trace_array *cstate_trace;
> +static int trace_cstate_enabled;
> +
> +
> +static void start_cstate_trace(void)
> +{
> + trace_cstate_enabled = 1;
> +}
> +
> +static void stop_cstate_trace(struct trace_array *tr)
> +{
> + trace_cstate_enabled = 0;
> +}
> +
> +static void cstate_trace_init(struct trace_array *tr)
> +{
> + int cpu;
> + cstate_trace = tr;
> +
> + trace_cstate_enabled = 1;
> +
> + for_each_cpu_mask(cpu, cpu_possible_map)
> + tracing_reset(tr, cpu);
> +}
> +
> +static void cstate_trace_ctrl_update(struct trace_array *tr)
> +{
> + if (tr->ctrl)
> + start_cstate_trace();
> + else
> + stop_cstate_trace(tr);
> +}
> +
> +static enum print_line_t cstate_print_line(struct trace_iterator *iter)
> +{
> + int ret;
> + struct trace_entry *entry = iter->ent;
> + struct trace_cstate *field = (struct trace_cstate *)entry;

Ingo, isn't the trace_assign_type in your latest tree?

-- Steve

> + struct cstate_trace *it = &field->state_data;
> + struct trace_seq *s = &iter->seq;
> + struct timespec stamp = ktime_to_timespec(it->stamp);
> + struct timespec duration = ktime_to_timespec(
> + ktime_sub(it->end, it->stamp));
> +
> + if (entry->type == TRACE_BOOT) {
> + ret = trace_seq_printf(s, "[%5ld.%09ld] Going to C%i on cpu %i for %ld.%09ld\n",
> + stamp.tv_sec,
> + stamp.tv_nsec,
> + it->state, iter->cpu,
> + duration.tv_sec,
> + duration.tv_nsec);
> + if (!ret)
> + return TRACE_TYPE_PARTIAL_LINE;
> + return TRACE_TYPE_HANDLED;
> + }
> + return TRACE_TYPE_UNHANDLED;
> +}
> +


\
 
 \ /
  Last update: 2008-10-04 20:21    [W:0.060 / U:0.056 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site