diff options
author | Sahara <keun-o.park@windriver.com> | 2013-06-20 22:12:30 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-06-24 07:09:03 -0400 |
commit | 96d9d0b5dc17e80cefbd7c5be15a5072d33513f8 (patch) | |
tree | f057c7e2d5309457f46291d47acd571e946b77ef | |
parent | ae8822b842e229fa4459fca2d979b630d812311d (diff) |
PM / QoS: Add dev_pm_qos_request tracepoints
Adds tracepoints to dev_pm_qos_add_request, dev_pm_qos_update_request,
and dev_pm_qos_remove_request. It's useful for checking device name,
dev_pm_qos_request_type, and value.
Signed-off-by: Sahara <keun-o.park@windriver.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r-- | drivers/base/power/qos.c | 6 | ||||
-rw-r--r-- | include/trace/events/power.h | 51 |
2 files changed, 57 insertions, 0 deletions
diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c index 71671c42ef45..5c1361a9e5dd 100644 --- a/drivers/base/power/qos.c +++ b/drivers/base/power/qos.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/export.h> | 42 | #include <linux/export.h> |
43 | #include <linux/pm_runtime.h> | 43 | #include <linux/pm_runtime.h> |
44 | #include <linux/err.h> | 44 | #include <linux/err.h> |
45 | #include <trace/events/power.h> | ||
45 | 46 | ||
46 | #include "power.h" | 47 | #include "power.h" |
47 | 48 | ||
@@ -305,6 +306,7 @@ int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req, | |||
305 | else if (!dev->power.qos) | 306 | else if (!dev->power.qos) |
306 | ret = dev_pm_qos_constraints_allocate(dev); | 307 | ret = dev_pm_qos_constraints_allocate(dev); |
307 | 308 | ||
309 | trace_dev_pm_qos_add_request(dev_name(dev), type, value); | ||
308 | if (!ret) { | 310 | if (!ret) { |
309 | req->dev = dev; | 311 | req->dev = dev; |
310 | req->type = type; | 312 | req->type = type; |
@@ -349,6 +351,8 @@ static int __dev_pm_qos_update_request(struct dev_pm_qos_request *req, | |||
349 | return -EINVAL; | 351 | return -EINVAL; |
350 | } | 352 | } |
351 | 353 | ||
354 | trace_dev_pm_qos_update_request(dev_name(req->dev), req->type, | ||
355 | new_value); | ||
352 | if (curr_value != new_value) | 356 | if (curr_value != new_value) |
353 | ret = apply_constraint(req, PM_QOS_UPDATE_REQ, new_value); | 357 | ret = apply_constraint(req, PM_QOS_UPDATE_REQ, new_value); |
354 | 358 | ||
@@ -398,6 +402,8 @@ static int __dev_pm_qos_remove_request(struct dev_pm_qos_request *req) | |||
398 | if (IS_ERR_OR_NULL(req->dev->power.qos)) | 402 | if (IS_ERR_OR_NULL(req->dev->power.qos)) |
399 | return -ENODEV; | 403 | return -ENODEV; |
400 | 404 | ||
405 | trace_dev_pm_qos_remove_request(dev_name(req->dev), req->type, | ||
406 | PM_QOS_DEFAULT_VALUE); | ||
401 | ret = apply_constraint(req, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE); | 407 | ret = apply_constraint(req, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE); |
402 | memset(req, 0, sizeof(*req)); | 408 | memset(req, 0, sizeof(*req)); |
403 | return ret; | 409 | return ret; |
diff --git a/include/trace/events/power.h b/include/trace/events/power.h index 6411f924afb1..8e42410bd159 100644 --- a/include/trace/events/power.h +++ b/include/trace/events/power.h | |||
@@ -299,6 +299,57 @@ DEFINE_EVENT_PRINT(pm_qos_update, pm_qos_update_flags, | |||
299 | { PM_QOS_REMOVE_REQ, "REMOVE_REQ" }), | 299 | { PM_QOS_REMOVE_REQ, "REMOVE_REQ" }), |
300 | __entry->prev_value, __entry->curr_value) | 300 | __entry->prev_value, __entry->curr_value) |
301 | ); | 301 | ); |
302 | |||
303 | DECLARE_EVENT_CLASS(dev_pm_qos_request, | ||
304 | |||
305 | TP_PROTO(const char *name, enum dev_pm_qos_req_type type, | ||
306 | s32 new_value), | ||
307 | |||
308 | TP_ARGS(name, type, new_value), | ||
309 | |||
310 | TP_STRUCT__entry( | ||
311 | __string( name, name ) | ||
312 | __field( enum dev_pm_qos_req_type, type ) | ||
313 | __field( s32, new_value ) | ||
314 | ), | ||
315 | |||
316 | TP_fast_assign( | ||
317 | __assign_str(name, name); | ||
318 | __entry->type = type; | ||
319 | __entry->new_value = new_value; | ||
320 | ), | ||
321 | |||
322 | TP_printk("device=%s type=%s new_value=%d", | ||
323 | __get_str(name), | ||
324 | __print_symbolic(__entry->type, | ||
325 | { DEV_PM_QOS_LATENCY, "DEV_PM_QOS_LATENCY" }, | ||
326 | { DEV_PM_QOS_FLAGS, "DEV_PM_QOS_FLAGS" }), | ||
327 | __entry->new_value) | ||
328 | ); | ||
329 | |||
330 | DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_add_request, | ||
331 | |||
332 | TP_PROTO(const char *name, enum dev_pm_qos_req_type type, | ||
333 | s32 new_value), | ||
334 | |||
335 | TP_ARGS(name, type, new_value) | ||
336 | ); | ||
337 | |||
338 | DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_update_request, | ||
339 | |||
340 | TP_PROTO(const char *name, enum dev_pm_qos_req_type type, | ||
341 | s32 new_value), | ||
342 | |||
343 | TP_ARGS(name, type, new_value) | ||
344 | ); | ||
345 | |||
346 | DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_remove_request, | ||
347 | |||
348 | TP_PROTO(const char *name, enum dev_pm_qos_req_type type, | ||
349 | s32 new_value), | ||
350 | |||
351 | TP_ARGS(name, type, new_value) | ||
352 | ); | ||
302 | #endif /* _TRACE_POWER_H */ | 353 | #endif /* _TRACE_POWER_H */ |
303 | 354 | ||
304 | /* This part must be outside protection */ | 355 | /* This part must be outside protection */ |