diff --git a/block/blk-mq.c b/block/blk-mq.c index 4952a7a433de..cca4ac1e74fd 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -32,6 +32,8 @@ #include +#include + #include #include "blk.h" #include "blk-mq.h" @@ -1565,6 +1567,12 @@ static void blk_mq_requeue_work(struct work_struct *work) void blk_mq_kick_requeue_list(struct request_queue *q) { + bool skip = false; + + trace_android_vh_blk_mq_kick_requeue_list(q, 0, &skip); + if (skip) + return; + kblockd_mod_delayed_work_on(WORK_CPU_UNBOUND, &q->requeue_work, 0); } EXPORT_SYMBOL(blk_mq_kick_requeue_list); @@ -1572,6 +1580,13 @@ EXPORT_SYMBOL(blk_mq_kick_requeue_list); void blk_mq_delay_kick_requeue_list(struct request_queue *q, unsigned long msecs) { + bool skip = false; + + trace_android_vh_blk_mq_kick_requeue_list(q, + msecs_to_jiffies(msecs), &skip); + if (skip) + return; + kblockd_mod_delayed_work_on(WORK_CPU_UNBOUND, &q->requeue_work, msecs_to_jiffies(msecs)); } @@ -2276,8 +2291,16 @@ select_cpu: */ void blk_mq_delay_run_hw_queue(struct blk_mq_hw_ctx *hctx, unsigned long msecs) { + bool skip = false; + if (unlikely(blk_mq_hctx_stopped(hctx))) return; + + trace_android_vh_blk_mq_delay_run_hw_queue(blk_mq_hctx_next_cpu(hctx), + hctx, msecs_to_jiffies(msecs), &skip); + if (skip) + return; + kblockd_mod_delayed_work_on(blk_mq_hctx_next_cpu(hctx), &hctx->run_work, msecs_to_jiffies(msecs)); } diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 60c943df0a42..45115dc83b4a 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -374,6 +374,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sk_alloc); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sk_free); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_receive_sock); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_task_get_classid); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_mq_delay_run_hw_queue); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_mq_kick_requeue_list); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_enable_thermal_genl_check); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_thermal_pm_notify_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_pages_entry); diff --git a/include/trace/hooks/blk.h b/include/trace/hooks/blk.h index 04ee035543e5..a1962181bd55 100644 --- a/include/trace/hooks/blk.h +++ b/include/trace/hooks/blk.h @@ -17,6 +17,17 @@ DECLARE_HOOK(android_vh_bd_link_disk_holder, TP_PROTO(struct block_device *bdev, struct gendisk *disk), TP_ARGS(bdev, disk)); +struct blk_mq_hw_ctx; +struct request_queue; + +DECLARE_HOOK(android_vh_blk_mq_delay_run_hw_queue, + TP_PROTO(int cpu, struct blk_mq_hw_ctx *hctx, unsigned long delay, bool *skip), + TP_ARGS(cpu, hctx, delay, skip)); + +DECLARE_HOOK(android_vh_blk_mq_kick_requeue_list, + TP_PROTO(struct request_queue *q, unsigned long delay, bool *skip), + TP_ARGS(q, delay, skip)); + #endif /* _TRACE_HOOK_BLK_H */ /* This part must be outside protection */ #include