4c21adf26f
and fix the broken case if a core's frequency depends on others. trace_power_frequency was only implemented in a rather ungeneric way in acpi-cpufreq driver's target() function only. -> Move the call to trace_power_frequency to cpufreq.c:cpufreq_notify_transition() where CPUFREQ_POSTCHANGE notifier is triggered. This will support power frequency tracing by all cpufreq drivers. trace_power_frequency did not trace frequency changes correctly when the userspace governor was used or when CPU cores' frequency depend on each other. -> Moving this into the CPUFREQ_POSTCHANGE notifier and pass the cpu which gets switched automatically fixes this. Robert Schoene provided some important fixes on top of my initial quick shot version which are integrated in this patch: - Forgot some changes in power_end trace (TP_printk/variable names) - Variable dummy in power_end must now be cpu_id - Use static 64 bit variable instead of unsigned int for cpu_id [akpm@linux-foundation.org: build fix] Signed-off-by: Thomas Renninger <trenn@suse.de> Cc: davej@codemonkey.org.uk Signed-off-by: Ingo Molnar <mingo@elte.hu> Cc: Dave Jones <davej@codemonkey.org.uk> Acked-by: Arjan van de Ven <arjan@infradead.org> Cc: Robert Schoene <robert.schoene@tu-dresden.de> Tested-by: Robert Schoene <robert.schoene@tu-dresden.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
77 lines
1.4 KiB
C
77 lines
1.4 KiB
C
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM power
|
|
|
|
#if !defined(_TRACE_POWER_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_POWER_H
|
|
|
|
#include <linux/ktime.h>
|
|
#include <linux/tracepoint.h>
|
|
|
|
#ifndef _TRACE_POWER_ENUM_
|
|
#define _TRACE_POWER_ENUM_
|
|
enum {
|
|
POWER_NONE = 0,
|
|
POWER_CSTATE = 1,
|
|
POWER_PSTATE = 2,
|
|
};
|
|
#endif
|
|
|
|
DECLARE_EVENT_CLASS(power,
|
|
|
|
TP_PROTO(unsigned int type, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(type, state, cpu_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( u64, type )
|
|
__field( u64, state )
|
|
__field( u64, cpu_id )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->type = type;
|
|
__entry->state = state;
|
|
__entry->cpu_id = cpu_id;
|
|
),
|
|
|
|
TP_printk("type=%lu state=%lu cpu_id=%lu", (unsigned long)__entry->type,
|
|
(unsigned long)__entry->state, (unsigned long)__entry->cpu_id)
|
|
);
|
|
|
|
DEFINE_EVENT(power, power_start,
|
|
|
|
TP_PROTO(unsigned int type, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(type, state, cpu_id)
|
|
);
|
|
|
|
DEFINE_EVENT(power, power_frequency,
|
|
|
|
TP_PROTO(unsigned int type, unsigned int state, unsigned int cpu_id),
|
|
|
|
TP_ARGS(type, state, cpu_id)
|
|
);
|
|
|
|
TRACE_EVENT(power_end,
|
|
|
|
TP_PROTO(unsigned int cpu_id),
|
|
|
|
TP_ARGS(cpu_id),
|
|
|
|
TP_STRUCT__entry(
|
|
__field( u64, cpu_id )
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->cpu_id = cpu_id;
|
|
),
|
|
|
|
TP_printk("cpu_id=%lu", (unsigned long)__entry->cpu_id)
|
|
|
|
);
|
|
|
|
#endif /* _TRACE_POWER_H */
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|