On 6/22/2018 9:00 AM, Dave Airlie wrote:
On 31 May 2018 at 20:02, Shirish S <shiris...@amd.com> wrote:
mutex's lead to sleeps which should be avoided in
atomic context.
Hence this patch replaces it with the spin_locks.
Below is the stack trace:
I'm not sure I really like this series of patches, going around
replacing ATOMIC and mutex with spinlocks
isn't something that should be done lightly,
In all the patches I haven't seen what spin lock or what causes us to
be in an atomic state in the first
place and why it is necessary that we are in an atomic state for such
long sequences of code.
We have root caused the issue and reverted all the patches in this patch
series that tend to replace
mutex's with spinlock's.
Regards,
Shirish S
Thanks,
Dave.
BUG: sleeping function called from invalid context at kernel/locking/mutex.c:**
in_atomic(): 1, irqs_disabled(): 1, pid: 89, name: kworker/u4:3
CPU: 1 PID: 89 Comm: kworker/u4:3 Tainted: G W 4.14.43 #8
Workqueue: events_unbound commit_work
Call Trace:
dump_stack+0x4d/0x63
___might_sleep+0x11f/0x12e
mutex_lock+0x20/0x42
amdgpu_atom_execute_table+0x26/0x72
enable_disp_power_gating_v2_1+0x85/0xae
dce110_enable_display_power_gating+0x83/0x1b1
dce110_power_down_fe+0x4a/0x6d
dc_post_update_surfaces_to_stream+0x59/0x87
amdgpu_dm_do_flip+0x239/0x298
amdgpu_dm_commit_planes.isra.23+0x379/0x54b
? drm_calc_timestamping_constants+0x14b/0x15c
amdgpu_dm_atomic_commit_tail+0x4fc/0x5d2
? wait_for_common+0x5b/0x69
commit_tail+0x42/0x64
process_one_work+0x1b0/0x314
worker_thread+0x1cb/0x2c1
? create_worker+0x1da/0x1da
kthread+0x156/0x15e
? kthread_flush_work+0xea/0xea
ret_from_fork+0x22/0x40
V2: Added stack trace in commit message.
Signed-off-by: Shirish S <shiris...@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c | 2 +-
drivers/gpu/drm/amd/amdgpu/atom.c | 4 ++--
drivers/gpu/drm/amd/amdgpu/atom.h | 3 ++-
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
index bf872f6..ba3d4b9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
@@ -2033,7 +2033,7 @@ int amdgpu_atombios_init(struct amdgpu_device *adev)
return -ENOMEM;
}
- mutex_init(&adev->mode_info.atom_context->mutex);
+ spin_lock_init(&adev->mode_info.atom_context->lock);
if (adev->is_atom_fw) {
amdgpu_atomfirmware_scratch_regs_init(adev);
amdgpu_atomfirmware_allocate_fb_scratch(adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/atom.c
b/drivers/gpu/drm/amd/amdgpu/atom.c
index 69500a8..bfd98f0 100644
--- a/drivers/gpu/drm/amd/amdgpu/atom.c
+++ b/drivers/gpu/drm/amd/amdgpu/atom.c
@@ -1261,7 +1261,7 @@ int amdgpu_atom_execute_table(struct atom_context *ctx,
int index, uint32_t * pa
{
int r;
- mutex_lock(&ctx->mutex);
+ spin_lock(&ctx->lock);
/* reset data block */
ctx->data_block = 0;
/* reset reg block */
@@ -1274,7 +1274,7 @@ int amdgpu_atom_execute_table(struct atom_context *ctx,
int index, uint32_t * pa
ctx->divmul[0] = 0;
ctx->divmul[1] = 0;
r = amdgpu_atom_execute_table_locked(ctx, index, params);
- mutex_unlock(&ctx->mutex);
+ spin_unlock(&ctx->lock);
return r;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/atom.h
b/drivers/gpu/drm/amd/amdgpu/atom.h
index a391709..54063e2 100644
--- a/drivers/gpu/drm/amd/amdgpu/atom.h
+++ b/drivers/gpu/drm/amd/amdgpu/atom.h
@@ -26,6 +26,7 @@
#define ATOM_H
#include <linux/types.h>
+#include <linux/spinlock_types.h>
#include <drm/drmP.h>
#define ATOM_BIOS_MAGIC 0xAA55
@@ -125,7 +126,7 @@ struct card_info {
struct atom_context {
struct card_info *card;
- struct mutex mutex;
+ spinlock_t lock;
void *bios;
uint32_t cmd_table, data_table;
uint16_t *iio;
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
--
Regards,
Shirish S
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx