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

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>

authored by

Sahara and committed by
Rafael J. Wysocki
96d9d0b5 ae8822b8

+57
+6
drivers/base/power/qos.c
··· 42 42 #include <linux/export.h> 43 43 #include <linux/pm_runtime.h> 44 44 #include <linux/err.h> 45 + #include <trace/events/power.h> 45 46 46 47 #include "power.h" 47 48 ··· 306 305 else if (!dev->power.qos) 307 306 ret = dev_pm_qos_constraints_allocate(dev); 308 307 308 + trace_dev_pm_qos_add_request(dev_name(dev), type, value); 309 309 if (!ret) { 310 310 req->dev = dev; 311 311 req->type = type; ··· 351 349 return -EINVAL; 352 350 } 353 351 352 + trace_dev_pm_qos_update_request(dev_name(req->dev), req->type, 353 + new_value); 354 354 if (curr_value != new_value) 355 355 ret = apply_constraint(req, PM_QOS_UPDATE_REQ, new_value); 356 356 ··· 402 398 if (IS_ERR_OR_NULL(req->dev->power.qos)) 403 399 return -ENODEV; 404 400 401 + trace_dev_pm_qos_remove_request(dev_name(req->dev), req->type, 402 + PM_QOS_DEFAULT_VALUE); 405 403 ret = apply_constraint(req, PM_QOS_REMOVE_REQ, PM_QOS_DEFAULT_VALUE); 406 404 memset(req, 0, sizeof(*req)); 407 405 return ret;
+51
include/trace/events/power.h
··· 299 299 { PM_QOS_REMOVE_REQ, "REMOVE_REQ" }), 300 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 353 #endif /* _TRACE_POWER_H */ 303 354 304 355 /* This part must be outside protection */