Message ID | 1402486305-4017-4-git-send-email-punit.agrawal@arm.com (mailing list archive) |
---|---|
State | RFC, archived |
Headers | show |
On Wed, 11 Jun 2014 12:31:44 +0100 Punit Agrawal <punit.agrawal@arm.com> wrote: > Create a new event to trace when the temperature is above a trip > point. Use the trace-point when handling non-critical and critical > trip pionts. > > Cc: Zhang Rui <rui.zhang@intel.com> > Cc: Eduardo Valentin <edubezval@gmail.com> > Cc: Steven Rostedt <rostedt@goodmis.org> > Cc: Frederic Weisbecker <fweisbec@gmail.com> > Cc: Ingo Molnar <mingo@redhat.com> > Signed-off-by: Punit Agrawal <punit.agrawal@arm.com> > --- > Hi Steven, > > I am facing an issue with partial trace being emitted when using > __print_symbolic in this patch. > > When the trip_type is THERMAL_TRIP_ACTIVE (i.e., the first value in > the symbol map), the emitted trace contains the corresponding string > ("active"). But for other values of trip_type an empty string is > emitted in the trace. > > I've looked at other uses of __print_symbolic in the kernel and don't > see any difference in usage. Do you know what could be causing this or > alternately have any pointers on how to debug this behaviour? > If you can use trace-cmd to record your events then we can look at the raw data too. trace-cmd record -e thermal_zone_trip <some-command> where <some-command> would trigger your tracepoint. Then do: trace-cmd report -R You should see the raw value of trip_type. Make sure that it matches the enum values that you have listed. -- Steve > Thanks. > Punit > > drivers/thermal/fair_share.c | 7 ++++++- > drivers/thermal/step_wise.c | 5 ++++- > drivers/thermal/thermal_core.c | 2 ++ > include/trace/events/thermal.h | 30 ++++++++++++++++++++++++++++++ > 4 files changed, 42 insertions(+), 2 deletions(-) > > diff --git a/drivers/thermal/fair_share.c b/drivers/thermal/fair_share.c > index 944ba2f..2cddd68 100644 > --- a/drivers/thermal/fair_share.c > +++ b/drivers/thermal/fair_share.c > @@ -23,6 +23,7 @@ > */ > > #include <linux/thermal.h> > +#include <trace/events/thermal.h> > > #include "thermal_core.h" > > @@ -34,14 +35,18 @@ static int get_trip_level(struct thermal_zone_device *tz) > { > int count = 0; > unsigned long trip_temp; > + enum thermal_trip_type trip_type; > > if (tz->trips == 0 || !tz->ops->get_trip_temp) > return 0; > > for (count = 0; count < tz->trips; count++) { > tz->ops->get_trip_temp(tz, count, &trip_temp); > - if (tz->temperature < trip_temp) > + if (tz->temperature < trip_temp) { > + tz->ops->get_trip_type(tz, count, &trip_type); > + trace_thermal_zone_trip(tz, count, trip_type); > break; > + } > } > return count; > } > diff --git a/drivers/thermal/step_wise.c b/drivers/thermal/step_wise.c > index f251521..3b54c2c 100644 > --- a/drivers/thermal/step_wise.c > +++ b/drivers/thermal/step_wise.c > @@ -23,6 +23,7 @@ > */ > > #include <linux/thermal.h> > +#include <trace/events/thermal.h> > > #include "thermal_core.h" > > @@ -129,8 +130,10 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip) > > trend = get_tz_trend(tz, trip); > > - if (tz->temperature >= trip_temp) > + if (tz->temperature >= trip_temp) { > throttle = true; > + trace_thermal_zone_trip(tz, trip, trip_type); > + } > > dev_dbg(&tz->device, "Trip%d[type=%d,temp=%ld]:trend=%d,throttle=%d\n", > trip, trip_type, trip_temp, trend, throttle); > diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c > index c74c78d..454884a 100644 > --- a/drivers/thermal/thermal_core.c > +++ b/drivers/thermal/thermal_core.c > @@ -371,6 +371,8 @@ static void handle_critical_trips(struct thermal_zone_device *tz, > if (tz->temperature < trip_temp) > return; > > + trace_thermal_zone_trip(tz, trip, trip_type); > + > if (tz->ops->notify) > tz->ops->notify(tz, trip, trip_type); > > diff --git a/include/trace/events/thermal.h b/include/trace/events/thermal.h > index 894a79e..5eeb1e7 100644 > --- a/include/trace/events/thermal.h > +++ b/include/trace/events/thermal.h > @@ -51,6 +51,36 @@ TRACE_EVENT(cdev_update, > TP_printk("type=%s target=%lu", __get_str(type), __entry->target) > ); > > +TRACE_EVENT(, > + > + TP_PROTO(struct thermal_zone_device *tz, int trip, > + enum thermal_trip_type trip_type), > + > + TP_ARGS(tz, trip, trip_type), > + > + TP_STRUCT__entry( > + __string(thermal_zone, tz->type) > + __field(int, id) > + __field(int, trip) > + __field(enum thermal_trip_type, trip_type) > + ), > + > + TP_fast_assign( > + __assign_str(thermal_zone, tz->type); > + __entry->id = tz->id; > + __entry->trip = trip; > + __entry->trip_type = trip_type; > + ), > + > + TP_printk("thermal_zone=%s id=%d trip=%d trip_type=%s", > + __get_str(thermal_zone), __entry->id, __entry->trip, > + __print_symbolic(__entry->trip_type, > + { THERMAL_TRIP_ACTIVE, "active" }, > + { THERMAL_TRIP_PASSIVE, "passive" }, > + { THERMAL_TRIP_HOT, "hot" }, > + { THERMAL_TRIP_CRITICAL, "critical" })) > +); > + > #endif /* _TRACE_THERMAL_H */ > > /* This part must be outside protection */ -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Thanks for the quick response. Steven Rostedt <rostedt@goodmis.org> writes: > On Wed, 11 Jun 2014 12:31:44 +0100 > Punit Agrawal <punit.agrawal@arm.com> wrote: > >> Create a new event to trace when the temperature is above a trip >> point. Use the trace-point when handling non-critical and critical >> trip pionts. >> >> Cc: Zhang Rui <rui.zhang@intel.com> >> Cc: Eduardo Valentin <edubezval@gmail.com> >> Cc: Steven Rostedt <rostedt@goodmis.org> >> Cc: Frederic Weisbecker <fweisbec@gmail.com> >> Cc: Ingo Molnar <mingo@redhat.com> >> Signed-off-by: Punit Agrawal <punit.agrawal@arm.com> >> --- >> Hi Steven, >> >> I am facing an issue with partial trace being emitted when using >> __print_symbolic in this patch. >> >> When the trip_type is THERMAL_TRIP_ACTIVE (i.e., the first value in >> the symbol map), the emitted trace contains the corresponding string >> ("active"). But for other values of trip_type an empty string is >> emitted in the trace. >> >> I've looked at other uses of __print_symbolic in the kernel and don't >> see any difference in usage. Do you know what could be causing this or >> alternately have any pointers on how to debug this behaviour? >> > > If you can use trace-cmd to record your events then we can look at the > raw data too. > > trace-cmd record -e thermal_zone_trip <some-command> > > where <some-command> would trigger your tracepoint. > > Then do: trace-cmd report -R > > You should see the raw value of trip_type. > > Make sure that it matches the enum values that you have listed. > I do indeed see the value of trip_type and it matches what's being traced. ~# trace-cmd report | grep thermal_zone_trip | tail -n 5 kworker/2:2-1014 [002] 125.623213: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= kworker/2:2-1014 [002] 125.743174: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= kworker/2:2-1014 [002] 125.863196: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= kworker/2:2-1014 [002] 125.983175: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= kworker/2:2-1014 [002] 126.103173: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= ~# trace-cmd report -R | grep thermal_zone_trip | tail -n 5 kworker/2:2-1014 [002] 125.623213: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 kworker/2:2-1014 [002] 125.743174: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 kworker/2:2-1014 [002] 125.863196: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 kworker/2:2-1014 [002] 125.983175: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 kworker/2:2-1014 [002] 126.103173: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 Is there something I should be doing to enable the translation to the string representation when reporting using trace-cmd? Cheers, Punit > -- Steve > > >> Thanks. >> Punit >> >> drivers/thermal/fair_share.c | 7 ++++++- >> drivers/thermal/step_wise.c | 5 ++++- >> drivers/thermal/thermal_core.c | 2 ++ >> include/trace/events/thermal.h | 30 ++++++++++++++++++++++++++++++ >> 4 files changed, 42 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/thermal/fair_share.c b/drivers/thermal/fair_share.c >> index 944ba2f..2cddd68 100644 >> --- a/drivers/thermal/fair_share.c >> +++ b/drivers/thermal/fair_share.c >> @@ -23,6 +23,7 @@ >> */ >> >> #include <linux/thermal.h> >> +#include <trace/events/thermal.h> >> >> #include "thermal_core.h" >> >> @@ -34,14 +35,18 @@ static int get_trip_level(struct thermal_zone_device *tz) >> { >> int count = 0; >> unsigned long trip_temp; >> + enum thermal_trip_type trip_type; >> >> if (tz->trips == 0 || !tz->ops->get_trip_temp) >> return 0; >> >> for (count = 0; count < tz->trips; count++) { >> tz->ops->get_trip_temp(tz, count, &trip_temp); >> - if (tz->temperature < trip_temp) >> + if (tz->temperature < trip_temp) { >> + tz->ops->get_trip_type(tz, count, &trip_type); >> + trace_thermal_zone_trip(tz, count, trip_type); >> break; >> + } >> } >> return count; >> } >> diff --git a/drivers/thermal/step_wise.c b/drivers/thermal/step_wise.c >> index f251521..3b54c2c 100644 >> --- a/drivers/thermal/step_wise.c >> +++ b/drivers/thermal/step_wise.c >> @@ -23,6 +23,7 @@ >> */ >> >> #include <linux/thermal.h> >> +#include <trace/events/thermal.h> >> >> #include "thermal_core.h" >> >> @@ -129,8 +130,10 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip) >> >> trend = get_tz_trend(tz, trip); >> >> - if (tz->temperature >= trip_temp) >> + if (tz->temperature >= trip_temp) { >> throttle = true; >> + trace_thermal_zone_trip(tz, trip, trip_type); >> + } >> >> dev_dbg(&tz->device, "Trip%d[type=%d,temp=%ld]:trend=%d,throttle=%d\n", >> trip, trip_type, trip_temp, trend, throttle); >> diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c >> index c74c78d..454884a 100644 >> --- a/drivers/thermal/thermal_core.c >> +++ b/drivers/thermal/thermal_core.c >> @@ -371,6 +371,8 @@ static void handle_critical_trips(struct thermal_zone_device *tz, >> if (tz->temperature < trip_temp) >> return; >> >> + trace_thermal_zone_trip(tz, trip, trip_type); >> + >> if (tz->ops->notify) >> tz->ops->notify(tz, trip, trip_type); >> >> diff --git a/include/trace/events/thermal.h b/include/trace/events/thermal.h >> index 894a79e..5eeb1e7 100644 >> --- a/include/trace/events/thermal.h >> +++ b/include/trace/events/thermal.h >> @@ -51,6 +51,36 @@ TRACE_EVENT(cdev_update, >> TP_printk("type=%s target=%lu", __get_str(type), __entry->target) >> ); >> >> +TRACE_EVENT(, >> + >> + TP_PROTO(struct thermal_zone_device *tz, int trip, >> + enum thermal_trip_type trip_type), >> + >> + TP_ARGS(tz, trip, trip_type), >> + >> + TP_STRUCT__entry( >> + __string(thermal_zone, tz->type) >> + __field(int, id) >> + __field(int, trip) >> + __field(enum thermal_trip_type, trip_type) >> + ), >> + >> + TP_fast_assign( >> + __assign_str(thermal_zone, tz->type); >> + __entry->id = tz->id; >> + __entry->trip = trip; >> + __entry->trip_type = trip_type; >> + ), >> + >> + TP_printk("thermal_zone=%s id=%d trip=%d trip_type=%s", >> + __get_str(thermal_zone), __entry->id, __entry->trip, >> + __print_symbolic(__entry->trip_type, >> + { THERMAL_TRIP_ACTIVE, "active" }, >> + { THERMAL_TRIP_PASSIVE, "passive" }, >> + { THERMAL_TRIP_HOT, "hot" }, >> + { THERMAL_TRIP_CRITICAL, "critical" })) >> +); >> + >> #endif /* _TRACE_THERMAL_H */ >> >> /* This part must be outside protection */ -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, 11 Jun 2014 15:11:02 +0100 Punit Agrawal <punit.agrawal@arm.com> wrote: > I do indeed see the value of trip_type and it matches what's being > traced. > > ~# trace-cmd report | grep thermal_zone_trip | tail -n 5 > kworker/2:2-1014 [002] 125.623213: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= > kworker/2:2-1014 [002] 125.743174: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= > kworker/2:2-1014 [002] 125.863196: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= > kworker/2:2-1014 [002] 125.983175: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= > kworker/2:2-1014 [002] 126.103173: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= > ~# trace-cmd report -R | grep thermal_zone_trip | tail -n 5 > kworker/2:2-1014 [002] 125.623213: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 > kworker/2:2-1014 [002] 125.743174: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 > kworker/2:2-1014 [002] 125.863196: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 > kworker/2:2-1014 [002] 125.983175: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 > kworker/2:2-1014 [002] 126.103173: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 > > Is there something I should be doing to enable the translation to the > string representation when reporting using trace-cmd? Out of curiosity, what does the format file for it look like? /sys/kernel/debug/thermal/thermal_zone_trip/format -- Steve -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Steven Rostedt <rostedt@goodmis.org> writes: > On Wed, 11 Jun 2014 15:11:02 +0100 > Punit Agrawal <punit.agrawal@arm.com> wrote: > >> I do indeed see the value of trip_type and it matches what's being >> traced. >> >> ~# trace-cmd report | grep thermal_zone_trip | tail -n 5 >> kworker/2:2-1014 [002] 125.623213: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= >> kworker/2:2-1014 [002] 125.743174: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= >> kworker/2:2-1014 [002] 125.863196: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= >> kworker/2:2-1014 [002] 125.983175: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= >> kworker/2:2-1014 [002] 126.103173: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type= >> ~# trace-cmd report -R | grep thermal_zone_trip | tail -n 5 >> kworker/2:2-1014 [002] 125.623213: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 >> kworker/2:2-1014 [002] 125.743174: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 >> kworker/2:2-1014 [002] 125.863196: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 >> kworker/2:2-1014 [002] 125.983175: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 >> kworker/2:2-1014 [002] 126.103173: thermal_zone_trip: thermal_zone=soc_thermal id=0 trip=0 trip_type=1 >> >> Is there something I should be doing to enable the translation to the >> string representation when reporting using trace-cmd? > > Out of curiosity, what does the format file for it look like? I didn't know this was being exported. Thanks for the pointer. > > /sys/kernel/debug/thermal/thermal_zone_trip/format I don't have this file but found the following which seems to contain the format. # pwd /sys/kernel/debug/tracing/events/thermal/thermal_zone_trip # cat format name: thermal_zone_trip ID: 463 format: field:unsigned short common_type; offset:0; size:2; signed:0; field:unsigned char common_flags; offset:2; size:1; signed:0; field:unsigned char common_preempt_count; offset:3; size:1; signed:0; field:int common_pid; offset:4; size:4; signed:1; field:__data_loc char[] thermal_zone; offset:8; size:4; signed:0; field:int id; offset:12; size:4; signed:1; field:int trip; offset:16; size:4; signed:1; field:enum thermal_trip_type trip_type; offset:20; size:4; signed:0; print fmt: "thermal_zone=%s id=%d trip=%d trip_type=%s", __get_str(thermal_zone), REC->id, REC->trip, __print_symbolic(REC->trip_type, { THERMAL_TRIP_ACTIVE, "active" }, { THERMAL_TRIP_PASSIVE, "passive" }, { THERMAL_TRIP_HOT, "hot" }, { THERMAL_TRIP_CRITICAL, "critical" }) Cheers, Punit > > -- Steve -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, 11 Jun 2014 15:53:42 +0100 Punit Agrawal <punit.agrawal@arm.com> wrote: > > > > /sys/kernel/debug/thermal/thermal_zone_trip/format > > I don't have this file but found the following which seems to contain > the format. Yeah, that was typed manually, forgot "tracing". I mount the debugfs system at /debug for easier typing. I hate the /sys/kernel/debug path. Too much typing. > > # pwd /sys/kernel/debug/tracing/events/thermal/thermal_zone_trip > # cat format > name: thermal_zone_trip > ID: 463 > format: > field:unsigned short common_type; offset:0; size:2; signed:0; > field:unsigned char common_flags; offset:2; size:1; signed:0; > field:unsigned char common_preempt_count; offset:3; size:1; signed:0; > field:int common_pid; offset:4; size:4; signed:1; > > field:__data_loc char[] thermal_zone; offset:8; size:4; signed:0; > field:int id; offset:12; size:4; signed:1; > field:int trip; offset:16; size:4; signed:1; > field:enum thermal_trip_type trip_type; offset:20; size:4; signed:0; > > print fmt: "thermal_zone=%s id=%d trip=%d trip_type=%s", __get_str(thermal_zone), REC->id, REC->trip, __print_symbolic(REC->trip_type, { THERMAL_TRIP_ACTIVE, "active" }, { THERMAL_TRIP_PASSIVE, "passive" }, { THERMAL_TRIP_HOT, "hot" }, { THERMAL_TRIP_CRITICAL, "critical" }) > For it to work with trace-cmd (and perf) you'll need to add a plugin to define what those enums are. This is the file that trace-cmd uses to foramat. But it has no idea how to convert something like THERMAL_TRIP_PASSIVE into a number. -- Steve -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Steven Rostedt <rostedt@goodmis.org> writes: [...] >> >> # pwd /sys/kernel/debug/tracing/events/thermal/thermal_zone_trip >> # cat format >> name: thermal_zone_trip >> ID: 463 >> format: >> field:unsigned short common_type; offset:0; size:2; signed:0; >> field:unsigned char common_flags; offset:2; size:1; signed:0; >> field:unsigned char common_preempt_count; offset:3; size:1; signed:0; >> field:int common_pid; offset:4; size:4; signed:1; >> >> field:__data_loc char[] thermal_zone; offset:8; size:4; signed:0; >> field:int id; offset:12; size:4; signed:1; >> field:int trip; offset:16; size:4; signed:1; >> field:enum thermal_trip_type trip_type; offset:20; size:4; signed:0; >> >> print fmt: "thermal_zone=%s id=%d trip=%d trip_type=%s", >> __get_str(thermal_zone), REC->id, REC->trip, >> __print_symbolic(REC->trip_type, { THERMAL_TRIP_ACTIVE, "active" }, >> { THERMAL_TRIP_PASSIVE, "passive" }, { THERMAL_TRIP_HOT, "hot" }, { >> THERMAL_TRIP_CRITICAL, "critical" }) >> > > For it to work with trace-cmd (and perf) you'll need to add a plugin to > define what those enums are. This is the file that trace-cmd uses to > foramat. But it has no idea how to convert something like > THERMAL_TRIP_PASSIVE into a number. > Hmm, right. I was working under the assumption that the enum values will be converted to their numeric representation when compiled. I think it's better to convert the enum to int in the trace event - the changes are localised and the tool will work as well. Rui, Eduardo what do you think? Punit > -- Steve > -- > To unsubscribe from this list: send the line "unsubscribe linux-pm" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Punit, On Wed, Jun 11, 2014 at 12:31:44PM +0100, Punit Agrawal wrote: > Create a new event to trace when the temperature is above a trip > point. Use the trace-point when handling non-critical and critical > trip pionts. > > Cc: Zhang Rui <rui.zhang@intel.com> > Cc: Eduardo Valentin <edubezval@gmail.com> > Cc: Steven Rostedt <rostedt@goodmis.org> > Cc: Frederic Weisbecker <fweisbec@gmail.com> > Cc: Ingo Molnar <mingo@redhat.com> > Signed-off-by: Punit Agrawal <punit.agrawal@arm.com> > --- > Hi Steven, > > I am facing an issue with partial trace being emitted when using > __print_symbolic in this patch. > > When the trip_type is THERMAL_TRIP_ACTIVE (i.e., the first value in > the symbol map), the emitted trace contains the corresponding string > ("active"). But for other values of trip_type an empty string is > emitted in the trace. > > I've looked at other uses of __print_symbolic in the kernel and don't > see any difference in usage. Do you know what could be causing this or > alternately have any pointers on how to debug this behaviour? > > Thanks. > Punit > > drivers/thermal/fair_share.c | 7 ++++++- > drivers/thermal/step_wise.c | 5 ++++- > drivers/thermal/thermal_core.c | 2 ++ > include/trace/events/thermal.h | 30 ++++++++++++++++++++++++++++++ > 4 files changed, 42 insertions(+), 2 deletions(-) > > diff --git a/drivers/thermal/fair_share.c b/drivers/thermal/fair_share.c > index 944ba2f..2cddd68 100644 > --- a/drivers/thermal/fair_share.c > +++ b/drivers/thermal/fair_share.c > @@ -23,6 +23,7 @@ > */ > > #include <linux/thermal.h> > +#include <trace/events/thermal.h> > > #include "thermal_core.h" > > @@ -34,14 +35,18 @@ static int get_trip_level(struct thermal_zone_device *tz) > { > int count = 0; > unsigned long trip_temp; > + enum thermal_trip_type trip_type; > > if (tz->trips == 0 || !tz->ops->get_trip_temp) > return 0; > > for (count = 0; count < tz->trips; count++) { > tz->ops->get_trip_temp(tz, count, &trip_temp); > - if (tz->temperature < trip_temp) > + if (tz->temperature < trip_temp) { > + tz->ops->get_trip_type(tz, count, &trip_type); > + trace_thermal_zone_trip(tz, count, trip_type); This should be outside the if condition. You want to report when trip points have been hit, like in the step_wise code below. > break; > + } > } > return count; > } > diff --git a/drivers/thermal/step_wise.c b/drivers/thermal/step_wise.c > index f251521..3b54c2c 100644 > --- a/drivers/thermal/step_wise.c > +++ b/drivers/thermal/step_wise.c > @@ -23,6 +23,7 @@ > */ > > #include <linux/thermal.h> > +#include <trace/events/thermal.h> > > #include "thermal_core.h" > > @@ -129,8 +130,10 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip) > > trend = get_tz_trend(tz, trip); > > - if (tz->temperature >= trip_temp) > + if (tz->temperature >= trip_temp) { > throttle = true; > + trace_thermal_zone_trip(tz, trip, trip_type); > + } > > dev_dbg(&tz->device, "Trip%d[type=%d,temp=%ld]:trend=%d,throttle=%d\n", > trip, trip_type, trip_temp, trend, throttle); > diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c > index c74c78d..454884a 100644 > --- a/drivers/thermal/thermal_core.c > +++ b/drivers/thermal/thermal_core.c > @@ -371,6 +371,8 @@ static void handle_critical_trips(struct thermal_zone_device *tz, > if (tz->temperature < trip_temp) > return; > > + trace_thermal_zone_trip(tz, trip, trip_type); > + > if (tz->ops->notify) > tz->ops->notify(tz, trip, trip_type); > Cheers, Javi -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/thermal/fair_share.c b/drivers/thermal/fair_share.c index 944ba2f..2cddd68 100644 --- a/drivers/thermal/fair_share.c +++ b/drivers/thermal/fair_share.c @@ -23,6 +23,7 @@ */ #include <linux/thermal.h> +#include <trace/events/thermal.h> #include "thermal_core.h" @@ -34,14 +35,18 @@ static int get_trip_level(struct thermal_zone_device *tz) { int count = 0; unsigned long trip_temp; + enum thermal_trip_type trip_type; if (tz->trips == 0 || !tz->ops->get_trip_temp) return 0; for (count = 0; count < tz->trips; count++) { tz->ops->get_trip_temp(tz, count, &trip_temp); - if (tz->temperature < trip_temp) + if (tz->temperature < trip_temp) { + tz->ops->get_trip_type(tz, count, &trip_type); + trace_thermal_zone_trip(tz, count, trip_type); break; + } } return count; } diff --git a/drivers/thermal/step_wise.c b/drivers/thermal/step_wise.c index f251521..3b54c2c 100644 --- a/drivers/thermal/step_wise.c +++ b/drivers/thermal/step_wise.c @@ -23,6 +23,7 @@ */ #include <linux/thermal.h> +#include <trace/events/thermal.h> #include "thermal_core.h" @@ -129,8 +130,10 @@ static void thermal_zone_trip_update(struct thermal_zone_device *tz, int trip) trend = get_tz_trend(tz, trip); - if (tz->temperature >= trip_temp) + if (tz->temperature >= trip_temp) { throttle = true; + trace_thermal_zone_trip(tz, trip, trip_type); + } dev_dbg(&tz->device, "Trip%d[type=%d,temp=%ld]:trend=%d,throttle=%d\n", trip, trip_type, trip_temp, trend, throttle); diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index c74c78d..454884a 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c @@ -371,6 +371,8 @@ static void handle_critical_trips(struct thermal_zone_device *tz, if (tz->temperature < trip_temp) return; + trace_thermal_zone_trip(tz, trip, trip_type); + if (tz->ops->notify) tz->ops->notify(tz, trip, trip_type); diff --git a/include/trace/events/thermal.h b/include/trace/events/thermal.h index 894a79e..5eeb1e7 100644 --- a/include/trace/events/thermal.h +++ b/include/trace/events/thermal.h @@ -51,6 +51,36 @@ TRACE_EVENT(cdev_update, TP_printk("type=%s target=%lu", __get_str(type), __entry->target) ); +TRACE_EVENT(thermal_zone_trip, + + TP_PROTO(struct thermal_zone_device *tz, int trip, + enum thermal_trip_type trip_type), + + TP_ARGS(tz, trip, trip_type), + + TP_STRUCT__entry( + __string(thermal_zone, tz->type) + __field(int, id) + __field(int, trip) + __field(enum thermal_trip_type, trip_type) + ), + + TP_fast_assign( + __assign_str(thermal_zone, tz->type); + __entry->id = tz->id; + __entry->trip = trip; + __entry->trip_type = trip_type; + ), + + TP_printk("thermal_zone=%s id=%d trip=%d trip_type=%s", + __get_str(thermal_zone), __entry->id, __entry->trip, + __print_symbolic(__entry->trip_type, + { THERMAL_TRIP_ACTIVE, "active" }, + { THERMAL_TRIP_PASSIVE, "passive" }, + { THERMAL_TRIP_HOT, "hot" }, + { THERMAL_TRIP_CRITICAL, "critical" })) +); + #endif /* _TRACE_THERMAL_H */ /* This part must be outside protection */
Create a new event to trace when the temperature is above a trip point. Use the trace-point when handling non-critical and critical trip pionts. Cc: Zhang Rui <rui.zhang@intel.com> Cc: Eduardo Valentin <edubezval@gmail.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Signed-off-by: Punit Agrawal <punit.agrawal@arm.com> --- Hi Steven, I am facing an issue with partial trace being emitted when using __print_symbolic in this patch. When the trip_type is THERMAL_TRIP_ACTIVE (i.e., the first value in the symbol map), the emitted trace contains the corresponding string ("active"). But for other values of trip_type an empty string is emitted in the trace. I've looked at other uses of __print_symbolic in the kernel and don't see any difference in usage. Do you know what could be causing this or alternately have any pointers on how to debug this behaviour? Thanks. Punit drivers/thermal/fair_share.c | 7 ++++++- drivers/thermal/step_wise.c | 5 ++++- drivers/thermal/thermal_core.c | 2 ++ include/trace/events/thermal.h | 30 ++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-)