dri-devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm/amdkfd: destroy mqd when destroying kernel queue
@ 2015-03-10 13:21 Oded Gabbay
  2015-03-10 13:21 ` [PATCH 2/2] drm/amdkfd: Fix SDMA queue init. in non-HWS mode Oded Gabbay
  2015-03-10 14:03 ` [PATCH 1/2] drm/amdkfd: destroy mqd when destroying kernel queue Alex Deucher
  0 siblings, 2 replies; 3+ messages in thread
From: Oded Gabbay @ 2015-03-10 13:21 UTC (permalink / raw)
  To: dri-devel

From: Ben Goz <ben.goz@amd.com>

This patch adds a missing destruction of mqd, when destroying a kernel queue.
Without the destruction, there is a memory leakage when repeatedly creating and
destroying kernel queues.

Signed-off-by: Ben Goz <ben.goz@amd.com>
Signed-off-by: Oded Gabbay <oded.gabbay@amd.com>
---
 drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
index e415a2a..c7d298e 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
@@ -44,7 +44,7 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
 	BUG_ON(!kq || !dev);
 	BUG_ON(type != KFD_QUEUE_TYPE_DIQ && type != KFD_QUEUE_TYPE_HIQ);
 
-	pr_debug("kfd: In func %s initializing queue type %d size %d\n",
+	pr_debug("amdkfd: In func %s initializing queue type %d size %d\n",
 			__func__, KFD_QUEUE_TYPE_HIQ, queue_size);
 
 	nop.opcode = IT_NOP;
@@ -69,12 +69,16 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
 
 	prop.doorbell_ptr = kfd_get_kernel_doorbell(dev, &prop.doorbell_off);
 
-	if (prop.doorbell_ptr == NULL)
+	if (prop.doorbell_ptr == NULL) {
+		pr_err("amdkfd: error init doorbell");
 		goto err_get_kernel_doorbell;
+	}
 
 	retval = kfd_gtt_sa_allocate(dev, queue_size, &kq->pq);
-	if (retval != 0)
+	if (retval != 0) {
+		pr_err("amdkfd: error init pq queues size (%d)\n", queue_size);
 		goto err_pq_allocate_vidmem;
+	}
 
 	kq->pq_kernel_addr = kq->pq->cpu_ptr;
 	kq->pq_gpu_addr = kq->pq->gpu_addr;
@@ -165,10 +169,8 @@ err_rptr_allocate_vidmem:
 err_eop_allocate_vidmem:
 	kfd_gtt_sa_free(dev, kq->pq);
 err_pq_allocate_vidmem:
-	pr_err("kfd: error init pq\n");
 	kfd_release_kernel_doorbell(dev, prop.doorbell_ptr);
 err_get_kernel_doorbell:
-	pr_err("kfd: error init doorbell");
 	return false;
 
 }
@@ -187,6 +189,8 @@ static void uninitialize(struct kernel_queue *kq)
 	else if (kq->queue->properties.type == KFD_QUEUE_TYPE_DIQ)
 		kfd_gtt_sa_free(kq->dev, kq->fence_mem_obj);
 
+	kq->mqd->uninit_mqd(kq->mqd, kq->queue->mqd, kq->queue->mqd_mem_obj);
+
 	kfd_gtt_sa_free(kq->dev, kq->rptr_mem);
 	kfd_gtt_sa_free(kq->dev, kq->wptr_mem);
 	kq->ops_asic_specific.uninitialize(kq);
@@ -211,7 +215,7 @@ static int acquire_packet_buffer(struct kernel_queue *kq,
 	queue_address = (unsigned int *)kq->pq_kernel_addr;
 	queue_size_dwords = kq->queue->properties.queue_size / sizeof(uint32_t);
 
-	pr_debug("kfd: In func %s\nrptr: %d\nwptr: %d\nqueue_address 0x%p\n",
+	pr_debug("amdkfd: In func %s\nrptr: %d\nwptr: %d\nqueue_address 0x%p\n",
 			__func__, rptr, wptr, queue_address);
 
 	available_size = (rptr - 1 - wptr + queue_size_dwords) %
@@ -296,7 +300,7 @@ struct kernel_queue *kernel_queue_init(struct kfd_dev *dev,
 	}
 
 	if (kq->ops.initialize(kq, dev, type, KFD_KERNEL_QUEUE_SIZE) == false) {
-		pr_err("kfd: failed to init kernel queue\n");
+		pr_err("amdkfd: failed to init kernel queue\n");
 		kfree(kq);
 		return NULL;
 	}
@@ -319,7 +323,7 @@ static __attribute__((unused)) void test_kq(struct kfd_dev *dev)
 
 	BUG_ON(!dev);
 
-	pr_err("kfd: starting kernel queue test\n");
+	pr_err("amdkfd: starting kernel queue test\n");
 
 	kq = kernel_queue_init(dev, KFD_QUEUE_TYPE_HIQ);
 	BUG_ON(!kq);
@@ -330,7 +334,7 @@ static __attribute__((unused)) void test_kq(struct kfd_dev *dev)
 		buffer[i] = kq->nop_packet;
 	kq->ops.submit_packet(kq);
 
-	pr_err("kfd: ending kernel queue test\n");
+	pr_err("amdkfd: ending kernel queue test\n");
 }
 
 
-- 
1.9.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] drm/amdkfd: Fix SDMA queue init. in non-HWS mode
  2015-03-10 13:21 [PATCH 1/2] drm/amdkfd: destroy mqd when destroying kernel queue Oded Gabbay
@ 2015-03-10 13:21 ` Oded Gabbay
  2015-03-10 14:03 ` [PATCH 1/2] drm/amdkfd: destroy mqd when destroying kernel queue Alex Deucher
  1 sibling, 0 replies; 3+ messages in thread
From: Oded Gabbay @ 2015-03-10 13:21 UTC (permalink / raw)
  To: dri-devel

From: Ben Goz <ben.goz@amd.com>

This patch fixes the SDMA queue initialization, when running in non-HWS mode.

The first fix is to move the initialization of SDMA VM parameters before the
initialization of the SDMA MQD.

The second fix is to load the MQD to an HQD after the initialization of the MQD.

Signed-off-by: Ben Goz <ben.goz@amd.com>
Signed-off-by: Oded Gabbay <oded.gabbay@amd.com>
---
 drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index 910ff8a..d8135ad 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -645,6 +645,7 @@ static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm,
 	pr_debug("     sdma queue id: %d\n", q->properties.sdma_queue_id);
 	pr_debug("     sdma engine id: %d\n", q->properties.sdma_engine_id);
 
+	init_sdma_vm(dqm, q, qpd);
 	retval = mqd->init_mqd(mqd, &q->mqd, &q->mqd_mem_obj,
 				&q->gart_mqd_addr, &q->properties);
 	if (retval != 0) {
@@ -652,7 +653,14 @@ static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm,
 		return retval;
 	}
 
-	init_sdma_vm(dqm, q, qpd);
+	retval = mqd->load_mqd(mqd, q->mqd, 0,
+				0, NULL);
+	if (retval != 0) {
+		deallocate_sdma_queue(dqm, q->sdma_id);
+		mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj);
+		return retval;
+	}
+
 	return 0;
 }
 
-- 
1.9.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 1/2] drm/amdkfd: destroy mqd when destroying kernel queue
  2015-03-10 13:21 [PATCH 1/2] drm/amdkfd: destroy mqd when destroying kernel queue Oded Gabbay
  2015-03-10 13:21 ` [PATCH 2/2] drm/amdkfd: Fix SDMA queue init. in non-HWS mode Oded Gabbay
@ 2015-03-10 14:03 ` Alex Deucher
  1 sibling, 0 replies; 3+ messages in thread
From: Alex Deucher @ 2015-03-10 14:03 UTC (permalink / raw)
  To: Oded Gabbay; +Cc: Maling list - DRI developers

On Tue, Mar 10, 2015 at 9:21 AM, Oded Gabbay <oded.gabbay@amd.com> wrote:
> From: Ben Goz <ben.goz@amd.com>
>
> This patch adds a missing destruction of mqd, when destroying a kernel queue.
> Without the destruction, there is a memory leakage when repeatedly creating and
> destroying kernel queues.
>
> Signed-off-by: Ben Goz <ben.goz@amd.com>
> Signed-off-by: Oded Gabbay <oded.gabbay@amd.com>

For the series:

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

> ---
>  drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c | 22 +++++++++++++---------
>  1 file changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
> index e415a2a..c7d298e 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
> @@ -44,7 +44,7 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
>         BUG_ON(!kq || !dev);
>         BUG_ON(type != KFD_QUEUE_TYPE_DIQ && type != KFD_QUEUE_TYPE_HIQ);
>
> -       pr_debug("kfd: In func %s initializing queue type %d size %d\n",
> +       pr_debug("amdkfd: In func %s initializing queue type %d size %d\n",
>                         __func__, KFD_QUEUE_TYPE_HIQ, queue_size);
>
>         nop.opcode = IT_NOP;
> @@ -69,12 +69,16 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
>
>         prop.doorbell_ptr = kfd_get_kernel_doorbell(dev, &prop.doorbell_off);
>
> -       if (prop.doorbell_ptr == NULL)
> +       if (prop.doorbell_ptr == NULL) {
> +               pr_err("amdkfd: error init doorbell");
>                 goto err_get_kernel_doorbell;
> +       }
>
>         retval = kfd_gtt_sa_allocate(dev, queue_size, &kq->pq);
> -       if (retval != 0)
> +       if (retval != 0) {
> +               pr_err("amdkfd: error init pq queues size (%d)\n", queue_size);
>                 goto err_pq_allocate_vidmem;
> +       }
>
>         kq->pq_kernel_addr = kq->pq->cpu_ptr;
>         kq->pq_gpu_addr = kq->pq->gpu_addr;
> @@ -165,10 +169,8 @@ err_rptr_allocate_vidmem:
>  err_eop_allocate_vidmem:
>         kfd_gtt_sa_free(dev, kq->pq);
>  err_pq_allocate_vidmem:
> -       pr_err("kfd: error init pq\n");
>         kfd_release_kernel_doorbell(dev, prop.doorbell_ptr);
>  err_get_kernel_doorbell:
> -       pr_err("kfd: error init doorbell");
>         return false;
>
>  }
> @@ -187,6 +189,8 @@ static void uninitialize(struct kernel_queue *kq)
>         else if (kq->queue->properties.type == KFD_QUEUE_TYPE_DIQ)
>                 kfd_gtt_sa_free(kq->dev, kq->fence_mem_obj);
>
> +       kq->mqd->uninit_mqd(kq->mqd, kq->queue->mqd, kq->queue->mqd_mem_obj);
> +
>         kfd_gtt_sa_free(kq->dev, kq->rptr_mem);
>         kfd_gtt_sa_free(kq->dev, kq->wptr_mem);
>         kq->ops_asic_specific.uninitialize(kq);
> @@ -211,7 +215,7 @@ static int acquire_packet_buffer(struct kernel_queue *kq,
>         queue_address = (unsigned int *)kq->pq_kernel_addr;
>         queue_size_dwords = kq->queue->properties.queue_size / sizeof(uint32_t);
>
> -       pr_debug("kfd: In func %s\nrptr: %d\nwptr: %d\nqueue_address 0x%p\n",
> +       pr_debug("amdkfd: In func %s\nrptr: %d\nwptr: %d\nqueue_address 0x%p\n",
>                         __func__, rptr, wptr, queue_address);
>
>         available_size = (rptr - 1 - wptr + queue_size_dwords) %
> @@ -296,7 +300,7 @@ struct kernel_queue *kernel_queue_init(struct kfd_dev *dev,
>         }
>
>         if (kq->ops.initialize(kq, dev, type, KFD_KERNEL_QUEUE_SIZE) == false) {
> -               pr_err("kfd: failed to init kernel queue\n");
> +               pr_err("amdkfd: failed to init kernel queue\n");
>                 kfree(kq);
>                 return NULL;
>         }
> @@ -319,7 +323,7 @@ static __attribute__((unused)) void test_kq(struct kfd_dev *dev)
>
>         BUG_ON(!dev);
>
> -       pr_err("kfd: starting kernel queue test\n");
> +       pr_err("amdkfd: starting kernel queue test\n");
>
>         kq = kernel_queue_init(dev, KFD_QUEUE_TYPE_HIQ);
>         BUG_ON(!kq);
> @@ -330,7 +334,7 @@ static __attribute__((unused)) void test_kq(struct kfd_dev *dev)
>                 buffer[i] = kq->nop_packet;
>         kq->ops.submit_packet(kq);
>
> -       pr_err("kfd: ending kernel queue test\n");
> +       pr_err("amdkfd: ending kernel queue test\n");
>  }
>
>
> --
> 1.9.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-03-10 14:03 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-03-10 13:21 [PATCH 1/2] drm/amdkfd: destroy mqd when destroying kernel queue Oded Gabbay
2015-03-10 13:21 ` [PATCH 2/2] drm/amdkfd: Fix SDMA queue init. in non-HWS mode Oded Gabbay
2015-03-10 14:03 ` [PATCH 1/2] drm/amdkfd: destroy mqd when destroying kernel queue Alex Deucher

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox