Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PM-runtime: add tracepoints for usage_count changes

Add tracepoints to remaining places where device's power.usage_count
is changed.

This helps debugging where and why autosuspend is prevented.

Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

authored by

Michał Mirosław and committed by
Rafael J. Wysocki
d2292906 b3a987b0

+17 -2
+11 -2
drivers/base/power/runtime.c
··· 1006 1006 int retval; 1007 1007 1008 1008 if (rpmflags & RPM_GET_PUT) { 1009 - if (!atomic_dec_and_test(&dev->power.usage_count)) 1009 + if (!atomic_dec_and_test(&dev->power.usage_count)) { 1010 + trace_rpm_usage_rcuidle(dev, rpmflags); 1010 1011 return 0; 1012 + } 1011 1013 } 1012 1014 1013 1015 might_sleep_if(!(rpmflags & RPM_ASYNC) && !dev->power.irq_safe); ··· 1040 1038 int retval; 1041 1039 1042 1040 if (rpmflags & RPM_GET_PUT) { 1043 - if (!atomic_dec_and_test(&dev->power.usage_count)) 1041 + if (!atomic_dec_and_test(&dev->power.usage_count)) { 1042 + trace_rpm_usage_rcuidle(dev, rpmflags); 1044 1043 return 0; 1044 + } 1045 1045 } 1046 1046 1047 1047 might_sleep_if(!(rpmflags & RPM_ASYNC) && !dev->power.irq_safe); ··· 1105 1101 retval = dev->power.disable_depth > 0 ? -EINVAL : 1106 1102 dev->power.runtime_status == RPM_ACTIVE 1107 1103 && atomic_inc_not_zero(&dev->power.usage_count); 1104 + trace_rpm_usage_rcuidle(dev, 0); 1108 1105 spin_unlock_irqrestore(&dev->power.lock, flags); 1109 1106 return retval; 1110 1107 } ··· 1439 1434 dev->power.runtime_auto = true; 1440 1435 if (atomic_dec_and_test(&dev->power.usage_count)) 1441 1436 rpm_idle(dev, RPM_AUTO | RPM_ASYNC); 1437 + else 1438 + trace_rpm_usage_rcuidle(dev, RPM_AUTO | RPM_ASYNC); 1442 1439 1443 1440 out: 1444 1441 spin_unlock_irq(&dev->power.lock); ··· 1508 1501 if (!old_use || old_delay >= 0) { 1509 1502 atomic_inc(&dev->power.usage_count); 1510 1503 rpm_resume(dev, 0); 1504 + } else { 1505 + trace_rpm_usage_rcuidle(dev, 0); 1511 1506 } 1512 1507 } 1513 1508
+6
include/trace/events/rpm.h
··· 74 74 75 75 TP_ARGS(dev, flags) 76 76 ); 77 + DEFINE_EVENT(rpm_internal, rpm_usage, 78 + 79 + TP_PROTO(struct device *dev, int flags), 80 + 81 + TP_ARGS(dev, flags) 82 + ); 77 83 78 84 TRACE_EVENT(rpm_return_int, 79 85 TP_PROTO(struct device *dev, unsigned long ip, int ret),