[PATCH] drm/amdgpu: replace mutex with spin_lock
S, Shirish
sshankar at amd.com
Thu May 31 09:59:57 UTC 2018
On 5/30/2018 9:10 PM, Christian König wrote:
> Keep in mind that under SRIOV you can read registers while in atomic
> context, e.g. while holding a spinlock.
>
> Please double check if that won't bite us.
>
> Apart from that the change looks good to me,
Thanks Christian, i verified boot, s3, s5 on Stoney with this patch.
Have re-spun V2 which has the exact trace in which scenario this BUG is hit.
Regards,
Shirish S
> Christian.
>
> Am 30.05.2018 um 12:19 schrieb Shirish S:
>> mutex's lead to sleeps which should be avoided in
>> atomic context.
>> Hence this patch replaces it with the spin_locks.
>>
>> Signed-off-by: Shirish S <shirish.s at 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..cdfb0d0 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;
>
--
Regards,
Shirish S
More information about the amd-gfx
mailing list