From ba664cddffd2c9bb0d0d09a2416f70dade1a8bda Mon Sep 17 00:00:00 2001 From: Sokchetra Eung Date: Wed, 14 Jul 2021 23:15:03 -0700 Subject: [PATCH] msm: camera: common: Append workq name in log Append workq name in workq delay detect API to identify which workq is scheduled late. Create workq name macros for cci and cpas to pass to workq delay detect API. CRs-Fixed: 2994927 Change-Id: Iebc14520b918272e92b59c900de5fe17f38a2406 Signed-off-by: Sokchetra Eung --- drivers/cam_cdm/cam_cdm_hw_core.c | 8 ++++---- drivers/cam_cdm/cam_cdm_virtual_core.c | 4 ++-- drivers/cam_cpas/cam_cpas_hw.c | 2 +- drivers/cam_cpas/cam_cpas_hw.h | 2 ++ drivers/cam_cpas/cpas_top/cam_cpastop_hw.c | 2 +- drivers/cam_req_mgr/cam_req_mgr_workq.c | 8 +++++--- drivers/cam_req_mgr/cam_req_mgr_workq.h | 5 ++++- drivers/cam_sensor_module/cam_cci/cam_cci_core.c | 2 +- drivers/cam_sensor_module/cam_cci/cam_cci_dev.h | 2 ++ drivers/cam_sensor_module/cam_cci/cam_cci_soc.c | 2 +- drivers/cam_sync/cam_sync_util.c | 2 +- 11 files changed, 24 insertions(+), 15 deletions(-) diff --git a/drivers/cam_cdm/cam_cdm_hw_core.c b/drivers/cam_cdm/cam_cdm_hw_core.c index d92108d073..91ab9e0d51 100644 --- a/drivers/cam_cdm/cam_cdm_hw_core.c +++ b/drivers/cam_cdm/cam_cdm_hw_core.c @@ -1306,7 +1306,7 @@ static void cam_hw_cdm_work(struct work_struct *work) return; } - cam_req_mgr_thread_switch_delay_detect( + cam_req_mgr_thread_switch_delay_detect(cdm_hw->soc_info.dev_name, payload->workq_scheduled_ts); CAM_DBG(CAM_CDM, "IRQ status=0x%x", payload->irq_status); @@ -2339,9 +2339,9 @@ static int cam_hw_cdm_component_bind(struct device *dev, init_completion(&cdm_core->bl_fifo[i].bl_complete); - len = strlcpy(work_q_name, cdm_core->name, - sizeof(cdm_core->name)); - snprintf(work_q_name + len, sizeof(work_q_name) - len, "%d", i); + len = strlcpy(work_q_name, cdm_hw->soc_info.label_name, + sizeof(work_q_name)); + snprintf(work_q_name + len, sizeof(work_q_name) - len, "%d_%d", cdm_hw->soc_info.index, i); cdm_core->bl_fifo[i].work_queue = alloc_workqueue(work_q_name, WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, CAM_CDM_INFLIGHT_WORKS); diff --git a/drivers/cam_cdm/cam_cdm_virtual_core.c b/drivers/cam_cdm/cam_cdm_virtual_core.c index 481d37616c..76745bc713 100644 --- a/drivers/cam_cdm/cam_cdm_virtual_core.c +++ b/drivers/cam_cdm/cam_cdm_virtual_core.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. */ #include @@ -34,7 +34,7 @@ static void cam_virtual_cdm_work(struct work_struct *work) cdm_hw = payload->hw; core = (struct cam_cdm *)cdm_hw->core_info; - cam_req_mgr_thread_switch_delay_detect( + cam_req_mgr_thread_switch_delay_detect(core->name, payload->workq_scheduled_ts); if (payload->irq_status & 0x2) { diff --git a/drivers/cam_cpas/cam_cpas_hw.c b/drivers/cam_cpas/cam_cpas_hw.c index 89e66c1538..16321b0d79 100644 --- a/drivers/cam_cpas/cam_cpas_hw.c +++ b/drivers/cam_cpas/cam_cpas_hw.c @@ -3006,7 +3006,7 @@ int cam_cpas_hw_probe(struct platform_device *pdev, cpas_hw_intf->hw_ops.write = NULL; cpas_hw_intf->hw_ops.process_cmd = cam_cpas_hw_process_cmd; - cpas_core->work_queue = alloc_workqueue("cam-cpas", + cpas_core->work_queue = alloc_workqueue(CAM_CPAS_WORKQUEUE_NAME, WQ_UNBOUND | WQ_MEM_RECLAIM, CAM_CPAS_INFLIGHT_WORKS); if (!cpas_core->work_queue) { rc = -ENOMEM; diff --git a/drivers/cam_cpas/cam_cpas_hw.h b/drivers/cam_cpas/cam_cpas_hw.h index 8004ec0470..93f64bc7bd 100644 --- a/drivers/cam_cpas/cam_cpas_hw.h +++ b/drivers/cam_cpas/cam_cpas_hw.h @@ -31,6 +31,8 @@ #define CAM_CPAS_GET_CLIENT_IDX(handle) (handle) #define CAM_CPAS_GET_CLIENT_HANDLE(indx) (indx) +#define CAM_CPAS_WORKQUEUE_NAME "cam-cpas" + #define CAM_CPAS_CLIENT_VALID(indx) \ ((indx >= 0) && (indx < CAM_CPAS_MAX_CLIENTS)) #define CAM_CPAS_CLIENT_REGISTERED(cpas_core, indx) \ diff --git a/drivers/cam_cpas/cpas_top/cam_cpastop_hw.c b/drivers/cam_cpas/cpas_top/cam_cpastop_hw.c index c1991f7bda..85fd34e605 100644 --- a/drivers/cam_cpas/cpas_top/cam_cpastop_hw.c +++ b/drivers/cam_cpas/cpas_top/cam_cpastop_hw.c @@ -602,7 +602,7 @@ static void cam_cpastop_work(struct work_struct *work) return; } - cam_req_mgr_thread_switch_delay_detect( + cam_req_mgr_thread_switch_delay_detect(CAM_CPAS_WORKQUEUE_NAME, payload->workq_scheduled_ts); cpas_hw = payload->hw; diff --git a/drivers/cam_req_mgr/cam_req_mgr_workq.c b/drivers/cam_req_mgr/cam_req_mgr_workq.c index da36c4ab37..af77cb5632 100644 --- a/drivers/cam_req_mgr/cam_req_mgr_workq.c +++ b/drivers/cam_req_mgr/cam_req_mgr_workq.c @@ -114,7 +114,7 @@ void cam_req_mgr_process_workq(struct work_struct *w) workq = (struct cam_req_mgr_core_workq *) container_of(w, struct cam_req_mgr_core_workq, work); - cam_req_mgr_thread_switch_delay_detect(workq->workq_scheduled_ts); + cam_req_mgr_thread_switch_delay_detect(workq->workq_name, workq->workq_scheduled_ts); while (i < CRM_TASK_PRIORITY_MAX) { WORKQ_ACQUIRE_LOCK(workq, flags); while (!list_empty(&workq->task.process_head[i])) { @@ -217,6 +217,7 @@ int cam_req_mgr_workq_create(char *name, int32_t num_tasks, } /* Workq attributes initialization */ + strlcpy(crm_workq->workq_name, buf, sizeof(crm_workq->workq_name)); INIT_WORK(&crm_workq->work, func); spin_lock_init(&crm_workq->lock_bh); CAM_DBG(CAM_CRM, "LOCK_DBG workq %s lock %pK", @@ -282,7 +283,7 @@ void cam_req_mgr_workq_destroy(struct cam_req_mgr_core_workq **crm_workq) } } -void cam_req_mgr_thread_switch_delay_detect(ktime_t workq_scheduled) +void cam_req_mgr_thread_switch_delay_detect(const char *name, ktime_t workq_scheduled) { uint64_t diff; ktime_t cur_time; @@ -296,7 +297,8 @@ void cam_req_mgr_thread_switch_delay_detect(ktime_t workq_scheduled) if (diff > CAM_WORKQ_RESPONSE_TIME_THRESHOLD) { CAM_WARN_RATE_LIMIT(CAM_CRM, - "Workq delay detected %ld:%06ld %ld:%06ld %ld:", + "Workq %s delay detected %ld:%06ld %ld:%06ld %ld:", + name, workq_scheduled_ts.tv_sec, workq_scheduled_ts.tv_nsec/NSEC_PER_USEC, cur_ts.tv_sec, cur_ts.tv_nsec/NSEC_PER_USEC, diff --git a/drivers/cam_req_mgr/cam_req_mgr_workq.h b/drivers/cam_req_mgr/cam_req_mgr_workq.h index d9b54ca459..949b87cda8 100644 --- a/drivers/cam_req_mgr/cam_req_mgr_workq.h +++ b/drivers/cam_req_mgr/cam_req_mgr_workq.h @@ -77,6 +77,7 @@ struct crm_workq_task { * @lock_bh : lock for task structs * @in_irq : set true if workque can be used in irq context * @flush : used to track if flush has been called on workqueue + * @work_q_name : name of the workq * task - * @lock : Current task's lock handle * @pending_cnt : # of tasks left in queue @@ -94,6 +95,7 @@ struct cam_req_mgr_core_workq { uint32_t in_irq; ktime_t workq_scheduled_ts; atomic_t flush; + char workq_name[128]; /* tasks */ struct { @@ -155,9 +157,10 @@ int cam_req_mgr_workq_enqueue_task(struct crm_workq_task *task, /** * cam_req_mgr_thread_switch_delay_detect() * @brief: Detects if workq delay has occurred or not + * @name : Name of the workq * @timestamp: workq scheduled timestamp */ -void cam_req_mgr_thread_switch_delay_detect( +void cam_req_mgr_thread_switch_delay_detect(const char *name, ktime_t timestamp); /** diff --git a/drivers/cam_sensor_module/cam_cci/cam_cci_core.c b/drivers/cam_sensor_module/cam_cci/cam_cci_core.c index 5ee104b457..05e605473a 100644 --- a/drivers/cam_sensor_module/cam_cci/cam_cci_core.c +++ b/drivers/cam_sensor_module/cam_cci/cam_cci_core.c @@ -1506,7 +1506,7 @@ static void cam_cci_write_async_helper(struct work_struct *work) enum cci_i2c_master_t master; struct cam_cci_master_info *cci_master_info; - cam_req_mgr_thread_switch_delay_detect( + cam_req_mgr_thread_switch_delay_detect(CAM_CCI_WORKQUEUE_NAME, write_async->workq_scheduled_ts); cci_dev = write_async->cci_dev; i2c_msg = &write_async->c_ctrl.cfg.cci_i2c_write_cfg; diff --git a/drivers/cam_sensor_module/cam_cci/cam_cci_dev.h b/drivers/cam_sensor_module/cam_cci/cam_cci_dev.h index 70ab65086c..62ba695254 100644 --- a/drivers/cam_sensor_module/cam_cci/cam_cci_dev.h +++ b/drivers/cam_sensor_module/cam_cci/cam_cci_dev.h @@ -57,6 +57,8 @@ #define CAMX_CCI_DEV_NAME "cam-cci-driver" +#define CAM_CCI_WORKQUEUE_NAME "cam_cci_wq" + #define MAX_CCI 2 #define PRIORITY_QUEUE (QUEUE_0) diff --git a/drivers/cam_sensor_module/cam_cci/cam_cci_soc.c b/drivers/cam_sensor_module/cam_cci/cam_cci_soc.c index 22efb46d89..08b9fe1252 100644 --- a/drivers/cam_sensor_module/cam_cci/cam_cci_soc.c +++ b/drivers/cam_sensor_module/cam_cci/cam_cci_soc.c @@ -399,7 +399,7 @@ int cam_cci_parse_dt_info(struct platform_device *pdev, for (i = 0; i < MASTER_MAX; i++) { new_cci_dev->write_wq[i] = create_singlethread_workqueue( - "cam_cci_wq"); + CAM_CCI_WORKQUEUE_NAME); if (!new_cci_dev->write_wq[i]) CAM_ERR(CAM_CCI, "Failed to create write wq"); } diff --git a/drivers/cam_sync/cam_sync_util.c b/drivers/cam_sync/cam_sync_util.c index 84d885c810..adc59abfd6 100644 --- a/drivers/cam_sync/cam_sync_util.c +++ b/drivers/cam_sync/cam_sync_util.c @@ -294,7 +294,7 @@ void cam_sync_util_cb_dispatch(struct work_struct *cb_dispatch_work) cb_dispatch_work); sync_callback sync_data = cb_info->callback_func; - cam_req_mgr_thread_switch_delay_detect( + cam_req_mgr_thread_switch_delay_detect(CAM_SYNC_WORKQUEUE_NAME, cb_info->workq_scheduled_ts); sync_data(cb_info->sync_obj, cb_info->status, cb_info->cb_data);