From f4de660fb8cc97552edb81bf4fb34e28c82b7dad Mon Sep 17 00:00:00 2001 From: Yang Yang Date: Thu, 26 Sep 2024 18:58:49 +0800 Subject: [PATCH] ANDROID: vendor_hooks: select workqueue based on task priority Introduce vendor hooks to determine which workqueue should be assigned to a task based on its priority Bug: 372168987 Bug: 409419444 Change-Id: I81f4d48f5f53021744c87524d412d9593745ffed Signed-off-by: Yang Yang (cherry picked from commit baf74b82230ddb55ea81f4ad58c3bd2f1b15ba9a) Signed-off-by: ying zuxin <11154159@vivo.com> --- block/blk-mq.c | 23 +++++++++++++++++++++++ drivers/android/vendor_hooks.c | 2 ++ include/trace/hooks/blk.h | 11 +++++++++++ 3 files changed, 36 insertions(+) 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