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

PM / QoS: Add pm_qos_request tracepoints

Adds tracepoints to pm_qos_add_request, pm_qos_update_request,
pm_qos_remove_request, and pm_qos_update_request_timeout.
It's useful for checking pm_qos_class, value, and timeout_us.

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
ae8822b8 247e9ee0

+76
+71
include/trace/events/power.h
··· 182 182 /* 183 183 * The pm qos events are used for pm qos update 184 184 */ 185 + DECLARE_EVENT_CLASS(pm_qos_request, 186 + 187 + TP_PROTO(int pm_qos_class, s32 value), 188 + 189 + TP_ARGS(pm_qos_class, value), 190 + 191 + TP_STRUCT__entry( 192 + __field( int, pm_qos_class ) 193 + __field( s32, value ) 194 + ), 195 + 196 + TP_fast_assign( 197 + __entry->pm_qos_class = pm_qos_class; 198 + __entry->value = value; 199 + ), 200 + 201 + TP_printk("pm_qos_class=%s value=%d", 202 + __print_symbolic(__entry->pm_qos_class, 203 + { PM_QOS_CPU_DMA_LATENCY, "CPU_DMA_LATENCY" }, 204 + { PM_QOS_NETWORK_LATENCY, "NETWORK_LATENCY" }, 205 + { PM_QOS_NETWORK_THROUGHPUT, "NETWORK_THROUGHPUT" }), 206 + __entry->value) 207 + ); 208 + 209 + DEFINE_EVENT(pm_qos_request, pm_qos_add_request, 210 + 211 + TP_PROTO(int pm_qos_class, s32 value), 212 + 213 + TP_ARGS(pm_qos_class, value) 214 + ); 215 + 216 + DEFINE_EVENT(pm_qos_request, pm_qos_update_request, 217 + 218 + TP_PROTO(int pm_qos_class, s32 value), 219 + 220 + TP_ARGS(pm_qos_class, value) 221 + ); 222 + 223 + DEFINE_EVENT(pm_qos_request, pm_qos_remove_request, 224 + 225 + TP_PROTO(int pm_qos_class, s32 value), 226 + 227 + TP_ARGS(pm_qos_class, value) 228 + ); 229 + 230 + TRACE_EVENT(pm_qos_update_request_timeout, 231 + 232 + TP_PROTO(int pm_qos_class, s32 value, unsigned long timeout_us), 233 + 234 + TP_ARGS(pm_qos_class, value, timeout_us), 235 + 236 + TP_STRUCT__entry( 237 + __field( int, pm_qos_class ) 238 + __field( s32, value ) 239 + __field( unsigned long, timeout_us ) 240 + ), 241 + 242 + TP_fast_assign( 243 + __entry->pm_qos_class = pm_qos_class; 244 + __entry->value = value; 245 + __entry->timeout_us = timeout_us; 246 + ), 247 + 248 + TP_printk("pm_qos_class=%s value=%d, timeout_us=%ld", 249 + __print_symbolic(__entry->pm_qos_class, 250 + { PM_QOS_CPU_DMA_LATENCY, "CPU_DMA_LATENCY" }, 251 + { PM_QOS_NETWORK_LATENCY, "NETWORK_LATENCY" }, 252 + { PM_QOS_NETWORK_THROUGHPUT, "NETWORK_THROUGHPUT" }), 253 + __entry->value, __entry->timeout_us) 254 + ); 255 + 185 256 DECLARE_EVENT_CLASS(pm_qos_update, 186 257 187 258 TP_PROTO(enum pm_qos_req_action action, int prev_value, int curr_value),
+5
kernel/power/qos.c
··· 336 336 } 337 337 req->pm_qos_class = pm_qos_class; 338 338 INIT_DELAYED_WORK(&req->work, pm_qos_work_fn); 339 + trace_pm_qos_add_request(pm_qos_class, value); 339 340 pm_qos_update_target(pm_qos_array[pm_qos_class]->constraints, 340 341 &req->node, PM_QOS_ADD_REQ, value); 341 342 } ··· 365 364 366 365 cancel_delayed_work_sync(&req->work); 367 366 367 + trace_pm_qos_update_request(req->pm_qos_class, new_value); 368 368 if (new_value != req->node.prio) 369 369 pm_qos_update_target( 370 370 pm_qos_array[req->pm_qos_class]->constraints, ··· 392 390 393 391 cancel_delayed_work_sync(&req->work); 394 392 393 + trace_pm_qos_update_request_timeout(req->pm_qos_class, 394 + new_value, timeout_us); 395 395 if (new_value != req->node.prio) 396 396 pm_qos_update_target( 397 397 pm_qos_array[req->pm_qos_class]->constraints, ··· 423 419 424 420 cancel_delayed_work_sync(&req->work); 425 421 422 + trace_pm_qos_remove_request(req->pm_qos_class, PM_QOS_DEFAULT_VALUE); 426 423 pm_qos_update_target(pm_qos_array[req->pm_qos_class]->constraints, 427 424 &req->node, PM_QOS_REMOVE_REQ, 428 425 PM_QOS_DEFAULT_VALUE);