msm: camera: reqmgr: Update the logic for workqueue congestion detection

This change uses half frame interval as workqueue congestion
detection threshold and record the last trigger time before
sending req, we can get correct last tirgger time in this way.

CRs-Fixed: 3237172
Change-Id: I2d583f7758062340fe6b0c598bfa7e90f49211c2
Signed-off-by: Depeng Shao <quic_depengs@quicinc.com>
This commit is contained in:
Depeng Shao
2022-07-09 16:11:08 +08:00
committed by Camera Software Integration
parent e3e48ebd35
commit 9259524769
3 changed files with 19 additions and 10 deletions

View File

@@ -1871,6 +1871,7 @@ static int __cam_req_mgr_process_req(struct cam_req_mgr_core_link *link,
int rc = 0, idx, i;
int reset_step = 0;
uint32_t trigger = trigger_data->trigger;
uint64_t wq_sched_timeout = 0;
struct cam_req_mgr_slot *slot = NULL;
struct cam_req_mgr_req_queue *in_q;
struct cam_req_mgr_core_session *session;
@@ -1944,13 +1945,26 @@ static int __cam_req_mgr_process_req(struct cam_req_mgr_core_link *link,
link->prev_sof_timestamp = link->sof_timestamp;
link->sof_timestamp = trigger_data->sof_timestamp_val;
/* Use half frame interval to detect the WQ congestion */
wq_sched_timeout = CAM_REQ_MGR_HALF_FRAME_DURATION(link->sof_timestamp -
link->prev_sof_timestamp) / CAM_COMMON_NS_PER_MS;
/* Check for WQ congestion */
if (jiffies_to_msecs(jiffies -
link->last_sof_trigger_jiffies) <
MINIMUM_WORKQUEUE_SCHED_TIME_IN_MS)
wq_sched_timeout)
link->wq_congestion = true;
else
link->wq_congestion = false;
/*
* Only update the jiffies for SOF trigger,
* since it is used to protect from
* applying fails in ISP which is triggered at SOF.
*/
if (trigger == CAM_TRIGGER_POINT_SOF)
link->last_sof_trigger_jiffies = jiffies;
}
if (slot->status != CRM_SLOT_STATUS_REQ_READY) {
@@ -2137,13 +2151,6 @@ static int __cam_req_mgr_process_req(struct cam_req_mgr_core_link *link,
}
}
end:
/*
* Only update the jiffies for SOF trigger,
* since it is used to protect from
* applying fails in ISP which is triggered at SOF.
*/
if (trigger == CAM_TRIGGER_POINT_SOF)
link->last_sof_trigger_jiffies = jiffies;
mutex_unlock(&session->lock);
return rc;
}

View File

@@ -41,12 +41,12 @@
#define MAXIMUM_RETRY_ATTEMPTS 3
#define MINIMUM_WORKQUEUE_SCHED_TIME_IN_MS 5
#define VERSION_1 1
#define VERSION_2 2
#define CAM_REQ_MGR_MAX_TRIGGERS 2
#define CAM_REQ_MGR_HALF_FRAME_DURATION(frame_duration) (frame_duration / 2)
/**
* enum crm_req_eof_trigger_type
* @codes: to identify which type of eof trigger for next slot

View File

@@ -29,6 +29,8 @@
#define CAM_COMMON_ICP_NODE "IPE"
#define CAM_COMMON_JPEG_NODE "JPEG"
#define CAM_COMMON_NS_PER_MS 1000000ULL
#define PTR_TO_U64(ptr) ((uint64_t)(uintptr_t)ptr)
#define U64_TO_PTR(ptr) ((void *)(uintptr_t)ptr)