Skip to content

Commit 1f86f41

Browse files
ChristianKoenigAMDalexdeucher
authored andcommitted
drm/amdgpu: stop unmapping MQD for kernel queues v3
This looks unnecessary and actually extremely harmful since using kmap() is not possible while inside the ring reset. Remove all the extra mapping and unmapping of the MQDs. v2: also fix debugfs v3: fix coding style typo Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 510a16d commit 1f86f41

File tree

7 files changed

+67
-432
lines changed

7 files changed

+67
-432
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c

Lines changed: 8 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -608,59 +608,17 @@ static ssize_t amdgpu_debugfs_mqd_read(struct file *f, char __user *buf,
608608
size_t size, loff_t *pos)
609609
{
610610
struct amdgpu_ring *ring = file_inode(f)->i_private;
611-
volatile u32 *mqd;
612-
u32 *kbuf;
613-
int r, i;
614-
uint32_t value, result;
611+
ssize_t bytes = min_t(ssize_t, ring->mqd_size - *pos, size);
612+
void *from = ((u8 *)ring->mqd_ptr) + *pos;
615613

616-
if (*pos & 3 || size & 3)
617-
return -EINVAL;
618-
619-
kbuf = kmalloc(ring->mqd_size, GFP_KERNEL);
620-
if (!kbuf)
621-
return -ENOMEM;
622-
623-
r = amdgpu_bo_reserve(ring->mqd_obj, false);
624-
if (unlikely(r != 0))
625-
goto err_free;
626-
627-
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&mqd);
628-
if (r)
629-
goto err_unreserve;
630-
631-
/*
632-
* Copy to local buffer to avoid put_user(), which might fault
633-
* and acquire mmap_sem, under reservation_ww_class_mutex.
634-
*/
635-
for (i = 0; i < ring->mqd_size/sizeof(u32); i++)
636-
kbuf[i] = mqd[i];
614+
if (*pos > ring->mqd_size)
615+
return 0;
637616

638-
amdgpu_bo_kunmap(ring->mqd_obj);
639-
amdgpu_bo_unreserve(ring->mqd_obj);
617+
if (copy_to_user(buf, from, bytes))
618+
return -EFAULT;
640619

641-
result = 0;
642-
while (size) {
643-
if (*pos >= ring->mqd_size)
644-
break;
645-
646-
value = kbuf[*pos/4];
647-
r = put_user(value, (uint32_t *)buf);
648-
if (r)
649-
goto err_free;
650-
buf += 4;
651-
result += 4;
652-
size -= 4;
653-
*pos += 4;
654-
}
655-
656-
kfree(kbuf);
657-
return result;
658-
659-
err_unreserve:
660-
amdgpu_bo_unreserve(ring->mqd_obj);
661-
err_free:
662-
kfree(kbuf);
663-
return r;
620+
*pos += bytes;
621+
return bytes;
664622
}
665623

666624
static const struct file_operations amdgpu_debugfs_mqd_fops = {

drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c

Lines changed: 11 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -6851,22 +6851,9 @@ static int gfx_v10_0_kgq_init_queue(struct amdgpu_ring *ring, bool reset)
68516851
static int gfx_v10_0_cp_async_gfx_ring_resume(struct amdgpu_device *adev)
68526852
{
68536853
int r, i;
6854-
struct amdgpu_ring *ring;
68556854

68566855
for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
6857-
ring = &adev->gfx.gfx_ring[i];
6858-
6859-
r = amdgpu_bo_reserve(ring->mqd_obj, false);
6860-
if (unlikely(r != 0))
6861-
return r;
6862-
6863-
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
6864-
if (!r) {
6865-
r = gfx_v10_0_kgq_init_queue(ring, false);
6866-
amdgpu_bo_kunmap(ring->mqd_obj);
6867-
ring->mqd_ptr = NULL;
6868-
}
6869-
amdgpu_bo_unreserve(ring->mqd_obj);
6856+
r = gfx_v10_0_kgq_init_queue(&adev->gfx.gfx_ring[i], false);
68706857
if (r)
68716858
return r;
68726859
}
@@ -7173,55 +7160,24 @@ static int gfx_v10_0_kcq_init_queue(struct amdgpu_ring *ring, bool restore)
71737160

71747161
static int gfx_v10_0_kiq_resume(struct amdgpu_device *adev)
71757162
{
7176-
struct amdgpu_ring *ring;
7177-
int r;
7178-
7179-
ring = &adev->gfx.kiq[0].ring;
7180-
7181-
r = amdgpu_bo_reserve(ring->mqd_obj, false);
7182-
if (unlikely(r != 0))
7183-
return r;
7184-
7185-
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
7186-
if (unlikely(r != 0)) {
7187-
amdgpu_bo_unreserve(ring->mqd_obj);
7188-
return r;
7189-
}
7190-
7191-
gfx_v10_0_kiq_init_queue(ring);
7192-
amdgpu_bo_kunmap(ring->mqd_obj);
7193-
ring->mqd_ptr = NULL;
7194-
amdgpu_bo_unreserve(ring->mqd_obj);
7163+
gfx_v10_0_kiq_init_queue(&adev->gfx.kiq[0].ring);
71957164
return 0;
71967165
}
71977166

71987167
static int gfx_v10_0_kcq_resume(struct amdgpu_device *adev)
71997168
{
7200-
struct amdgpu_ring *ring = NULL;
7201-
int r = 0, i;
7169+
int i, r;
72027170

72037171
gfx_v10_0_cp_compute_enable(adev, true);
72047172

72057173
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
7206-
ring = &adev->gfx.compute_ring[i];
7207-
7208-
r = amdgpu_bo_reserve(ring->mqd_obj, false);
7209-
if (unlikely(r != 0))
7210-
goto done;
7211-
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
7212-
if (!r) {
7213-
r = gfx_v10_0_kcq_init_queue(ring, false);
7214-
amdgpu_bo_kunmap(ring->mqd_obj);
7215-
ring->mqd_ptr = NULL;
7216-
}
7217-
amdgpu_bo_unreserve(ring->mqd_obj);
7174+
r = gfx_v10_0_kcq_init_queue(&adev->gfx.compute_ring[i],
7175+
false);
72187176
if (r)
7219-
goto done;
7177+
return r;
72207178
}
72217179

7222-
r = amdgpu_gfx_enable_kcq(adev, 0);
7223-
done:
7224-
return r;
7180+
return amdgpu_gfx_enable_kcq(adev, 0);
72257181
}
72267182

72277183
static int gfx_v10_0_cp_resume(struct amdgpu_device *adev)
@@ -9579,20 +9535,9 @@ static int gfx_v10_0_reset_kgq(struct amdgpu_ring *ring, unsigned int vmid)
95799535
if (r)
95809536
return r;
95819537

9582-
r = amdgpu_bo_reserve(ring->mqd_obj, false);
9583-
if (unlikely(r != 0)) {
9584-
DRM_ERROR("fail to resv mqd_obj\n");
9585-
return r;
9586-
}
9587-
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
9588-
if (!r) {
9589-
r = gfx_v10_0_kgq_init_queue(ring, true);
9590-
amdgpu_bo_kunmap(ring->mqd_obj);
9591-
ring->mqd_ptr = NULL;
9592-
}
9593-
amdgpu_bo_unreserve(ring->mqd_obj);
9538+
r = gfx_v10_0_kgq_init_queue(ring, true);
95949539
if (r) {
9595-
DRM_ERROR("fail to unresv mqd_obj\n");
9540+
DRM_ERROR("fail to init kgq\n");
95969541
return r;
95979542
}
95989543

@@ -9649,20 +9594,9 @@ static int gfx_v10_0_reset_kcq(struct amdgpu_ring *ring,
96499594
return r;
96509595
}
96519596

9652-
r = amdgpu_bo_reserve(ring->mqd_obj, false);
9653-
if (unlikely(r != 0)) {
9654-
dev_err(adev->dev, "fail to resv mqd_obj\n");
9655-
return r;
9656-
}
9657-
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
9658-
if (!r) {
9659-
r = gfx_v10_0_kcq_init_queue(ring, true);
9660-
amdgpu_bo_kunmap(ring->mqd_obj);
9661-
ring->mqd_ptr = NULL;
9662-
}
9663-
amdgpu_bo_unreserve(ring->mqd_obj);
9597+
r = gfx_v10_0_kcq_init_queue(ring, true);
96649598
if (r) {
9665-
dev_err(adev->dev, "fail to unresv mqd_obj\n");
9599+
dev_err(adev->dev, "fail to init kcq\n");
96669600
return r;
96679601
}
96689602

drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c

Lines changed: 10 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -4115,22 +4115,9 @@ static int gfx_v11_0_kgq_init_queue(struct amdgpu_ring *ring, bool reset)
41154115
static int gfx_v11_0_cp_async_gfx_ring_resume(struct amdgpu_device *adev)
41164116
{
41174117
int r, i;
4118-
struct amdgpu_ring *ring;
41194118

41204119
for (i = 0; i < adev->gfx.num_gfx_rings; i++) {
4121-
ring = &adev->gfx.gfx_ring[i];
4122-
4123-
r = amdgpu_bo_reserve(ring->mqd_obj, false);
4124-
if (unlikely(r != 0))
4125-
return r;
4126-
4127-
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
4128-
if (!r) {
4129-
r = gfx_v11_0_kgq_init_queue(ring, false);
4130-
amdgpu_bo_kunmap(ring->mqd_obj);
4131-
ring->mqd_ptr = NULL;
4132-
}
4133-
amdgpu_bo_unreserve(ring->mqd_obj);
4120+
r = gfx_v11_0_kgq_init_queue(&adev->gfx.gfx_ring[i], false);
41344121
if (r)
41354122
return r;
41364123
}
@@ -4452,57 +4439,24 @@ static int gfx_v11_0_kcq_init_queue(struct amdgpu_ring *ring, bool reset)
44524439

44534440
static int gfx_v11_0_kiq_resume(struct amdgpu_device *adev)
44544441
{
4455-
struct amdgpu_ring *ring;
4456-
int r;
4457-
4458-
ring = &adev->gfx.kiq[0].ring;
4459-
4460-
r = amdgpu_bo_reserve(ring->mqd_obj, false);
4461-
if (unlikely(r != 0))
4462-
return r;
4463-
4464-
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
4465-
if (unlikely(r != 0)) {
4466-
amdgpu_bo_unreserve(ring->mqd_obj);
4467-
return r;
4468-
}
4469-
4470-
gfx_v11_0_kiq_init_queue(ring);
4471-
amdgpu_bo_kunmap(ring->mqd_obj);
4472-
ring->mqd_ptr = NULL;
4473-
amdgpu_bo_unreserve(ring->mqd_obj);
4474-
ring->sched.ready = true;
4442+
gfx_v11_0_kiq_init_queue(&adev->gfx.kiq[0].ring);
44754443
return 0;
44764444
}
44774445

44784446
static int gfx_v11_0_kcq_resume(struct amdgpu_device *adev)
44794447
{
4480-
struct amdgpu_ring *ring = NULL;
4481-
int r = 0, i;
4448+
int i, r;
44824449

44834450
if (!amdgpu_async_gfx_ring)
44844451
gfx_v11_0_cp_compute_enable(adev, true);
44854452

44864453
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
4487-
ring = &adev->gfx.compute_ring[i];
4488-
4489-
r = amdgpu_bo_reserve(ring->mqd_obj, false);
4490-
if (unlikely(r != 0))
4491-
goto done;
4492-
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
4493-
if (!r) {
4494-
r = gfx_v11_0_kcq_init_queue(ring, false);
4495-
amdgpu_bo_kunmap(ring->mqd_obj);
4496-
ring->mqd_ptr = NULL;
4497-
}
4498-
amdgpu_bo_unreserve(ring->mqd_obj);
4454+
r = gfx_v11_0_kcq_init_queue(&adev->gfx.compute_ring[i], false);
44994455
if (r)
4500-
goto done;
4456+
return r;
45014457
}
45024458

4503-
r = amdgpu_gfx_enable_kcq(adev, 0);
4504-
done:
4505-
return r;
4459+
return amdgpu_gfx_enable_kcq(adev, 0);
45064460
}
45074461

45084462
static int gfx_v11_0_cp_resume(struct amdgpu_device *adev)
@@ -6667,20 +6621,9 @@ static int gfx_v11_0_reset_kgq(struct amdgpu_ring *ring, unsigned int vmid)
66676621
if (r)
66686622
return r;
66696623

6670-
r = amdgpu_bo_reserve(ring->mqd_obj, false);
6671-
if (unlikely(r != 0)) {
6672-
dev_err(adev->dev, "fail to resv mqd_obj\n");
6673-
return r;
6674-
}
6675-
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
6676-
if (!r) {
6677-
r = gfx_v11_0_kgq_init_queue(ring, true);
6678-
amdgpu_bo_kunmap(ring->mqd_obj);
6679-
ring->mqd_ptr = NULL;
6680-
}
6681-
amdgpu_bo_unreserve(ring->mqd_obj);
6624+
r = gfx_v11_0_kgq_init_queue(ring, true);
66826625
if (r) {
6683-
dev_err(adev->dev, "fail to unresv mqd_obj\n");
6626+
dev_err(adev->dev, "failed to init kgq\n");
66846627
return r;
66856628
}
66866629

@@ -6707,20 +6650,9 @@ static int gfx_v11_0_reset_kcq(struct amdgpu_ring *ring, unsigned int vmid)
67076650
return r;
67086651
}
67096652

6710-
r = amdgpu_bo_reserve(ring->mqd_obj, false);
6711-
if (unlikely(r != 0)) {
6712-
dev_err(adev->dev, "fail to resv mqd_obj\n");
6713-
return r;
6714-
}
6715-
r = amdgpu_bo_kmap(ring->mqd_obj, (void **)&ring->mqd_ptr);
6716-
if (!r) {
6717-
r = gfx_v11_0_kcq_init_queue(ring, true);
6718-
amdgpu_bo_kunmap(ring->mqd_obj);
6719-
ring->mqd_ptr = NULL;
6720-
}
6721-
amdgpu_bo_unreserve(ring->mqd_obj);
6653+
r = gfx_v11_0_kcq_init_queue(ring, true);
67226654
if (r) {
6723-
dev_err(adev->dev, "fail to unresv mqd_obj\n");
6655+
dev_err(adev->dev, "fail to init kcq\n");
67246656
return r;
67256657
}
67266658
r = amdgpu_mes_map_legacy_queue(adev, ring);

0 commit comments

Comments
 (0)