[1/4] drm/amdgpu: Add helper to wait for a reservation using a sync object

Submitted by Kuehling, Felix on Feb. 7, 2019, 7:53 p.m.

Details

Message ID 1549569222-13251-1-git-send-email-Felix.Kuehling@amd.com
State New
Series "Series without cover letter"
Headers show

Commit Message

Kuehling, Felix Feb. 7, 2019, 7:53 p.m.
Creates a temporary sync object to wait for the reservation. This
generalizes amdgpu_vm_wait_pd.

Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 25 +++++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h |  3 +++
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c   | 31 ++++---------------------------
 3 files changed, 32 insertions(+), 27 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
index 2d6f5ec..f56d104 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
@@ -377,6 +377,31 @@  int amdgpu_sync_wait(struct amdgpu_sync *sync, bool intr)
 }
 
 /**
+ * amdgpu_sync_wait_resv - Wait for reservation fences
+ *
+ * @vm: related vm
+ * @owner: fence owner
+ * @intr: Whether the wait is interruptible
+ *
+ * Returns:
+ * 0 on success, errno otherwise.
+ */
+int amdgpu_sync_wait_resv(struct amdgpu_device *adev,
+			  struct reservation_object *resv,
+			  void *owner, bool intr)
+{
+	struct amdgpu_sync sync;
+	int r;
+
+	amdgpu_sync_create(&sync);
+	amdgpu_sync_resv(adev, &sync, resv, owner, false);
+	r = amdgpu_sync_wait(&sync, intr);
+	amdgpu_sync_free(&sync);
+
+	return r;
+}
+
+/**
  * amdgpu_sync_free - free the sync object
  *
  * @sync: sync object to use
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h
index 10cf23a..af6eea6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h
@@ -52,6 +52,9 @@  struct dma_fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,
 struct dma_fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync, bool *explicit);
 int amdgpu_sync_clone(struct amdgpu_sync *source, struct amdgpu_sync *clone);
 int amdgpu_sync_wait(struct amdgpu_sync *sync, bool intr);
+int amdgpu_sync_wait_resv(struct amdgpu_device *adev,
+			  struct reservation_object *resv,
+			  void *owner, bool intr);
 void amdgpu_sync_free(struct amdgpu_sync *sync);
 int amdgpu_sync_init(void);
 void amdgpu_sync_fini(void);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 5d7c191..ed1ca1d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -1330,31 +1330,6 @@  static void amdgpu_vm_cpu_set_ptes(struct amdgpu_pte_update_params *params,
 	}
 }
 
-
-/**
- * amdgpu_vm_wait_pd - Wait for PT BOs to be free.
- *
- * @adev: amdgpu_device pointer
- * @vm: related vm
- * @owner: fence owner
- *
- * Returns:
- * 0 on success, errno otherwise.
- */
-static int amdgpu_vm_wait_pd(struct amdgpu_device *adev, struct amdgpu_vm *vm,
-			     void *owner)
-{
-	struct amdgpu_sync sync;
-	int r;
-
-	amdgpu_sync_create(&sync);
-	amdgpu_sync_resv(adev, &sync, vm->root.base.bo->tbo.resv, owner, false);
-	r = amdgpu_sync_wait(&sync, true);
-	amdgpu_sync_free(&sync);
-
-	return r;
-}
-
 /**
  * amdgpu_vm_update_func - helper to call update function
  *
@@ -1449,7 +1424,8 @@  int amdgpu_vm_update_directories(struct amdgpu_device *adev,
 	params.adev = adev;
 
 	if (vm->use_cpu_for_update) {
-		r = amdgpu_vm_wait_pd(adev, vm, AMDGPU_FENCE_OWNER_VM);
+		r = amdgpu_sync_wait_resv(adev, vm->root.base.bo->tbo.resv,
+					  AMDGPU_FENCE_OWNER_VM, true);
 		if (unlikely(r))
 			return r;
 
@@ -1782,7 +1758,8 @@  static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
 		/* Wait for PT BOs to be idle. PTs share the same resv. object
 		 * as the root PD BO
 		 */
-		r = amdgpu_vm_wait_pd(adev, vm, owner);
+		r = amdgpu_sync_wait_resv(adev, vm->root.base.bo->tbo.resv,
+					  owner, true);
 		if (unlikely(r))
 			return r;
 

Comments

Koenig, Christian Feb. 8, 2019, 8:31 a.m.
Am 07.02.19 um 20:53 schrieb Kuehling, Felix:
> Creates a temporary sync object to wait for the reservation. This

> generalizes amdgpu_vm_wait_pd.

>

> Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>


For this one it might be better to name this function 
amdgpu_bo_sync_wait and add it to amdgpu_object.c.

Just because the object we work with is the BO/resv and not the sync 
container.

Apart from that the series looks good to me and patches #2 and #3 are 
Reviewed-by: Christian König <christian.koenig@amd.com> and patch #4 is 

Acked-by: Christian König <christian.koenig@amd.com>


Regards,
Christian.

> ---

>   drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 25 +++++++++++++++++++++++++

>   drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h |  3 +++

>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c   | 31 ++++---------------------------

>   3 files changed, 32 insertions(+), 27 deletions(-)

>

> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c

> index 2d6f5ec..f56d104 100644

> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c

> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c

> @@ -377,6 +377,31 @@ int amdgpu_sync_wait(struct amdgpu_sync *sync, bool intr)

>   }

>   

>   /**

> + * amdgpu_sync_wait_resv - Wait for reservation fences

> + *

> + * @vm: related vm

> + * @owner: fence owner

> + * @intr: Whether the wait is interruptible

> + *

> + * Returns:

> + * 0 on success, errno otherwise.

> + */

> +int amdgpu_sync_wait_resv(struct amdgpu_device *adev,

> +			  struct reservation_object *resv,

> +			  void *owner, bool intr)

> +{

> +	struct amdgpu_sync sync;

> +	int r;

> +

> +	amdgpu_sync_create(&sync);

> +	amdgpu_sync_resv(adev, &sync, resv, owner, false);

> +	r = amdgpu_sync_wait(&sync, intr);

> +	amdgpu_sync_free(&sync);

> +

> +	return r;

> +}

> +

> +/**

>    * amdgpu_sync_free - free the sync object

>    *

>    * @sync: sync object to use

> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h

> index 10cf23a..af6eea6 100644

> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h

> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h

> @@ -52,6 +52,9 @@ struct dma_fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync,

>   struct dma_fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync, bool *explicit);

>   int amdgpu_sync_clone(struct amdgpu_sync *source, struct amdgpu_sync *clone);

>   int amdgpu_sync_wait(struct amdgpu_sync *sync, bool intr);

> +int amdgpu_sync_wait_resv(struct amdgpu_device *adev,

> +			  struct reservation_object *resv,

> +			  void *owner, bool intr);

>   void amdgpu_sync_free(struct amdgpu_sync *sync);

>   int amdgpu_sync_init(void);

>   void amdgpu_sync_fini(void);

> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

> index 5d7c191..ed1ca1d 100644

> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

> @@ -1330,31 +1330,6 @@ static void amdgpu_vm_cpu_set_ptes(struct amdgpu_pte_update_params *params,

>   	}

>   }

>   

> -

> -/**

> - * amdgpu_vm_wait_pd - Wait for PT BOs to be free.

> - *

> - * @adev: amdgpu_device pointer

> - * @vm: related vm

> - * @owner: fence owner

> - *

> - * Returns:

> - * 0 on success, errno otherwise.

> - */

> -static int amdgpu_vm_wait_pd(struct amdgpu_device *adev, struct amdgpu_vm *vm,

> -			     void *owner)

> -{

> -	struct amdgpu_sync sync;

> -	int r;

> -

> -	amdgpu_sync_create(&sync);

> -	amdgpu_sync_resv(adev, &sync, vm->root.base.bo->tbo.resv, owner, false);

> -	r = amdgpu_sync_wait(&sync, true);

> -	amdgpu_sync_free(&sync);

> -

> -	return r;

> -}

> -

>   /**

>    * amdgpu_vm_update_func - helper to call update function

>    *

> @@ -1449,7 +1424,8 @@ int amdgpu_vm_update_directories(struct amdgpu_device *adev,

>   	params.adev = adev;

>   

>   	if (vm->use_cpu_for_update) {

> -		r = amdgpu_vm_wait_pd(adev, vm, AMDGPU_FENCE_OWNER_VM);

> +		r = amdgpu_sync_wait_resv(adev, vm->root.base.bo->tbo.resv,

> +					  AMDGPU_FENCE_OWNER_VM, true);

>   		if (unlikely(r))

>   			return r;

>   

> @@ -1782,7 +1758,8 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,

>   		/* Wait for PT BOs to be idle. PTs share the same resv. object

>   		 * as the root PD BO

>   		 */

> -		r = amdgpu_vm_wait_pd(adev, vm, owner);

> +		r = amdgpu_sync_wait_resv(adev, vm->root.base.bo->tbo.resv,

> +					  owner, true);

>   		if (unlikely(r))

>   			return r;

>