All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH libdrm 1/4] amdgpu: add bo from user memory to handle table
@ 2018-08-08  4:08 Junwei Zhang
       [not found] ` <1533701320-23661-1-git-send-email-Jerry.Zhang-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 13+ messages in thread
From: Junwei Zhang @ 2018-08-08  4:08 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: Junwei Zhang, christian.koenig-5C7GfCeVMHo

When create bo from user memory, add it to handle table
for future query.

Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
---
 amdgpu/amdgpu_bo.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
index 422c7c9..b24e698 100644
--- a/amdgpu/amdgpu_bo.c
+++ b/amdgpu/amdgpu_bo.c
@@ -556,7 +556,16 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
 	bo->alloc_size = size;
 	bo->handle = args.handle;
 
-	*buf_handle = bo;
+	pthread_mutex_lock(&bo->dev->bo_table_mutex);
+	r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
+	pthread_mutex_unlock(&bo->dev->bo_table_mutex);
+
+	pthread_mutex_init(&bo->cpu_access_mutex, NULL);
+
+	if (r)
+		amdgpu_bo_free(bo);
+	else
+		*buf_handle = bo;
 
 	return r;
 }
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* [PATCH libdrm 2/4] amdgpu: add a function to find bo by cpu mapping (v2)
       [not found] ` <1533701320-23661-1-git-send-email-Jerry.Zhang-5C7GfCeVMHo@public.gmane.org>
@ 2018-08-08  4:08   ` Junwei Zhang
       [not found]     ` <1533701320-23661-2-git-send-email-Jerry.Zhang-5C7GfCeVMHo@public.gmane.org>
  2018-08-08  4:08   ` [PATCH libdrm 3/4] tests/amdgpu: add test for finding bo by CPU mapping Junwei Zhang
  2018-08-08  4:08   ` [PATCH libdrm 4/4] amdgpu: add a function to create amdgpu bo internally Junwei Zhang
  2 siblings, 1 reply; 13+ messages in thread
From: Junwei Zhang @ 2018-08-08  4:08 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: Junwei Zhang, christian.koenig-5C7GfCeVMHo

Userspace needs to know if the user memory is from BO or malloc.

v2: update mutex range and rebase

Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
---
 amdgpu/amdgpu.h    | 23 +++++++++++++++++++++++
 amdgpu/amdgpu_bo.c | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 57 insertions(+)

diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
index be83b45..a8c353c 100644
--- a/amdgpu/amdgpu.h
+++ b/amdgpu/amdgpu.h
@@ -678,6 +678,29 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
 				    amdgpu_bo_handle *buf_handle);
 
 /**
+ * Validate if the user memory comes from BO
+ *
+ * \param dev - [in] Device handle. See #amdgpu_device_initialize()
+ * \param cpu - [in] CPU address of user allocated memory which we
+ * want to map to GPU address space (make GPU accessible)
+ * (This address must be correctly aligned).
+ * \param size - [in] Size of allocation (must be correctly aligned)
+ * \param buf_handle - [out] Buffer handle for the userptr memory
+ * if the user memory is not from BO, the buf_handle will be NULL.
+ * \param offset_in_bo - [out] offset in this BO for this user memory
+ *
+ *
+ * \return   0 on success\n
+ *          <0 - Negative POSIX Error code
+ *
+*/
+int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
+				  void *cpu,
+				  uint64_t size,
+				  amdgpu_bo_handle *buf_handle,
+				  uint64_t *offset_in_bo);
+
+/**
  * Free previosuly allocated memory
  *
  * \param   dev	       - \c [in] Device handle. See #amdgpu_device_initialize()
diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
index b24e698..a7f0662 100644
--- a/amdgpu/amdgpu_bo.c
+++ b/amdgpu/amdgpu_bo.c
@@ -529,6 +529,40 @@ int amdgpu_bo_wait_for_idle(amdgpu_bo_handle bo,
 	}
 }
 
+int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
+				  void *cpu,
+				  uint64_t size,
+				  amdgpu_bo_handle *buf_handle,
+				  uint64_t *offset_in_bo)
+{
+	int i;
+	struct amdgpu_bo *bo;
+
+	if (cpu == NULL || size == 0)
+		return -EINVAL;
+
+	pthread_mutex_lock(&dev->bo_table_mutex);
+	for (i = 0; i < dev->bo_handles.max_key; i++) {
+		bo = handle_table_lookup(&dev->bo_handles, i);
+		if (!bo || !bo->cpu_ptr || size > bo->alloc_size)
+			continue;
+		if (cpu >= bo->cpu_ptr && cpu < (bo->cpu_ptr + bo->alloc_size))
+			break;
+	}
+
+	if (i < dev->bo_handles.max_key) {
+		atomic_inc(&bo->refcount);
+		*buf_handle = bo;
+		*offset_in_bo = cpu - bo->cpu_ptr;
+	} else {
+		*buf_handle = NULL;
+		*offset_in_bo = 0;
+	}
+	pthread_mutex_unlock(&dev->bo_table_mutex);
+
+	return 0;
+}
+
 int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
 				    void *cpu,
 				    uint64_t size,
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* [PATCH libdrm 3/4] tests/amdgpu: add test for finding bo by CPU mapping
       [not found] ` <1533701320-23661-1-git-send-email-Jerry.Zhang-5C7GfCeVMHo@public.gmane.org>
  2018-08-08  4:08   ` [PATCH libdrm 2/4] amdgpu: add a function to find bo by cpu mapping (v2) Junwei Zhang
@ 2018-08-08  4:08   ` Junwei Zhang
  2018-08-08  4:08   ` [PATCH libdrm 4/4] amdgpu: add a function to create amdgpu bo internally Junwei Zhang
  2 siblings, 0 replies; 13+ messages in thread
From: Junwei Zhang @ 2018-08-08  4:08 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: Junwei Zhang, christian.koenig-5C7GfCeVMHo

Add a test for API to query bo by CPU mapping

Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
---
 tests/amdgpu/bo_tests.c | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/tests/amdgpu/bo_tests.c b/tests/amdgpu/bo_tests.c
index 9d4da4a..dc2de9b 100644
--- a/tests/amdgpu/bo_tests.c
+++ b/tests/amdgpu/bo_tests.c
@@ -27,6 +27,7 @@
 
 #include "amdgpu_test.h"
 #include "amdgpu_drm.h"
+#include "amdgpu_internal.h"
 
 #define BUFFER_SIZE (4*1024)
 #define BUFFER_ALIGN (4*1024)
@@ -44,6 +45,7 @@ static void amdgpu_bo_metadata(void);
 static void amdgpu_bo_map_unmap(void);
 static void amdgpu_memory_alloc(void);
 static void amdgpu_mem_fail_alloc(void);
+static void amdgpu_bo_find_by_cpu_mapping(void);
 
 CU_TestInfo bo_tests[] = {
 	{ "Export/Import",  amdgpu_bo_export_import },
@@ -51,6 +53,7 @@ CU_TestInfo bo_tests[] = {
 	{ "CPU map/unmap",  amdgpu_bo_map_unmap },
 	{ "Memory alloc Test",  amdgpu_memory_alloc },
 	{ "Memory fail alloc Test",  amdgpu_mem_fail_alloc },
+	{ "Find bo by CPU mapping",  amdgpu_bo_find_by_cpu_mapping },
 	CU_TEST_INFO_NULL,
 };
 
@@ -262,3 +265,33 @@ static void amdgpu_mem_fail_alloc(void)
 		CU_ASSERT_EQUAL(r, 0);
 	}
 }
+
+static void amdgpu_bo_find_by_cpu_mapping(void)
+{
+	amdgpu_bo_handle bo_handle, find_bo_handle;
+	amdgpu_va_handle va_handle;
+	void *bo_cpu;
+	uint64_t bo_mc_address;
+	uint64_t offset;
+	int r;
+
+	r = amdgpu_bo_alloc_and_map(device_handle, 4096, 4096,
+				    AMDGPU_GEM_DOMAIN_GTT, 0,
+				    &bo_handle, &bo_cpu,
+				    &bo_mc_address, &va_handle);
+	CU_ASSERT_EQUAL(r, 0);
+
+	r = amdgpu_find_bo_by_cpu_mapping(device_handle,
+					  bo_cpu,
+					  4096,
+					  &find_bo_handle,
+					  &offset);
+	CU_ASSERT_EQUAL(r, 0);
+	CU_ASSERT_EQUAL(offset, 0);
+	CU_ASSERT_EQUAL(bo_handle->handle, find_bo_handle->handle);
+
+	atomic_dec(&find_bo_handle->refcount, 1);
+	r = amdgpu_bo_unmap_and_free(bo_handle, va_handle,
+				     bo_mc_address, 4096);
+	CU_ASSERT_EQUAL(r, 0);
+}
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* [PATCH libdrm 4/4] amdgpu: add a function to create amdgpu bo internally
       [not found] ` <1533701320-23661-1-git-send-email-Jerry.Zhang-5C7GfCeVMHo@public.gmane.org>
  2018-08-08  4:08   ` [PATCH libdrm 2/4] amdgpu: add a function to find bo by cpu mapping (v2) Junwei Zhang
  2018-08-08  4:08   ` [PATCH libdrm 3/4] tests/amdgpu: add test for finding bo by CPU mapping Junwei Zhang
@ 2018-08-08  4:08   ` Junwei Zhang
       [not found]     ` <1533701320-23661-4-git-send-email-Jerry.Zhang-5C7GfCeVMHo@public.gmane.org>
  2 siblings, 1 reply; 13+ messages in thread
From: Junwei Zhang @ 2018-08-08  4:08 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: Junwei Zhang, christian.koenig-5C7GfCeVMHo

a helper function to create and initialize amdgpu bo

Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
---
 amdgpu/amdgpu_bo.c | 81 ++++++++++++++++++++++--------------------------------
 1 file changed, 33 insertions(+), 48 deletions(-)

diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
index a7f0662..59cba69 100644
--- a/amdgpu/amdgpu_bo.c
+++ b/amdgpu/amdgpu_bo.c
@@ -48,11 +48,39 @@ static void amdgpu_close_kms_handle(amdgpu_device_handle dev,
 	drmIoctl(dev->fd, DRM_IOCTL_GEM_CLOSE, &args);
 }
 
+static int amdgpu_bo_create(amdgpu_device_handle dev,
+			    uint64_t size,
+			    uint32_t handle,
+			    amdgpu_bo_handle *buf_handle)
+{
+	struct amdgpu_bo *bo;
+	int r = 0;
+
+	bo = calloc(1, sizeof(struct amdgpu_bo));
+	if (!bo)
+		return -ENOMEM;
+
+	atomic_set(&bo->refcount, 1);
+	bo->dev = dev;
+	bo->alloc_size = size;
+	bo->handle = handle;
+	pthread_mutex_init(&bo->cpu_access_mutex, NULL);
+
+	pthread_mutex_lock(&bo->dev->bo_table_mutex);
+	r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
+	pthread_mutex_unlock(&bo->dev->bo_table_mutex);
+	if (r)
+		amdgpu_bo_free(bo);
+	else
+		*buf_handle = bo;
+
+	return r;
+}
+
 int amdgpu_bo_alloc(amdgpu_device_handle dev,
 		    struct amdgpu_bo_alloc_request *alloc_buffer,
 		    amdgpu_bo_handle *buf_handle)
 {
-	struct amdgpu_bo *bo;
 	union drm_amdgpu_gem_create args;
 	unsigned heap = alloc_buffer->preferred_heap;
 	int r = 0;
@@ -61,14 +89,6 @@ int amdgpu_bo_alloc(amdgpu_device_handle dev,
 	if (!(heap & (AMDGPU_GEM_DOMAIN_GTT | AMDGPU_GEM_DOMAIN_VRAM)))
 		return -EINVAL;
 
-	bo = calloc(1, sizeof(struct amdgpu_bo));
-	if (!bo)
-		return -ENOMEM;
-
-	atomic_set(&bo->refcount, 1);
-	bo->dev = dev;
-	bo->alloc_size = alloc_buffer->alloc_size;
-
 	memset(&args, 0, sizeof(args));
 	args.in.bo_size = alloc_buffer->alloc_size;
 	args.in.alignment = alloc_buffer->phys_alignment;
@@ -80,25 +100,11 @@ int amdgpu_bo_alloc(amdgpu_device_handle dev,
 	/* Allocate the buffer with the preferred heap. */
 	r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_GEM_CREATE,
 				&args, sizeof(args));
-	if (r) {
-		free(bo);
-		return r;
-	}
-
-	bo->handle = args.out.handle;
-
-	pthread_mutex_lock(&bo->dev->bo_table_mutex);
-	r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
-	pthread_mutex_unlock(&bo->dev->bo_table_mutex);
-
-	pthread_mutex_init(&bo->cpu_access_mutex, NULL);
-
 	if (r)
-		amdgpu_bo_free(bo);
-	else
-		*buf_handle = bo;
+		return r;
 
-	return r;
+	return amdgpu_bo_create(dev, alloc_buffer->alloc_size, args.out.handle,
+				buf_handle);
 }
 
 int amdgpu_bo_set_metadata(amdgpu_bo_handle bo,
@@ -569,7 +575,6 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
 				    amdgpu_bo_handle *buf_handle)
 {
 	int r;
-	struct amdgpu_bo *bo;
 	struct drm_amdgpu_gem_userptr args;
 
 	args.addr = (uintptr_t)cpu;
@@ -581,27 +586,7 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
 	if (r)
 		return r;
 
-	bo = calloc(1, sizeof(struct amdgpu_bo));
-	if (!bo)
-		return -ENOMEM;
-
-	atomic_set(&bo->refcount, 1);
-	bo->dev = dev;
-	bo->alloc_size = size;
-	bo->handle = args.handle;
-
-	pthread_mutex_lock(&bo->dev->bo_table_mutex);
-	r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
-	pthread_mutex_unlock(&bo->dev->bo_table_mutex);
-
-	pthread_mutex_init(&bo->cpu_access_mutex, NULL);
-
-	if (r)
-		amdgpu_bo_free(bo);
-	else
-		*buf_handle = bo;
-
-	return r;
+	return amdgpu_bo_create(dev, size, args.handle, buf_handle);
 }
 
 int amdgpu_bo_list_create(amdgpu_device_handle dev,
-- 
1.9.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* Re: [PATCH libdrm 2/4] amdgpu: add a function to find bo by cpu mapping (v2)
       [not found]     ` <1533701320-23661-2-git-send-email-Jerry.Zhang-5C7GfCeVMHo@public.gmane.org>
@ 2018-08-08  4:23       ` zhoucm1
       [not found]         ` <b40df073-fc49-0e32-901d-2193f38700ea-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 13+ messages in thread
From: zhoucm1 @ 2018-08-08  4:23 UTC (permalink / raw)
  To: Junwei Zhang, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: christian.koenig-5C7GfCeVMHo



On 2018年08月08日 12:08, Junwei Zhang wrote:
> Userspace needs to know if the user memory is from BO or malloc.
>
> v2: update mutex range and rebase
>
> Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
> ---
>   amdgpu/amdgpu.h    | 23 +++++++++++++++++++++++
>   amdgpu/amdgpu_bo.c | 34 ++++++++++++++++++++++++++++++++++
>   2 files changed, 57 insertions(+)
>
> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
> index be83b45..a8c353c 100644
> --- a/amdgpu/amdgpu.h
> +++ b/amdgpu/amdgpu.h
> @@ -678,6 +678,29 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>   				    amdgpu_bo_handle *buf_handle);
>   
>   /**
> + * Validate if the user memory comes from BO
> + *
> + * \param dev - [in] Device handle. See #amdgpu_device_initialize()
> + * \param cpu - [in] CPU address of user allocated memory which we
> + * want to map to GPU address space (make GPU accessible)
> + * (This address must be correctly aligned).
> + * \param size - [in] Size of allocation (must be correctly aligned)
> + * \param buf_handle - [out] Buffer handle for the userptr memory
> + * if the user memory is not from BO, the buf_handle will be NULL.
> + * \param offset_in_bo - [out] offset in this BO for this user memory
> + *
> + *
> + * \return   0 on success\n
> + *          <0 - Negative POSIX Error code
> + *
> +*/
> +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
> +				  void *cpu,
> +				  uint64_t size,
> +				  amdgpu_bo_handle *buf_handle,
> +				  uint64_t *offset_in_bo);
> +
> +/**
>    * Free previosuly allocated memory
>    *
>    * \param   dev	       - \c [in] Device handle. See #amdgpu_device_initialize()
> diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
> index b24e698..a7f0662 100644
> --- a/amdgpu/amdgpu_bo.c
> +++ b/amdgpu/amdgpu_bo.c
> @@ -529,6 +529,40 @@ int amdgpu_bo_wait_for_idle(amdgpu_bo_handle bo,
>   	}
>   }
>   
> +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
> +				  void *cpu,
> +				  uint64_t size,
> +				  amdgpu_bo_handle *buf_handle,
> +				  uint64_t *offset_in_bo)
> +{
> +	int i;
> +	struct amdgpu_bo *bo;
> +
> +	if (cpu == NULL || size == 0)
> +		return -EINVAL;
> +
> +	pthread_mutex_lock(&dev->bo_table_mutex);
> +	for (i = 0; i < dev->bo_handles.max_key; i++) {
Hi Jerry,

As Christian catched before, iterating all BOs of device will introduce 
much CPU overhead, this isn't good direction.
Since cpu virtual address is per-process, you should go to kernel to 
find them from vm tree, which obviously takes less time.

Regards,
David Zhou
> +		bo = handle_table_lookup(&dev->bo_handles, i);
> +		if (!bo || !bo->cpu_ptr || size > bo->alloc_size)
> +			continue;
> +		if (cpu >= bo->cpu_ptr && cpu < (bo->cpu_ptr + bo->alloc_size))
> +			break;
> +	}
> +
> +	if (i < dev->bo_handles.max_key) {
> +		atomic_inc(&bo->refcount);
> +		*buf_handle = bo;
> +		*offset_in_bo = cpu - bo->cpu_ptr;
> +	} else {
> +		*buf_handle = NULL;
> +		*offset_in_bo = 0;
> +	}
> +	pthread_mutex_unlock(&dev->bo_table_mutex);
> +
> +	return 0;
> +}
> +
>   int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>   				    void *cpu,
>   				    uint64_t size,

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* Re: [PATCH libdrm 2/4] amdgpu: add a function to find bo by cpu mapping (v2)
       [not found]         ` <b40df073-fc49-0e32-901d-2193f38700ea-5C7GfCeVMHo@public.gmane.org>
@ 2018-08-08  6:48           ` Christian König
       [not found]             ` <2f043d23-5266-4dfc-a703-119a5e9acb5f-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 13+ messages in thread
From: Christian König @ 2018-08-08  6:48 UTC (permalink / raw)
  To: zhoucm1, Junwei Zhang, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Am 08.08.2018 um 06:23 schrieb zhoucm1:
>
>
> On 2018年08月08日 12:08, Junwei Zhang wrote:
>> Userspace needs to know if the user memory is from BO or malloc.
>>
>> v2: update mutex range and rebase
>>
>> Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
>> ---
>>   amdgpu/amdgpu.h    | 23 +++++++++++++++++++++++
>>   amdgpu/amdgpu_bo.c | 34 ++++++++++++++++++++++++++++++++++
>>   2 files changed, 57 insertions(+)
>>
>> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
>> index be83b45..a8c353c 100644
>> --- a/amdgpu/amdgpu.h
>> +++ b/amdgpu/amdgpu.h
>> @@ -678,6 +678,29 @@ int 
>> amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>                       amdgpu_bo_handle *buf_handle);
>>     /**
>> + * Validate if the user memory comes from BO
>> + *
>> + * \param dev - [in] Device handle. See #amdgpu_device_initialize()
>> + * \param cpu - [in] CPU address of user allocated memory which we
>> + * want to map to GPU address space (make GPU accessible)
>> + * (This address must be correctly aligned).
>> + * \param size - [in] Size of allocation (must be correctly aligned)
>> + * \param buf_handle - [out] Buffer handle for the userptr memory
>> + * if the user memory is not from BO, the buf_handle will be NULL.
>> + * \param offset_in_bo - [out] offset in this BO for this user memory
>> + *
>> + *
>> + * \return   0 on success\n
>> + *          <0 - Negative POSIX Error code
>> + *
>> +*/
>> +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
>> +                  void *cpu,
>> +                  uint64_t size,
>> +                  amdgpu_bo_handle *buf_handle,
>> +                  uint64_t *offset_in_bo);
>> +
>> +/**
>>    * Free previosuly allocated memory
>>    *
>>    * \param   dev           - \c [in] Device handle. See 
>> #amdgpu_device_initialize()
>> diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
>> index b24e698..a7f0662 100644
>> --- a/amdgpu/amdgpu_bo.c
>> +++ b/amdgpu/amdgpu_bo.c
>> @@ -529,6 +529,40 @@ int amdgpu_bo_wait_for_idle(amdgpu_bo_handle bo,
>>       }
>>   }
>>   +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
>> +                  void *cpu,
>> +                  uint64_t size,
>> +                  amdgpu_bo_handle *buf_handle,
>> +                  uint64_t *offset_in_bo)
>> +{
>> +    int i;
>> +    struct amdgpu_bo *bo;
>> +
>> +    if (cpu == NULL || size == 0)
>> +        return -EINVAL;
>> +
>> +    pthread_mutex_lock(&dev->bo_table_mutex);
>> +    for (i = 0; i < dev->bo_handles.max_key; i++) {
> Hi Jerry,
>
> As Christian catched before, iterating all BOs of device will 
> introduce much CPU overhead, this isn't good direction.
> Since cpu virtual address is per-process, you should go to kernel to 
> find them from vm tree, which obviously takes less time.

Yeah, but is also much more overhead to maintain.

Since this is only to fix the behavior of a single buggy application at 
least I'm fine to keep the workaround as simple as this.

If we find a wider use we can still start to use the kernel 
implementation again.

Regards,
Christian.

>
> Regards,
> David Zhou
>> +        bo = handle_table_lookup(&dev->bo_handles, i);
>> +        if (!bo || !bo->cpu_ptr || size > bo->alloc_size)
>> +            continue;
>> +        if (cpu >= bo->cpu_ptr && cpu < (bo->cpu_ptr + bo->alloc_size))
>> +            break;
>> +    }
>> +
>> +    if (i < dev->bo_handles.max_key) {
>> +        atomic_inc(&bo->refcount);
>> +        *buf_handle = bo;
>> +        *offset_in_bo = cpu - bo->cpu_ptr;
>> +    } else {
>> +        *buf_handle = NULL;
>> +        *offset_in_bo = 0;
>> +    }
>> +    pthread_mutex_unlock(&dev->bo_table_mutex);
>> +
>> +    return 0;
>> +}
>> +
>>   int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>                       void *cpu,
>>                       uint64_t size,
>

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* Re: [PATCH libdrm 4/4] amdgpu: add a function to create amdgpu bo internally
       [not found]     ` <1533701320-23661-4-git-send-email-Jerry.Zhang-5C7GfCeVMHo@public.gmane.org>
@ 2018-08-08  6:51       ` Christian König
       [not found]         ` <1371bf42-2f74-f45b-d1f4-113cd44b806a-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 13+ messages in thread
From: Christian König @ 2018-08-08  6:51 UTC (permalink / raw)
  To: Junwei Zhang, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
  Cc: christian.koenig-5C7GfCeVMHo

Am 08.08.2018 um 06:08 schrieb Junwei Zhang:
> a helper function to create and initialize amdgpu bo

Can the new function be also used to initialize a BO structure during 
import?

Apart from that it look like a nice cleanup to me,
Christian.

>
> Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
> ---
>   amdgpu/amdgpu_bo.c | 81 ++++++++++++++++++++++--------------------------------
>   1 file changed, 33 insertions(+), 48 deletions(-)
>
> diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
> index a7f0662..59cba69 100644
> --- a/amdgpu/amdgpu_bo.c
> +++ b/amdgpu/amdgpu_bo.c
> @@ -48,11 +48,39 @@ static void amdgpu_close_kms_handle(amdgpu_device_handle dev,
>   	drmIoctl(dev->fd, DRM_IOCTL_GEM_CLOSE, &args);
>   }
>   
> +static int amdgpu_bo_create(amdgpu_device_handle dev,
> +			    uint64_t size,
> +			    uint32_t handle,
> +			    amdgpu_bo_handle *buf_handle)
> +{
> +	struct amdgpu_bo *bo;
> +	int r = 0;
> +
> +	bo = calloc(1, sizeof(struct amdgpu_bo));
> +	if (!bo)
> +		return -ENOMEM;
> +
> +	atomic_set(&bo->refcount, 1);
> +	bo->dev = dev;
> +	bo->alloc_size = size;
> +	bo->handle = handle;
> +	pthread_mutex_init(&bo->cpu_access_mutex, NULL);
> +
> +	pthread_mutex_lock(&bo->dev->bo_table_mutex);
> +	r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
> +	pthread_mutex_unlock(&bo->dev->bo_table_mutex);
> +	if (r)
> +		amdgpu_bo_free(bo);
> +	else
> +		*buf_handle = bo;
> +
> +	return r;
> +}
> +
>   int amdgpu_bo_alloc(amdgpu_device_handle dev,
>   		    struct amdgpu_bo_alloc_request *alloc_buffer,
>   		    amdgpu_bo_handle *buf_handle)
>   {
> -	struct amdgpu_bo *bo;
>   	union drm_amdgpu_gem_create args;
>   	unsigned heap = alloc_buffer->preferred_heap;
>   	int r = 0;
> @@ -61,14 +89,6 @@ int amdgpu_bo_alloc(amdgpu_device_handle dev,
>   	if (!(heap & (AMDGPU_GEM_DOMAIN_GTT | AMDGPU_GEM_DOMAIN_VRAM)))
>   		return -EINVAL;
>   
> -	bo = calloc(1, sizeof(struct amdgpu_bo));
> -	if (!bo)
> -		return -ENOMEM;
> -
> -	atomic_set(&bo->refcount, 1);
> -	bo->dev = dev;
> -	bo->alloc_size = alloc_buffer->alloc_size;
> -
>   	memset(&args, 0, sizeof(args));
>   	args.in.bo_size = alloc_buffer->alloc_size;
>   	args.in.alignment = alloc_buffer->phys_alignment;
> @@ -80,25 +100,11 @@ int amdgpu_bo_alloc(amdgpu_device_handle dev,
>   	/* Allocate the buffer with the preferred heap. */
>   	r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_GEM_CREATE,
>   				&args, sizeof(args));
> -	if (r) {
> -		free(bo);
> -		return r;
> -	}
> -
> -	bo->handle = args.out.handle;
> -
> -	pthread_mutex_lock(&bo->dev->bo_table_mutex);
> -	r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
> -	pthread_mutex_unlock(&bo->dev->bo_table_mutex);
> -
> -	pthread_mutex_init(&bo->cpu_access_mutex, NULL);
> -
>   	if (r)
> -		amdgpu_bo_free(bo);
> -	else
> -		*buf_handle = bo;
> +		return r;
>   
> -	return r;
> +	return amdgpu_bo_create(dev, alloc_buffer->alloc_size, args.out.handle,
> +				buf_handle);
>   }
>   
>   int amdgpu_bo_set_metadata(amdgpu_bo_handle bo,
> @@ -569,7 +575,6 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>   				    amdgpu_bo_handle *buf_handle)
>   {
>   	int r;
> -	struct amdgpu_bo *bo;
>   	struct drm_amdgpu_gem_userptr args;
>   
>   	args.addr = (uintptr_t)cpu;
> @@ -581,27 +586,7 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>   	if (r)
>   		return r;
>   
> -	bo = calloc(1, sizeof(struct amdgpu_bo));
> -	if (!bo)
> -		return -ENOMEM;
> -
> -	atomic_set(&bo->refcount, 1);
> -	bo->dev = dev;
> -	bo->alloc_size = size;
> -	bo->handle = args.handle;
> -
> -	pthread_mutex_lock(&bo->dev->bo_table_mutex);
> -	r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
> -	pthread_mutex_unlock(&bo->dev->bo_table_mutex);
> -
> -	pthread_mutex_init(&bo->cpu_access_mutex, NULL);
> -
> -	if (r)
> -		amdgpu_bo_free(bo);
> -	else
> -		*buf_handle = bo;
> -
> -	return r;
> +	return amdgpu_bo_create(dev, size, args.handle, buf_handle);
>   }
>   
>   int amdgpu_bo_list_create(amdgpu_device_handle dev,

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* Re: [PATCH libdrm 4/4] amdgpu: add a function to create amdgpu bo internally
       [not found]         ` <1371bf42-2f74-f45b-d1f4-113cd44b806a-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2018-08-08  7:12           ` Zhang, Jerry (Junwei)
       [not found]             ` <5B6A97FB.3000003-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 13+ messages in thread
From: Zhang, Jerry (Junwei) @ 2018-08-08  7:12 UTC (permalink / raw)
  To: christian.koenig-5C7GfCeVMHo,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On 08/08/2018 02:51 PM, Christian König wrote:
> Am 08.08.2018 um 06:08 schrieb Junwei Zhang:
>> a helper function to create and initialize amdgpu bo
>
> Can the new function be also used to initialize a BO structure during import?

Yeah, that's what I'm going to talk a bit more in this patch.
(actually it's a RFC patch)

When I'm working on it, find amdgpu_bo_import() holds the table lock through the function.
Wonder if it involves any potential issue, if I add the amdgpu_bo_create() at the end of function
out of the table lock?

If so, I would provide a amdgpu_bo_create_locked() function to insert the range of holding the lock.

Any background/insight could be shared?

Regards,
Jerry

>
> Apart from that it look like a nice cleanup to me,
> Christian.
>
>>
>> Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
>> ---
>>   amdgpu/amdgpu_bo.c | 81 ++++++++++++++++++++++--------------------------------
>>   1 file changed, 33 insertions(+), 48 deletions(-)
>>
>> diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
>> index a7f0662..59cba69 100644
>> --- a/amdgpu/amdgpu_bo.c
>> +++ b/amdgpu/amdgpu_bo.c
>> @@ -48,11 +48,39 @@ static void amdgpu_close_kms_handle(amdgpu_device_handle dev,
>>       drmIoctl(dev->fd, DRM_IOCTL_GEM_CLOSE, &args);
>>   }
>> +static int amdgpu_bo_create(amdgpu_device_handle dev,
>> +                uint64_t size,
>> +                uint32_t handle,
>> +                amdgpu_bo_handle *buf_handle)
>> +{
>> +    struct amdgpu_bo *bo;
>> +    int r = 0;
>> +
>> +    bo = calloc(1, sizeof(struct amdgpu_bo));
>> +    if (!bo)
>> +        return -ENOMEM;
>> +
>> +    atomic_set(&bo->refcount, 1);
>> +    bo->dev = dev;
>> +    bo->alloc_size = size;
>> +    bo->handle = handle;
>> +    pthread_mutex_init(&bo->cpu_access_mutex, NULL);
>> +
>> +    pthread_mutex_lock(&bo->dev->bo_table_mutex);
>> +    r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
>> +    pthread_mutex_unlock(&bo->dev->bo_table_mutex);
>> +    if (r)
>> +        amdgpu_bo_free(bo);
>> +    else
>> +        *buf_handle = bo;
>> +
>> +    return r;
>> +}
>> +
>>   int amdgpu_bo_alloc(amdgpu_device_handle dev,
>>               struct amdgpu_bo_alloc_request *alloc_buffer,
>>               amdgpu_bo_handle *buf_handle)
>>   {
>> -    struct amdgpu_bo *bo;
>>       union drm_amdgpu_gem_create args;
>>       unsigned heap = alloc_buffer->preferred_heap;
>>       int r = 0;
>> @@ -61,14 +89,6 @@ int amdgpu_bo_alloc(amdgpu_device_handle dev,
>>       if (!(heap & (AMDGPU_GEM_DOMAIN_GTT | AMDGPU_GEM_DOMAIN_VRAM)))
>>           return -EINVAL;
>> -    bo = calloc(1, sizeof(struct amdgpu_bo));
>> -    if (!bo)
>> -        return -ENOMEM;
>> -
>> -    atomic_set(&bo->refcount, 1);
>> -    bo->dev = dev;
>> -    bo->alloc_size = alloc_buffer->alloc_size;
>> -
>>       memset(&args, 0, sizeof(args));
>>       args.in.bo_size = alloc_buffer->alloc_size;
>>       args.in.alignment = alloc_buffer->phys_alignment;
>> @@ -80,25 +100,11 @@ int amdgpu_bo_alloc(amdgpu_device_handle dev,
>>       /* Allocate the buffer with the preferred heap. */
>>       r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_GEM_CREATE,
>>                   &args, sizeof(args));
>> -    if (r) {
>> -        free(bo);
>> -        return r;
>> -    }
>> -
>> -    bo->handle = args.out.handle;
>> -
>> -    pthread_mutex_lock(&bo->dev->bo_table_mutex);
>> -    r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
>> -    pthread_mutex_unlock(&bo->dev->bo_table_mutex);
>> -
>> -    pthread_mutex_init(&bo->cpu_access_mutex, NULL);
>> -
>>       if (r)
>> -        amdgpu_bo_free(bo);
>> -    else
>> -        *buf_handle = bo;
>> +        return r;
>> -    return r;
>> +    return amdgpu_bo_create(dev, alloc_buffer->alloc_size, args.out.handle,
>> +                buf_handle);
>>   }
>>   int amdgpu_bo_set_metadata(amdgpu_bo_handle bo,
>> @@ -569,7 +575,6 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>                       amdgpu_bo_handle *buf_handle)
>>   {
>>       int r;
>> -    struct amdgpu_bo *bo;
>>       struct drm_amdgpu_gem_userptr args;
>>       args.addr = (uintptr_t)cpu;
>> @@ -581,27 +586,7 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>       if (r)
>>           return r;
>> -    bo = calloc(1, sizeof(struct amdgpu_bo));
>> -    if (!bo)
>> -        return -ENOMEM;
>> -
>> -    atomic_set(&bo->refcount, 1);
>> -    bo->dev = dev;
>> -    bo->alloc_size = size;
>> -    bo->handle = args.handle;
>> -
>> -    pthread_mutex_lock(&bo->dev->bo_table_mutex);
>> -    r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
>> -    pthread_mutex_unlock(&bo->dev->bo_table_mutex);
>> -
>> -    pthread_mutex_init(&bo->cpu_access_mutex, NULL);
>> -
>> -    if (r)
>> -        amdgpu_bo_free(bo);
>> -    else
>> -        *buf_handle = bo;
>> -
>> -    return r;
>> +    return amdgpu_bo_create(dev, size, args.handle, buf_handle);
>>   }
>>   int amdgpu_bo_list_create(amdgpu_device_handle dev,
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* Re: [PATCH libdrm 4/4] amdgpu: add a function to create amdgpu bo internally
       [not found]             ` <5B6A97FB.3000003-5C7GfCeVMHo@public.gmane.org>
@ 2018-08-08  7:18               ` Christian König
  0 siblings, 0 replies; 13+ messages in thread
From: Christian König @ 2018-08-08  7:18 UTC (permalink / raw)
  To: Zhang, Jerry (Junwei), amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Am 08.08.2018 um 09:12 schrieb Zhang, Jerry (Junwei):
> On 08/08/2018 02:51 PM, Christian König wrote:
>> Am 08.08.2018 um 06:08 schrieb Junwei Zhang:
>>> a helper function to create and initialize amdgpu bo
>>
>> Can the new function be also used to initialize a BO structure during 
>> import?
>
> Yeah, that's what I'm going to talk a bit more in this patch.
> (actually it's a RFC patch)
>
> When I'm working on it, find amdgpu_bo_import() holds the table lock 
> through the function.
> Wonder if it involves any potential issue, if I add the 
> amdgpu_bo_create() at the end of function
> out of the table lock?
>
> If so, I would provide a amdgpu_bo_create_locked() function to insert 
> the range of holding the lock.
>
> Any background/insight could be shared?

Ah, yes of course. We need to hold the lock during import to make sure 
that we don't import things twice.

I would just move adding the handle to the table out of the function 
into the callers.

It's still a nice cleanup if we just have the structure initialization 
in one place.

Christian.

>
> Regards,
> Jerry
>
>>
>> Apart from that it look like a nice cleanup to me,
>> Christian.
>>
>>>
>>> Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
>>> ---
>>>   amdgpu/amdgpu_bo.c | 81 
>>> ++++++++++++++++++++++--------------------------------
>>>   1 file changed, 33 insertions(+), 48 deletions(-)
>>>
>>> diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
>>> index a7f0662..59cba69 100644
>>> --- a/amdgpu/amdgpu_bo.c
>>> +++ b/amdgpu/amdgpu_bo.c
>>> @@ -48,11 +48,39 @@ static void 
>>> amdgpu_close_kms_handle(amdgpu_device_handle dev,
>>>       drmIoctl(dev->fd, DRM_IOCTL_GEM_CLOSE, &args);
>>>   }
>>> +static int amdgpu_bo_create(amdgpu_device_handle dev,
>>> +                uint64_t size,
>>> +                uint32_t handle,
>>> +                amdgpu_bo_handle *buf_handle)
>>> +{
>>> +    struct amdgpu_bo *bo;
>>> +    int r = 0;
>>> +
>>> +    bo = calloc(1, sizeof(struct amdgpu_bo));
>>> +    if (!bo)
>>> +        return -ENOMEM;
>>> +
>>> +    atomic_set(&bo->refcount, 1);
>>> +    bo->dev = dev;
>>> +    bo->alloc_size = size;
>>> +    bo->handle = handle;
>>> +    pthread_mutex_init(&bo->cpu_access_mutex, NULL);
>>> +
>>> +    pthread_mutex_lock(&bo->dev->bo_table_mutex);
>>> +    r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
>>> +    pthread_mutex_unlock(&bo->dev->bo_table_mutex);
>>> +    if (r)
>>> +        amdgpu_bo_free(bo);
>>> +    else
>>> +        *buf_handle = bo;
>>> +
>>> +    return r;
>>> +}
>>> +
>>>   int amdgpu_bo_alloc(amdgpu_device_handle dev,
>>>               struct amdgpu_bo_alloc_request *alloc_buffer,
>>>               amdgpu_bo_handle *buf_handle)
>>>   {
>>> -    struct amdgpu_bo *bo;
>>>       union drm_amdgpu_gem_create args;
>>>       unsigned heap = alloc_buffer->preferred_heap;
>>>       int r = 0;
>>> @@ -61,14 +89,6 @@ int amdgpu_bo_alloc(amdgpu_device_handle dev,
>>>       if (!(heap & (AMDGPU_GEM_DOMAIN_GTT | AMDGPU_GEM_DOMAIN_VRAM)))
>>>           return -EINVAL;
>>> -    bo = calloc(1, sizeof(struct amdgpu_bo));
>>> -    if (!bo)
>>> -        return -ENOMEM;
>>> -
>>> -    atomic_set(&bo->refcount, 1);
>>> -    bo->dev = dev;
>>> -    bo->alloc_size = alloc_buffer->alloc_size;
>>> -
>>>       memset(&args, 0, sizeof(args));
>>>       args.in.bo_size = alloc_buffer->alloc_size;
>>>       args.in.alignment = alloc_buffer->phys_alignment;
>>> @@ -80,25 +100,11 @@ int amdgpu_bo_alloc(amdgpu_device_handle dev,
>>>       /* Allocate the buffer with the preferred heap. */
>>>       r = drmCommandWriteRead(dev->fd, DRM_AMDGPU_GEM_CREATE,
>>>                   &args, sizeof(args));
>>> -    if (r) {
>>> -        free(bo);
>>> -        return r;
>>> -    }
>>> -
>>> -    bo->handle = args.out.handle;
>>> -
>>> -    pthread_mutex_lock(&bo->dev->bo_table_mutex);
>>> -    r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
>>> -    pthread_mutex_unlock(&bo->dev->bo_table_mutex);
>>> -
>>> -    pthread_mutex_init(&bo->cpu_access_mutex, NULL);
>>> -
>>>       if (r)
>>> -        amdgpu_bo_free(bo);
>>> -    else
>>> -        *buf_handle = bo;
>>> +        return r;
>>> -    return r;
>>> +    return amdgpu_bo_create(dev, alloc_buffer->alloc_size, 
>>> args.out.handle,
>>> +                buf_handle);
>>>   }
>>>   int amdgpu_bo_set_metadata(amdgpu_bo_handle bo,
>>> @@ -569,7 +575,6 @@ int 
>>> amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>>                       amdgpu_bo_handle *buf_handle)
>>>   {
>>>       int r;
>>> -    struct amdgpu_bo *bo;
>>>       struct drm_amdgpu_gem_userptr args;
>>>       args.addr = (uintptr_t)cpu;
>>> @@ -581,27 +586,7 @@ int 
>>> amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>>       if (r)
>>>           return r;
>>> -    bo = calloc(1, sizeof(struct amdgpu_bo));
>>> -    if (!bo)
>>> -        return -ENOMEM;
>>> -
>>> -    atomic_set(&bo->refcount, 1);
>>> -    bo->dev = dev;
>>> -    bo->alloc_size = size;
>>> -    bo->handle = args.handle;
>>> -
>>> -    pthread_mutex_lock(&bo->dev->bo_table_mutex);
>>> -    r = handle_table_insert(&bo->dev->bo_handles, bo->handle, bo);
>>> -    pthread_mutex_unlock(&bo->dev->bo_table_mutex);
>>> -
>>> -    pthread_mutex_init(&bo->cpu_access_mutex, NULL);
>>> -
>>> -    if (r)
>>> -        amdgpu_bo_free(bo);
>>> -    else
>>> -        *buf_handle = bo;
>>> -
>>> -    return r;
>>> +    return amdgpu_bo_create(dev, size, args.handle, buf_handle);
>>>   }
>>>   int amdgpu_bo_list_create(amdgpu_device_handle dev,
>>

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* Re: [PATCH libdrm 2/4] amdgpu: add a function to find bo by cpu mapping (v2)
       [not found]             ` <2f043d23-5266-4dfc-a703-119a5e9acb5f-5C7GfCeVMHo@public.gmane.org>
@ 2018-08-08  8:11               ` Zhang, Jerry (Junwei)
  2018-08-08  8:43               ` zhoucm1
  1 sibling, 0 replies; 13+ messages in thread
From: Zhang, Jerry (Junwei) @ 2018-08-08  8:11 UTC (permalink / raw)
  To: Christian König, zhoucm1,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On 08/08/2018 02:48 PM, Christian König wrote:
> Am 08.08.2018 um 06:23 schrieb zhoucm1:
>>
>>
>> On 2018年08月08日 12:08, Junwei Zhang wrote:
>>> Userspace needs to know if the user memory is from BO or malloc.
>>>
>>> v2: update mutex range and rebase
>>>
>>> Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
>>> ---
>>>   amdgpu/amdgpu.h    | 23 +++++++++++++++++++++++
>>>   amdgpu/amdgpu_bo.c | 34 ++++++++++++++++++++++++++++++++++
>>>   2 files changed, 57 insertions(+)
>>>
>>> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
>>> index be83b45..a8c353c 100644
>>> --- a/amdgpu/amdgpu.h
>>> +++ b/amdgpu/amdgpu.h
>>> @@ -678,6 +678,29 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>>                       amdgpu_bo_handle *buf_handle);
>>>     /**
>>> + * Validate if the user memory comes from BO
>>> + *
>>> + * \param dev - [in] Device handle. See #amdgpu_device_initialize()
>>> + * \param cpu - [in] CPU address of user allocated memory which we
>>> + * want to map to GPU address space (make GPU accessible)
>>> + * (This address must be correctly aligned).
>>> + * \param size - [in] Size of allocation (must be correctly aligned)
>>> + * \param buf_handle - [out] Buffer handle for the userptr memory
>>> + * if the user memory is not from BO, the buf_handle will be NULL.
>>> + * \param offset_in_bo - [out] offset in this BO for this user memory
>>> + *
>>> + *
>>> + * \return   0 on success\n
>>> + *          <0 - Negative POSIX Error code
>>> + *
>>> +*/
>>> +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
>>> +                  void *cpu,
>>> +                  uint64_t size,
>>> +                  amdgpu_bo_handle *buf_handle,
>>> +                  uint64_t *offset_in_bo);
>>> +
>>> +/**
>>>    * Free previosuly allocated memory
>>>    *
>>>    * \param   dev           - \c [in] Device handle. See #amdgpu_device_initialize()
>>> diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
>>> index b24e698..a7f0662 100644
>>> --- a/amdgpu/amdgpu_bo.c
>>> +++ b/amdgpu/amdgpu_bo.c
>>> @@ -529,6 +529,40 @@ int amdgpu_bo_wait_for_idle(amdgpu_bo_handle bo,
>>>       }
>>>   }
>>>   +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
>>> +                  void *cpu,
>>> +                  uint64_t size,
>>> +                  amdgpu_bo_handle *buf_handle,
>>> +                  uint64_t *offset_in_bo)
>>> +{
>>> +    int i;
>>> +    struct amdgpu_bo *bo;
>>> +
>>> +    if (cpu == NULL || size == 0)
>>> +        return -EINVAL;
>>> +
>>> +    pthread_mutex_lock(&dev->bo_table_mutex);
>>> +    for (i = 0; i < dev->bo_handles.max_key; i++) {
>> Hi Jerry,
>>
>> As Christian catched before, iterating all BOs of device will introduce much CPU overhead, this isn't good direction.
>> Since cpu virtual address is per-process, you should go to kernel to find them from vm tree, which obviously takes less time.
>
> Yeah, but is also much more overhead to maintain.
>
> Since this is only to fix the behavior of a single buggy application at least I'm fine to keep the workaround as simple as this.
>
> If we find a wider use we can still start to use the kernel implementation again.

Thanks you all to clarify that.

May I get RB for this patch?
Then I could work on the patch 4 only.
Thanks.

Regards,
Jerry

>
> Regards,
> Christian.
>
>>
>> Regards,
>> David Zhou
>>> +        bo = handle_table_lookup(&dev->bo_handles, i);
>>> +        if (!bo || !bo->cpu_ptr || size > bo->alloc_size)
>>> +            continue;
>>> +        if (cpu >= bo->cpu_ptr && cpu < (bo->cpu_ptr + bo->alloc_size))
>>> +            break;
>>> +    }
>>> +
>>> +    if (i < dev->bo_handles.max_key) {
>>> +        atomic_inc(&bo->refcount);
>>> +        *buf_handle = bo;
>>> +        *offset_in_bo = cpu - bo->cpu_ptr;
>>> +    } else {
>>> +        *buf_handle = NULL;
>>> +        *offset_in_bo = 0;
>>> +    }
>>> +    pthread_mutex_unlock(&dev->bo_table_mutex);
>>> +
>>> +    return 0;
>>> +}
>>> +
>>>   int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>>                       void *cpu,
>>>                       uint64_t size,
>>
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* Re: [PATCH libdrm 2/4] amdgpu: add a function to find bo by cpu mapping (v2)
       [not found]             ` <2f043d23-5266-4dfc-a703-119a5e9acb5f-5C7GfCeVMHo@public.gmane.org>
  2018-08-08  8:11               ` Zhang, Jerry (Junwei)
@ 2018-08-08  8:43               ` zhoucm1
       [not found]                 ` <5ddfa3f1-c71e-0dd8-3ec8-42bc646e3d69-5C7GfCeVMHo@public.gmane.org>
  1 sibling, 1 reply; 13+ messages in thread
From: zhoucm1 @ 2018-08-08  8:43 UTC (permalink / raw)
  To: Christian König, Junwei Zhang,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW



On 2018年08月08日 14:48, Christian König wrote:
> Am 08.08.2018 um 06:23 schrieb zhoucm1:
>>
>>
>> On 2018年08月08日 12:08, Junwei Zhang wrote:
>>> Userspace needs to know if the user memory is from BO or malloc.
>>>
>>> v2: update mutex range and rebase
>>>
>>> Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
>>> ---
>>>   amdgpu/amdgpu.h    | 23 +++++++++++++++++++++++
>>>   amdgpu/amdgpu_bo.c | 34 ++++++++++++++++++++++++++++++++++
>>>   2 files changed, 57 insertions(+)
>>>
>>> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
>>> index be83b45..a8c353c 100644
>>> --- a/amdgpu/amdgpu.h
>>> +++ b/amdgpu/amdgpu.h
>>> @@ -678,6 +678,29 @@ int 
>>> amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>>                       amdgpu_bo_handle *buf_handle);
>>>     /**
>>> + * Validate if the user memory comes from BO
>>> + *
>>> + * \param dev - [in] Device handle. See #amdgpu_device_initialize()
>>> + * \param cpu - [in] CPU address of user allocated memory which we
>>> + * want to map to GPU address space (make GPU accessible)
>>> + * (This address must be correctly aligned).
>>> + * \param size - [in] Size of allocation (must be correctly aligned)
>>> + * \param buf_handle - [out] Buffer handle for the userptr memory
>>> + * if the user memory is not from BO, the buf_handle will be NULL.
>>> + * \param offset_in_bo - [out] offset in this BO for this user memory
>>> + *
>>> + *
>>> + * \return   0 on success\n
>>> + *          <0 - Negative POSIX Error code
>>> + *
>>> +*/
>>> +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
>>> +                  void *cpu,
>>> +                  uint64_t size,
>>> +                  amdgpu_bo_handle *buf_handle,
>>> +                  uint64_t *offset_in_bo);
>>> +
>>> +/**
>>>    * Free previosuly allocated memory
>>>    *
>>>    * \param   dev           - \c [in] Device handle. See 
>>> #amdgpu_device_initialize()
>>> diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
>>> index b24e698..a7f0662 100644
>>> --- a/amdgpu/amdgpu_bo.c
>>> +++ b/amdgpu/amdgpu_bo.c
>>> @@ -529,6 +529,40 @@ int amdgpu_bo_wait_for_idle(amdgpu_bo_handle bo,
>>>       }
>>>   }
>>>   +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
>>> +                  void *cpu,
>>> +                  uint64_t size,
>>> +                  amdgpu_bo_handle *buf_handle,
>>> +                  uint64_t *offset_in_bo)
>>> +{
>>> +    int i;
>>> +    struct amdgpu_bo *bo;
>>> +
>>> +    if (cpu == NULL || size == 0)
>>> +        return -EINVAL;
>>> +
>>> +    pthread_mutex_lock(&dev->bo_table_mutex);
>>> +    for (i = 0; i < dev->bo_handles.max_key; i++) {
>> Hi Jerry,
>>
>> As Christian catched before, iterating all BOs of device will 
>> introduce much CPU overhead, this isn't good direction.
>> Since cpu virtual address is per-process, you should go to kernel to 
>> find them from vm tree, which obviously takes less time.
>
> Yeah, but is also much more overhead to maintain.
>
> Since this is only to fix the behavior of a single buggy application 
> at least I'm fine to keep the workaround as simple as this.
I like 'workaround' expression, if Jerry adds 'workaround' comments 
here, I'm ok as well.

Regards,
David Zhou
>
> If we find a wider use we can still start to use the kernel 
> implementation again.
>
> Regards,
> Christian.
>
>>
>> Regards,
>> David Zhou
>>> +        bo = handle_table_lookup(&dev->bo_handles, i);
>>> +        if (!bo || !bo->cpu_ptr || size > bo->alloc_size)
>>> +            continue;
>>> +        if (cpu >= bo->cpu_ptr && cpu < (bo->cpu_ptr + 
>>> bo->alloc_size))
>>> +            break;
>>> +    }
>>> +
>>> +    if (i < dev->bo_handles.max_key) {
>>> +        atomic_inc(&bo->refcount);
>>> +        *buf_handle = bo;
>>> +        *offset_in_bo = cpu - bo->cpu_ptr;
>>> +    } else {
>>> +        *buf_handle = NULL;
>>> +        *offset_in_bo = 0;
>>> +    }
>>> +    pthread_mutex_unlock(&dev->bo_table_mutex);
>>> +
>>> +    return 0;
>>> +}
>>> +
>>>   int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>>                       void *cpu,
>>>                       uint64_t size,
>>
>

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* Re: [PATCH libdrm 2/4] amdgpu: add a function to find bo by cpu mapping (v2)
       [not found]                 ` <5ddfa3f1-c71e-0dd8-3ec8-42bc646e3d69-5C7GfCeVMHo@public.gmane.org>
@ 2018-08-08  8:51                   ` Christian König
       [not found]                     ` <7858ed2f-e504-f477-09a7-cd0b5ce90c58-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 13+ messages in thread
From: Christian König @ 2018-08-08  8:51 UTC (permalink / raw)
  To: zhoucm1, Christian König, Junwei Zhang,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Am 08.08.2018 um 10:43 schrieb zhoucm1:
>
>
> On 2018年08月08日 14:48, Christian König wrote:
>> Am 08.08.2018 um 06:23 schrieb zhoucm1:
>>>
>>>
>>> On 2018年08月08日 12:08, Junwei Zhang wrote:
>>>> Userspace needs to know if the user memory is from BO or malloc.
>>>>
>>>> v2: update mutex range and rebase
>>>>
>>>> Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
>>>> ---
>>>>   amdgpu/amdgpu.h    | 23 +++++++++++++++++++++++
>>>>   amdgpu/amdgpu_bo.c | 34 ++++++++++++++++++++++++++++++++++
>>>>   2 files changed, 57 insertions(+)
>>>>
>>>> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
>>>> index be83b45..a8c353c 100644
>>>> --- a/amdgpu/amdgpu.h
>>>> +++ b/amdgpu/amdgpu.h
>>>> @@ -678,6 +678,29 @@ int 
>>>> amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>>>                       amdgpu_bo_handle *buf_handle);
>>>>     /**
>>>> + * Validate if the user memory comes from BO
>>>> + *
>>>> + * \param dev - [in] Device handle. See #amdgpu_device_initialize()
>>>> + * \param cpu - [in] CPU address of user allocated memory which we
>>>> + * want to map to GPU address space (make GPU accessible)
>>>> + * (This address must be correctly aligned).
>>>> + * \param size - [in] Size of allocation (must be correctly aligned)
>>>> + * \param buf_handle - [out] Buffer handle for the userptr memory
>>>> + * if the user memory is not from BO, the buf_handle will be NULL.
>>>> + * \param offset_in_bo - [out] offset in this BO for this user memory
>>>> + *
>>>> + *
>>>> + * \return   0 on success\n
>>>> + *          <0 - Negative POSIX Error code
>>>> + *
>>>> +*/
>>>> +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
>>>> +                  void *cpu,
>>>> +                  uint64_t size,
>>>> +                  amdgpu_bo_handle *buf_handle,
>>>> +                  uint64_t *offset_in_bo);
>>>> +
>>>> +/**
>>>>    * Free previosuly allocated memory
>>>>    *
>>>>    * \param   dev           - \c [in] Device handle. See 
>>>> #amdgpu_device_initialize()
>>>> diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
>>>> index b24e698..a7f0662 100644
>>>> --- a/amdgpu/amdgpu_bo.c
>>>> +++ b/amdgpu/amdgpu_bo.c
>>>> @@ -529,6 +529,40 @@ int amdgpu_bo_wait_for_idle(amdgpu_bo_handle bo,
>>>>       }
>>>>   }
>>>>   +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
>>>> +                  void *cpu,
>>>> +                  uint64_t size,
>>>> +                  amdgpu_bo_handle *buf_handle,
>>>> +                  uint64_t *offset_in_bo)
>>>> +{
>>>> +    int i;
>>>> +    struct amdgpu_bo *bo;
>>>> +
>>>> +    if (cpu == NULL || size == 0)
>>>> +        return -EINVAL;
>>>> +
>>>> +    pthread_mutex_lock(&dev->bo_table_mutex);
>>>> +    for (i = 0; i < dev->bo_handles.max_key; i++) {
>>> Hi Jerry,
>>>
>>> As Christian catched before, iterating all BOs of device will 
>>> introduce much CPU overhead, this isn't good direction.
>>> Since cpu virtual address is per-process, you should go to kernel to 
>>> find them from vm tree, which obviously takes less time.
>>
>> Yeah, but is also much more overhead to maintain.
>>
>> Since this is only to fix the behavior of a single buggy application 
>> at least I'm fine to keep the workaround as simple as this.
> I like 'workaround' expression, if Jerry adds 'workaround' comments 
> here, I'm ok as well.

Yeah, agree a code comment is probably a good idea. Something like

/* Workaround for a buggy application which tries to import previously 
exposed CPU pointers.
  * If we find a real world use case we should improve that by asking 
the kernel for the right handle.
  */

With that added the patch is Reviewed-by: Christian König 
<christian.koenig@amd.com>.

Regards,
Christian.

>
> Regards,
> David Zhou
>>
>> If we find a wider use we can still start to use the kernel 
>> implementation again.
>>
>> Regards,
>> Christian.
>>
>>>
>>> Regards,
>>> David Zhou
>>>> +        bo = handle_table_lookup(&dev->bo_handles, i);
>>>> +        if (!bo || !bo->cpu_ptr || size > bo->alloc_size)
>>>> +            continue;
>>>> +        if (cpu >= bo->cpu_ptr && cpu < (bo->cpu_ptr + 
>>>> bo->alloc_size))
>>>> +            break;
>>>> +    }
>>>> +
>>>> +    if (i < dev->bo_handles.max_key) {
>>>> +        atomic_inc(&bo->refcount);
>>>> +        *buf_handle = bo;
>>>> +        *offset_in_bo = cpu - bo->cpu_ptr;
>>>> +    } else {
>>>> +        *buf_handle = NULL;
>>>> +        *offset_in_bo = 0;
>>>> +    }
>>>> +    pthread_mutex_unlock(&dev->bo_table_mutex);
>>>> +
>>>> +    return 0;
>>>> +}
>>>> +
>>>>   int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>>>                       void *cpu,
>>>>                       uint64_t size,
>>>
>>
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

* Re: [PATCH libdrm 2/4] amdgpu: add a function to find bo by cpu mapping (v2)
       [not found]                     ` <7858ed2f-e504-f477-09a7-cd0b5ce90c58-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2018-08-08  9:45                       ` Zhang, Jerry (Junwei)
  0 siblings, 0 replies; 13+ messages in thread
From: Zhang, Jerry (Junwei) @ 2018-08-08  9:45 UTC (permalink / raw)
  To: christian.koenig-5C7GfCeVMHo, zhoucm1,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On 08/08/2018 04:51 PM, Christian König wrote:
> Am 08.08.2018 um 10:43 schrieb zhoucm1:
>>
>>
>> On 2018年08月08日 14:48, Christian König wrote:
>>> Am 08.08.2018 um 06:23 schrieb zhoucm1:
>>>>
>>>>
>>>> On 2018年08月08日 12:08, Junwei Zhang wrote:
>>>>> Userspace needs to know if the user memory is from BO or malloc.
>>>>>
>>>>> v2: update mutex range and rebase
>>>>>
>>>>> Signed-off-by: Junwei Zhang <Jerry.Zhang@amd.com>
>>>>> ---
>>>>>   amdgpu/amdgpu.h    | 23 +++++++++++++++++++++++
>>>>>   amdgpu/amdgpu_bo.c | 34 ++++++++++++++++++++++++++++++++++
>>>>>   2 files changed, 57 insertions(+)
>>>>>
>>>>> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
>>>>> index be83b45..a8c353c 100644
>>>>> --- a/amdgpu/amdgpu.h
>>>>> +++ b/amdgpu/amdgpu.h
>>>>> @@ -678,6 +678,29 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>>>>                       amdgpu_bo_handle *buf_handle);
>>>>>     /**
>>>>> + * Validate if the user memory comes from BO
>>>>> + *
>>>>> + * \param dev - [in] Device handle. See #amdgpu_device_initialize()
>>>>> + * \param cpu - [in] CPU address of user allocated memory which we
>>>>> + * want to map to GPU address space (make GPU accessible)
>>>>> + * (This address must be correctly aligned).
>>>>> + * \param size - [in] Size of allocation (must be correctly aligned)
>>>>> + * \param buf_handle - [out] Buffer handle for the userptr memory
>>>>> + * if the user memory is not from BO, the buf_handle will be NULL.
>>>>> + * \param offset_in_bo - [out] offset in this BO for this user memory
>>>>> + *
>>>>> + *
>>>>> + * \return   0 on success\n
>>>>> + *          <0 - Negative POSIX Error code
>>>>> + *
>>>>> +*/
>>>>> +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
>>>>> +                  void *cpu,
>>>>> +                  uint64_t size,
>>>>> +                  amdgpu_bo_handle *buf_handle,
>>>>> +                  uint64_t *offset_in_bo);
>>>>> +
>>>>> +/**
>>>>>    * Free previosuly allocated memory
>>>>>    *
>>>>>    * \param   dev           - \c [in] Device handle. See #amdgpu_device_initialize()
>>>>> diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
>>>>> index b24e698..a7f0662 100644
>>>>> --- a/amdgpu/amdgpu_bo.c
>>>>> +++ b/amdgpu/amdgpu_bo.c
>>>>> @@ -529,6 +529,40 @@ int amdgpu_bo_wait_for_idle(amdgpu_bo_handle bo,
>>>>>       }
>>>>>   }
>>>>>   +int amdgpu_find_bo_by_cpu_mapping(amdgpu_device_handle dev,
>>>>> +                  void *cpu,
>>>>> +                  uint64_t size,
>>>>> +                  amdgpu_bo_handle *buf_handle,
>>>>> +                  uint64_t *offset_in_bo)
>>>>> +{
>>>>> +    int i;
>>>>> +    struct amdgpu_bo *bo;
>>>>> +
>>>>> +    if (cpu == NULL || size == 0)
>>>>> +        return -EINVAL;
>>>>> +
>>>>> +    pthread_mutex_lock(&dev->bo_table_mutex);
>>>>> +    for (i = 0; i < dev->bo_handles.max_key; i++) {
>>>> Hi Jerry,
>>>>
>>>> As Christian catched before, iterating all BOs of device will introduce much CPU overhead, this isn't good direction.
>>>> Since cpu virtual address is per-process, you should go to kernel to find them from vm tree, which obviously takes less time.
>>>
>>> Yeah, but is also much more overhead to maintain.
>>>
>>> Since this is only to fix the behavior of a single buggy application at least I'm fine to keep the workaround as simple as this.
>> I like 'workaround' expression, if Jerry adds 'workaround' comments here, I'm ok as well.
>
> Yeah, agree a code comment is probably a good idea. Something like
>
> /* Workaround for a buggy application which tries to import previously exposed CPU pointers.
>   * If we find a real world use case we should improve that by asking the kernel for the right handle.
>   */
>
> With that added the patch is Reviewed-by: Christian König <christian.koenig@amd.com>.

Thanks you all, will add that comments.

BTW, Christian, SRDC still has no permission to get the new drm repo,
since git port is blocked by local network manager.

I could prepare those patches in gfx mail list, anyone will help to push them?

Regards,
Jerry

>
> Regards,
> Christian.
>
>>
>> Regards,
>> David Zhou
>>>
>>> If we find a wider use we can still start to use the kernel implementation again.
>>>
>>> Regards,
>>> Christian.
>>>
>>>>
>>>> Regards,
>>>> David Zhou
>>>>> +        bo = handle_table_lookup(&dev->bo_handles, i);
>>>>> +        if (!bo || !bo->cpu_ptr || size > bo->alloc_size)
>>>>> +            continue;
>>>>> +        if (cpu >= bo->cpu_ptr && cpu < (bo->cpu_ptr + bo->alloc_size))
>>>>> +            break;
>>>>> +    }
>>>>> +
>>>>> +    if (i < dev->bo_handles.max_key) {
>>>>> +        atomic_inc(&bo->refcount);
>>>>> +        *buf_handle = bo;
>>>>> +        *offset_in_bo = cpu - bo->cpu_ptr;
>>>>> +    } else {
>>>>> +        *buf_handle = NULL;
>>>>> +        *offset_in_bo = 0;
>>>>> +    }
>>>>> +    pthread_mutex_unlock(&dev->bo_table_mutex);
>>>>> +
>>>>> +    return 0;
>>>>> +}
>>>>> +
>>>>>   int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
>>>>>                       void *cpu,
>>>>>                       uint64_t size,
>>>>
>>>
>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

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

end of thread, other threads:[~2018-08-08  9:45 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-08-08  4:08 [PATCH libdrm 1/4] amdgpu: add bo from user memory to handle table Junwei Zhang
     [not found] ` <1533701320-23661-1-git-send-email-Jerry.Zhang-5C7GfCeVMHo@public.gmane.org>
2018-08-08  4:08   ` [PATCH libdrm 2/4] amdgpu: add a function to find bo by cpu mapping (v2) Junwei Zhang
     [not found]     ` <1533701320-23661-2-git-send-email-Jerry.Zhang-5C7GfCeVMHo@public.gmane.org>
2018-08-08  4:23       ` zhoucm1
     [not found]         ` <b40df073-fc49-0e32-901d-2193f38700ea-5C7GfCeVMHo@public.gmane.org>
2018-08-08  6:48           ` Christian König
     [not found]             ` <2f043d23-5266-4dfc-a703-119a5e9acb5f-5C7GfCeVMHo@public.gmane.org>
2018-08-08  8:11               ` Zhang, Jerry (Junwei)
2018-08-08  8:43               ` zhoucm1
     [not found]                 ` <5ddfa3f1-c71e-0dd8-3ec8-42bc646e3d69-5C7GfCeVMHo@public.gmane.org>
2018-08-08  8:51                   ` Christian König
     [not found]                     ` <7858ed2f-e504-f477-09a7-cd0b5ce90c58-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-08-08  9:45                       ` Zhang, Jerry (Junwei)
2018-08-08  4:08   ` [PATCH libdrm 3/4] tests/amdgpu: add test for finding bo by CPU mapping Junwei Zhang
2018-08-08  4:08   ` [PATCH libdrm 4/4] amdgpu: add a function to create amdgpu bo internally Junwei Zhang
     [not found]     ` <1533701320-23661-4-git-send-email-Jerry.Zhang-5C7GfCeVMHo@public.gmane.org>
2018-08-08  6:51       ` Christian König
     [not found]         ` <1371bf42-2f74-f45b-d1f4-113cd44b806a-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-08-08  7:12           ` Zhang, Jerry (Junwei)
     [not found]             ` <5B6A97FB.3000003-5C7GfCeVMHo@public.gmane.org>
2018-08-08  7:18               ` 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.