drm/amd/display: Add scoped mutexes for amdgpu_dm_dhcp
[ Upstream commit 6b675ab8efbf2bcee25be29e865455c56e246401 ] [Why] Guards automatically release mutex when it goes out of scope making code easier to follow. [How] Replace all use of mutex_lock()/mutex_unlock() with guard(mutex). Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Tom Chung <chiahsuan.chung@amd.com> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Stable-dep-of: be593d9d91c5 ("drm/amd/display: Fix slab-use-after-free in hdcp") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
e1eea69858
commit
75096780a4
@@ -172,7 +172,7 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
|
|||||||
struct mod_hdcp_display_adjustment display_adjust;
|
struct mod_hdcp_display_adjustment display_adjust;
|
||||||
unsigned int conn_index = aconnector->base.index;
|
unsigned int conn_index = aconnector->base.index;
|
||||||
|
|
||||||
mutex_lock(&hdcp_w->mutex);
|
guard(mutex)(&hdcp_w->mutex);
|
||||||
hdcp_w->aconnector[conn_index] = aconnector;
|
hdcp_w->aconnector[conn_index] = aconnector;
|
||||||
|
|
||||||
memset(&link_adjust, 0, sizeof(link_adjust));
|
memset(&link_adjust, 0, sizeof(link_adjust));
|
||||||
@@ -209,7 +209,6 @@ void hdcp_update_display(struct hdcp_workqueue *hdcp_work,
|
|||||||
mod_hdcp_update_display(&hdcp_w->hdcp, conn_index, &link_adjust, &display_adjust, &hdcp_w->output);
|
mod_hdcp_update_display(&hdcp_w->hdcp, conn_index, &link_adjust, &display_adjust, &hdcp_w->output);
|
||||||
|
|
||||||
process_output(hdcp_w);
|
process_output(hdcp_w);
|
||||||
mutex_unlock(&hdcp_w->mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hdcp_remove_display(struct hdcp_workqueue *hdcp_work,
|
static void hdcp_remove_display(struct hdcp_workqueue *hdcp_work,
|
||||||
@@ -220,7 +219,7 @@ static void hdcp_remove_display(struct hdcp_workqueue *hdcp_work,
|
|||||||
struct drm_connector_state *conn_state = aconnector->base.state;
|
struct drm_connector_state *conn_state = aconnector->base.state;
|
||||||
unsigned int conn_index = aconnector->base.index;
|
unsigned int conn_index = aconnector->base.index;
|
||||||
|
|
||||||
mutex_lock(&hdcp_w->mutex);
|
guard(mutex)(&hdcp_w->mutex);
|
||||||
hdcp_w->aconnector[conn_index] = aconnector;
|
hdcp_w->aconnector[conn_index] = aconnector;
|
||||||
|
|
||||||
/* the removal of display will invoke auth reset -> hdcp destroy and
|
/* the removal of display will invoke auth reset -> hdcp destroy and
|
||||||
@@ -239,7 +238,6 @@ static void hdcp_remove_display(struct hdcp_workqueue *hdcp_work,
|
|||||||
mod_hdcp_remove_display(&hdcp_w->hdcp, aconnector->base.index, &hdcp_w->output);
|
mod_hdcp_remove_display(&hdcp_w->hdcp, aconnector->base.index, &hdcp_w->output);
|
||||||
|
|
||||||
process_output(hdcp_w);
|
process_output(hdcp_w);
|
||||||
mutex_unlock(&hdcp_w->mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void hdcp_reset_display(struct hdcp_workqueue *hdcp_work, unsigned int link_index)
|
void hdcp_reset_display(struct hdcp_workqueue *hdcp_work, unsigned int link_index)
|
||||||
@@ -247,7 +245,7 @@ void hdcp_reset_display(struct hdcp_workqueue *hdcp_work, unsigned int link_inde
|
|||||||
struct hdcp_workqueue *hdcp_w = &hdcp_work[link_index];
|
struct hdcp_workqueue *hdcp_w = &hdcp_work[link_index];
|
||||||
unsigned int conn_index;
|
unsigned int conn_index;
|
||||||
|
|
||||||
mutex_lock(&hdcp_w->mutex);
|
guard(mutex)(&hdcp_w->mutex);
|
||||||
|
|
||||||
mod_hdcp_reset_connection(&hdcp_w->hdcp, &hdcp_w->output);
|
mod_hdcp_reset_connection(&hdcp_w->hdcp, &hdcp_w->output);
|
||||||
|
|
||||||
@@ -259,8 +257,6 @@ void hdcp_reset_display(struct hdcp_workqueue *hdcp_work, unsigned int link_inde
|
|||||||
}
|
}
|
||||||
|
|
||||||
process_output(hdcp_w);
|
process_output(hdcp_w);
|
||||||
|
|
||||||
mutex_unlock(&hdcp_w->mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void hdcp_handle_cpirq(struct hdcp_workqueue *hdcp_work, unsigned int link_index)
|
void hdcp_handle_cpirq(struct hdcp_workqueue *hdcp_work, unsigned int link_index)
|
||||||
@@ -277,7 +273,7 @@ static void event_callback(struct work_struct *work)
|
|||||||
hdcp_work = container_of(to_delayed_work(work), struct hdcp_workqueue,
|
hdcp_work = container_of(to_delayed_work(work), struct hdcp_workqueue,
|
||||||
callback_dwork);
|
callback_dwork);
|
||||||
|
|
||||||
mutex_lock(&hdcp_work->mutex);
|
guard(mutex)(&hdcp_work->mutex);
|
||||||
|
|
||||||
cancel_delayed_work(&hdcp_work->callback_dwork);
|
cancel_delayed_work(&hdcp_work->callback_dwork);
|
||||||
|
|
||||||
@@ -285,8 +281,6 @@ static void event_callback(struct work_struct *work)
|
|||||||
&hdcp_work->output);
|
&hdcp_work->output);
|
||||||
|
|
||||||
process_output(hdcp_work);
|
process_output(hdcp_work);
|
||||||
|
|
||||||
mutex_unlock(&hdcp_work->mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void event_property_update(struct work_struct *work)
|
static void event_property_update(struct work_struct *work)
|
||||||
@@ -323,7 +317,7 @@ static void event_property_update(struct work_struct *work)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
|
drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
|
||||||
mutex_lock(&hdcp_work->mutex);
|
guard(mutex)(&hdcp_work->mutex);
|
||||||
|
|
||||||
if (conn_state->commit) {
|
if (conn_state->commit) {
|
||||||
ret = wait_for_completion_interruptible_timeout(&conn_state->commit->hw_done,
|
ret = wait_for_completion_interruptible_timeout(&conn_state->commit->hw_done,
|
||||||
@@ -355,7 +349,6 @@ static void event_property_update(struct work_struct *work)
|
|||||||
drm_hdcp_update_content_protection(connector,
|
drm_hdcp_update_content_protection(connector,
|
||||||
DRM_MODE_CONTENT_PROTECTION_DESIRED);
|
DRM_MODE_CONTENT_PROTECTION_DESIRED);
|
||||||
}
|
}
|
||||||
mutex_unlock(&hdcp_work->mutex);
|
|
||||||
drm_modeset_unlock(&dev->mode_config.connection_mutex);
|
drm_modeset_unlock(&dev->mode_config.connection_mutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -368,7 +361,7 @@ static void event_property_validate(struct work_struct *work)
|
|||||||
struct amdgpu_dm_connector *aconnector;
|
struct amdgpu_dm_connector *aconnector;
|
||||||
unsigned int conn_index;
|
unsigned int conn_index;
|
||||||
|
|
||||||
mutex_lock(&hdcp_work->mutex);
|
guard(mutex)(&hdcp_work->mutex);
|
||||||
|
|
||||||
for (conn_index = 0; conn_index < AMDGPU_DM_MAX_DISPLAY_INDEX;
|
for (conn_index = 0; conn_index < AMDGPU_DM_MAX_DISPLAY_INDEX;
|
||||||
conn_index++) {
|
conn_index++) {
|
||||||
@@ -408,8 +401,6 @@ static void event_property_validate(struct work_struct *work)
|
|||||||
schedule_work(&hdcp_work->property_update_work);
|
schedule_work(&hdcp_work->property_update_work);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&hdcp_work->mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void event_watchdog_timer(struct work_struct *work)
|
static void event_watchdog_timer(struct work_struct *work)
|
||||||
@@ -420,7 +411,7 @@ static void event_watchdog_timer(struct work_struct *work)
|
|||||||
struct hdcp_workqueue,
|
struct hdcp_workqueue,
|
||||||
watchdog_timer_dwork);
|
watchdog_timer_dwork);
|
||||||
|
|
||||||
mutex_lock(&hdcp_work->mutex);
|
guard(mutex)(&hdcp_work->mutex);
|
||||||
|
|
||||||
cancel_delayed_work(&hdcp_work->watchdog_timer_dwork);
|
cancel_delayed_work(&hdcp_work->watchdog_timer_dwork);
|
||||||
|
|
||||||
@@ -429,8 +420,6 @@ static void event_watchdog_timer(struct work_struct *work)
|
|||||||
&hdcp_work->output);
|
&hdcp_work->output);
|
||||||
|
|
||||||
process_output(hdcp_work);
|
process_output(hdcp_work);
|
||||||
|
|
||||||
mutex_unlock(&hdcp_work->mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void event_cpirq(struct work_struct *work)
|
static void event_cpirq(struct work_struct *work)
|
||||||
@@ -439,13 +428,11 @@ static void event_cpirq(struct work_struct *work)
|
|||||||
|
|
||||||
hdcp_work = container_of(work, struct hdcp_workqueue, cpirq_work);
|
hdcp_work = container_of(work, struct hdcp_workqueue, cpirq_work);
|
||||||
|
|
||||||
mutex_lock(&hdcp_work->mutex);
|
guard(mutex)(&hdcp_work->mutex);
|
||||||
|
|
||||||
mod_hdcp_process_event(&hdcp_work->hdcp, MOD_HDCP_EVENT_CPIRQ, &hdcp_work->output);
|
mod_hdcp_process_event(&hdcp_work->hdcp, MOD_HDCP_EVENT_CPIRQ, &hdcp_work->output);
|
||||||
|
|
||||||
process_output(hdcp_work);
|
process_output(hdcp_work);
|
||||||
|
|
||||||
mutex_unlock(&hdcp_work->mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void hdcp_destroy(struct kobject *kobj, struct hdcp_workqueue *hdcp_work)
|
void hdcp_destroy(struct kobject *kobj, struct hdcp_workqueue *hdcp_work)
|
||||||
@@ -479,7 +466,7 @@ static bool enable_assr(void *handle, struct dc_link *link)
|
|||||||
|
|
||||||
dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.context.mem_context.shared_buf;
|
dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.context.mem_context.shared_buf;
|
||||||
|
|
||||||
mutex_lock(&psp->dtm_context.mutex);
|
guard(mutex)(&psp->dtm_context.mutex);
|
||||||
memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
|
memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
|
||||||
|
|
||||||
dtm_cmd->cmd_id = TA_DTM_COMMAND__TOPOLOGY_ASSR_ENABLE;
|
dtm_cmd->cmd_id = TA_DTM_COMMAND__TOPOLOGY_ASSR_ENABLE;
|
||||||
@@ -494,8 +481,6 @@ static bool enable_assr(void *handle, struct dc_link *link)
|
|||||||
res = false;
|
res = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&psp->dtm_context.mutex);
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -557,13 +542,11 @@ static void update_config(void *handle, struct cp_psp_stream_config *config)
|
|||||||
(!!aconnector->base.state) ?
|
(!!aconnector->base.state) ?
|
||||||
aconnector->base.state->hdcp_content_type : -1);
|
aconnector->base.state->hdcp_content_type : -1);
|
||||||
|
|
||||||
mutex_lock(&hdcp_w->mutex);
|
guard(mutex)(&hdcp_w->mutex);
|
||||||
|
|
||||||
mod_hdcp_add_display(&hdcp_w->hdcp, link, display, &hdcp_w->output);
|
mod_hdcp_add_display(&hdcp_w->hdcp, link, display, &hdcp_w->output);
|
||||||
|
|
||||||
process_output(hdcp_w);
|
process_output(hdcp_w);
|
||||||
mutex_unlock(&hdcp_w->mutex);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user