* [RFC PATCH 1/2] drm/amdgpu: Introduce ring lock
@ 2021-09-13 5:55 xinhui pan
2021-09-13 5:55 ` [RFC PATCH 2/2] drm/amdgpu: protect ring from concurrency access xinhui pan
2021-09-13 6:25 ` [RFC PATCH 1/2] drm/amdgpu: Introduce ring lock Christian König
0 siblings, 2 replies; 3+ messages in thread
From: xinhui pan @ 2021-09-13 5:55 UTC (permalink / raw)
To: amd-gfx; +Cc: alexander.deucher, christian.koenig, lijo.lazar, xinhui pan
This is used for direct IB submission to ring.
Signed-off-by: xinhui pan <xinhui.pan@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 2 ++
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 +
2 files changed, 3 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index ab2351ba9574..f97a28a49120 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -184,6 +184,8 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
else if (ring == &adev->sdma.instance[0].page)
sched_hw_submission = 256;
+ mutex_init(&ring->lock);
+
if (ring->adev == NULL) {
if (adev->num_rings >= AMDGPU_MAX_RINGS)
return -EINVAL;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
index 4d380e79752c..544766429b5c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
@@ -215,6 +215,7 @@ struct amdgpu_ring {
struct amdgpu_fence_driver fence_drv;
struct drm_gpu_scheduler sched;
+ struct mutex lock;
struct amdgpu_bo *ring_obj;
volatile uint32_t *ring;
unsigned rptr_offs;
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [RFC PATCH 2/2] drm/amdgpu: protect ring from concurrency access
2021-09-13 5:55 [RFC PATCH 1/2] drm/amdgpu: Introduce ring lock xinhui pan
@ 2021-09-13 5:55 ` xinhui pan
2021-09-13 6:25 ` [RFC PATCH 1/2] drm/amdgpu: Introduce ring lock Christian König
1 sibling, 0 replies; 3+ messages in thread
From: xinhui pan @ 2021-09-13 5:55 UTC (permalink / raw)
To: amd-gfx; +Cc: alexander.deucher, christian.koenig, lijo.lazar, xinhui pan
Park the ring scheduler thread before accessing the ring.
And unpark it only when we finish accessing the ring.
The right sequence should be like below.
lock ring
park ring thread
direct access ring
[unlock ring, do something, lock ring]
unpark ring thread
unlock ring
Signed-off-by: xinhui pan <xinhui.pan@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 30 ++++++---------------
drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 6 +++++
2 files changed, 14 insertions(+), 22 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
index 19323b4cce7b..5138d5b52c9e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
@@ -1349,7 +1349,7 @@ static int amdgpu_debugfs_test_ib_show(struct seq_file *m, void *unused)
{
struct amdgpu_device *adev = (struct amdgpu_device *)m->private;
struct drm_device *dev = adev_to_drm(adev);
- int r = 0, i;
+ int r = 0;
r = pm_runtime_get_sync(dev->dev);
if (r < 0) {
@@ -1362,15 +1362,6 @@ static int amdgpu_debugfs_test_ib_show(struct seq_file *m, void *unused)
if (r)
return r;
- /* hold on the scheduler */
- for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
- struct amdgpu_ring *ring = adev->rings[i];
-
- if (!ring || !ring->sched.thread)
- continue;
- kthread_park(ring->sched.thread);
- }
-
seq_printf(m, "run ib test:\n");
r = amdgpu_ib_ring_tests(adev);
if (r)
@@ -1378,15 +1369,6 @@ static int amdgpu_debugfs_test_ib_show(struct seq_file *m, void *unused)
else
seq_printf(m, "ib ring tests passed.\n");
- /* go on the scheduler */
- for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
- struct amdgpu_ring *ring = adev->rings[i];
-
- if (!ring || !ring->sched.thread)
- continue;
- kthread_unpark(ring->sched.thread);
- }
-
up_read(&adev->reset_sem);
pm_runtime_mark_last_busy(dev->dev);
@@ -1650,13 +1632,14 @@ static int amdgpu_debugfs_ib_preempt(void *data, u64 val)
if (r)
goto pro_end;
- /* stop the scheduler */
- kthread_park(ring->sched.thread);
-
resched = ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
/* preempt the IB */
+ mutex_lock(&ring->lock);
+ /* stop the scheduler */
+ kthread_park(ring->sched.thread);
r = amdgpu_ring_preempt_ib(ring);
+ mutex_unlock(&ring->lock);
if (r) {
DRM_WARN("failed to preempt ring %d\n", ring->idx);
goto failure;
@@ -1686,8 +1669,11 @@ static int amdgpu_debugfs_ib_preempt(void *data, u64 val)
}
failure:
+ /* make sure thread is not unparked accidently. */
+ mutex_lock(&ring->lock);
/* restart the scheduler */
kthread_unpark(ring->sched.thread);
+ mutex_unlock(&ring->lock);
up_read(&adev->reset_sem);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index 9274f32c3661..ea83b3aef8fb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -402,7 +402,13 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)
else
tmo = tmo_gfx;
+ mutex_lock(&ring->lock);
+ if (ring->sched.thread)
+ kthread_park(ring->sched.thread);
r = amdgpu_ring_test_ib(ring, tmo);
+ if (ring->sched.thread)
+ kthread_unpark(ring->sched.thread);
+ mutex_unlock(&ring->lock);
if (!r) {
DRM_DEV_DEBUG(adev->dev, "ib test on %s succeeded\n",
ring->name);
--
2.25.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [RFC PATCH 1/2] drm/amdgpu: Introduce ring lock
2021-09-13 5:55 [RFC PATCH 1/2] drm/amdgpu: Introduce ring lock xinhui pan
2021-09-13 5:55 ` [RFC PATCH 2/2] drm/amdgpu: protect ring from concurrency access xinhui pan
@ 2021-09-13 6:25 ` Christian König
1 sibling, 0 replies; 3+ messages in thread
From: Christian König @ 2021-09-13 6:25 UTC (permalink / raw)
To: xinhui pan, amd-gfx; +Cc: alexander.deucher, lijo.lazar
NAK, that is exactly what we try to avoid here.
Christian.
Am 13.09.21 um 07:55 schrieb xinhui pan:
> This is used for direct IB submission to ring.
>
> Signed-off-by: xinhui pan <xinhui.pan@amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 2 ++
> drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 1 +
> 2 files changed, 3 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> index ab2351ba9574..f97a28a49120 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> @@ -184,6 +184,8 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
> else if (ring == &adev->sdma.instance[0].page)
> sched_hw_submission = 256;
>
> + mutex_init(&ring->lock);
> +
> if (ring->adev == NULL) {
> if (adev->num_rings >= AMDGPU_MAX_RINGS)
> return -EINVAL;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> index 4d380e79752c..544766429b5c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> @@ -215,6 +215,7 @@ struct amdgpu_ring {
> struct amdgpu_fence_driver fence_drv;
> struct drm_gpu_scheduler sched;
>
> + struct mutex lock;
> struct amdgpu_bo *ring_obj;
> volatile uint32_t *ring;
> unsigned rptr_offs;
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-09-13 6:25 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-13 5:55 [RFC PATCH 1/2] drm/amdgpu: Introduce ring lock xinhui pan
2021-09-13 5:55 ` [RFC PATCH 2/2] drm/amdgpu: protect ring from concurrency access xinhui pan
2021-09-13 6:25 ` [RFC PATCH 1/2] drm/amdgpu: Introduce ring lock Christian König
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.