drm/amd/display: Multi display cause system lag on mode change
[Why] DCValidator is created/destroyed repeatedly for cofunctional validation which causes a lot of memory thrashing, particularly when Driver Verifer is enabled. [How] Implement a basic caching algorithm that will cache DCValidator with a matching topology. When a match is found, the DCValidator can be reused. If there is no match, a new one will be created and inserted into the cache if there is space or an unreference entry can be evicted. Signed-off-by: Aric Cyr <aric.cyr@amd.com> Acked-by: Aurabindo Pillai <aurabindo.pillai@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
48e48e5984
commit
e4863f118a
1 changed files with 12 additions and 6 deletions
|
@ -1481,13 +1481,8 @@ bool dc_post_update_surfaces_to_stream(struct dc *dc)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct dc_state *dc_create_state(struct dc *dc)
|
static void init_state(struct dc *dc, struct dc_state *context)
|
||||||
{
|
{
|
||||||
struct dc_state *context = kvzalloc(sizeof(struct dc_state),
|
|
||||||
GFP_KERNEL);
|
|
||||||
|
|
||||||
if (!context)
|
|
||||||
return NULL;
|
|
||||||
/* Each context must have their own instance of VBA and in order to
|
/* Each context must have their own instance of VBA and in order to
|
||||||
* initialize and obtain IP and SOC the base DML instance from DC is
|
* initialize and obtain IP and SOC the base DML instance from DC is
|
||||||
* initially copied into every context
|
* initially copied into every context
|
||||||
|
@ -1495,6 +1490,17 @@ struct dc_state *dc_create_state(struct dc *dc)
|
||||||
#ifdef CONFIG_DRM_AMD_DC_DCN
|
#ifdef CONFIG_DRM_AMD_DC_DCN
|
||||||
memcpy(&context->bw_ctx.dml, &dc->dml, sizeof(struct display_mode_lib));
|
memcpy(&context->bw_ctx.dml, &dc->dml, sizeof(struct display_mode_lib));
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
struct dc_state *dc_create_state(struct dc *dc)
|
||||||
|
{
|
||||||
|
struct dc_state *context = kzalloc(sizeof(struct dc_state),
|
||||||
|
GFP_KERNEL);
|
||||||
|
|
||||||
|
if (!context)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
init_state(dc, context);
|
||||||
|
|
||||||
kref_init(&context->refcount);
|
kref_init(&context->refcount);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue