mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 11:01:06 -04:00
drm/amd/display/dcn401: use pre-allocated temp structure for bounding box
This mirrors what the driver does for older DCN generations.
Should fix:
[ 26.924055] BUG: sleeping function called from invalid context at include/linux/sched/mm.h:306
[ 26.924060] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 1022, name: modprobe
[ 26.924063] preempt_count: 2, expected: 0
[ 26.924064] RCU nest depth: 0, expected: 0
[ 26.924066] Preemption disabled at:
[ 26.924067] [<ffffffffc089e5e0>] dc_fpu_begin+0x30/0xd0 [amdgpu]
[ 26.924322] CPU: 9 PID: 1022 Comm: modprobe Not tainted 6.8.0+ #20
[ 26.924325] Hardware name: System manufacturer System Product Name/CROSSHAIR VI HERO, BIOS 6302 10/23/2018
[ 26.924326] Call Trace:
[ 26.924327] <TASK>
[ 26.924329] dump_stack_lvl+0x37/0x50
[ 26.924333] ? dc_fpu_begin+0x30/0xd0 [amdgpu]
[ 26.924589] dump_stack+0x10/0x20
[ 26.924592] __might_resched+0x16a/0x1c0
[ 26.924596] __might_sleep+0x42/0x70
[ 26.924598] __kmalloc_node_track_caller+0x2ad/0x4b0
[ 26.924601] ? dm_helpers_allocate_gpu_mem+0x12/0x20 [amdgpu]
[ 26.924855] ? dcn401_update_bw_bounding_box+0x2a/0xf0 [amdgpu]
[ 26.925122] kmemdup+0x20/0x50
[ 26.925124] ? kernel_fpu_begin_mask+0x6b/0xe0
[ 26.925127] ? kmemdup+0x20/0x50
[ 26.925129] dcn401_update_bw_bounding_box+0x2a/0xf0 [amdgpu]
[ 26.925393] dc_create+0x311/0x670 [amdgpu]
[ 26.925649] amdgpu_dm_init+0x2aa/0x1fa0 [amdgpu]
[ 26.925903] ? irq_work_queue+0x38/0x50
[ 26.925907] ? vprintk_emit+0x1e7/0x270
[ 26.925910] ? dev_printk_emit+0x83/0xb0
[ 26.925914] ? amdgpu_device_rreg+0x17/0x20 [amdgpu]
[ 26.926133] dm_hw_init+0x14/0x30 [amdgpu]
v2: drop extra memcpy
Fixes: 669d6b078e ("drm/amd/display: avoid large on-stack structures")
Reviewed-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Suggested-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: George Zhang <george.zhang@amd.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: harry.wentland@amd.com
Cc: sunpeng.li@amd.com
Cc: Rodrigo.Siqueira@amd.com
This commit is contained in:
@@ -192,15 +192,14 @@ static void init_state(struct dc *dc, struct dc_state *state)
|
||||
/* Public dc_state functions */
|
||||
struct dc_state *dc_state_create(struct dc *dc, struct dc_state_create_params *params)
|
||||
{
|
||||
struct dc_state *state;
|
||||
#ifdef CONFIG_DRM_AMD_DC_FP
|
||||
struct dml2_configuration_options *dml2_opt;
|
||||
struct dml2_configuration_options *dml2_opt = &dc->dml2_tmp;
|
||||
|
||||
dml2_opt = kmemdup(&dc->dml2_options, sizeof(*dml2_opt), GFP_KERNEL);
|
||||
if (!dml2_opt)
|
||||
return NULL;
|
||||
memcpy(dml2_opt, &dc->dml2_options, sizeof(dc->dml2_options));
|
||||
#endif
|
||||
struct dc_state *state = kvzalloc(sizeof(struct dc_state),
|
||||
GFP_KERNEL);
|
||||
|
||||
state = kvzalloc(sizeof(struct dc_state), GFP_KERNEL);
|
||||
|
||||
if (!state)
|
||||
return NULL;
|
||||
@@ -217,8 +216,6 @@ struct dc_state *dc_state_create(struct dc *dc, struct dc_state_create_params *p
|
||||
dml2_opt->use_clock_dc_limits = true;
|
||||
dml2_create(dc, dml2_opt, &state->bw_ctx.dml2_dc_power_source);
|
||||
}
|
||||
|
||||
kfree(dml2_opt);
|
||||
#endif
|
||||
|
||||
kref_init(&state->refcount);
|
||||
|
||||
@@ -1582,11 +1582,9 @@ static struct dc_cap_funcs cap_funcs = {
|
||||
|
||||
static void dcn401_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_params)
|
||||
{
|
||||
struct dml2_configuration_options *dml2_opt;
|
||||
struct dml2_configuration_options *dml2_opt = &dc->dml2_tmp;
|
||||
|
||||
dml2_opt = kmemdup(&dc->dml2_options, sizeof(*dml2_opt), GFP_KERNEL);
|
||||
if (!dml2_opt)
|
||||
return;
|
||||
memcpy(dml2_opt, &dc->dml2_options, sizeof(dc->dml2_options));
|
||||
|
||||
DC_FP_START();
|
||||
|
||||
@@ -1601,8 +1599,6 @@ static void dcn401_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *b
|
||||
dml2_reinit(dc, dml2_opt, &dc->current_state->bw_ctx.dml2_dc_power_source);
|
||||
|
||||
DC_FP_END();
|
||||
|
||||
kfree(dml2_opt);
|
||||
}
|
||||
|
||||
enum dc_status dcn401_patch_unknown_plane_state(struct dc_plane_state *plane_state)
|
||||
|
||||
Reference in New Issue
Block a user