diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3156-drm-amdgpu-add-amdgpu_pasid_free_delayed-v2.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3156-drm-amdgpu-add-amdgpu_pasid_free_delayed-v2.patch | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3156-drm-amdgpu-add-amdgpu_pasid_free_delayed-v2.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3156-drm-amdgpu-add-amdgpu_pasid_free_delayed-v2.patch new file mode 100644 index 00000000..b18e5f41 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3156-drm-amdgpu-add-amdgpu_pasid_free_delayed-v2.patch @@ -0,0 +1,135 @@ +From daf043ca15be67b50a4b8f49a83d3bcf68cbdb0e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Fri, 5 Jan 2018 11:16:22 +0100 +Subject: [PATCH 3156/4131] drm/amdgpu: add amdgpu_pasid_free_delayed v2 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Free up a pasid after all fences signaled. + +v2: also handle the case when we can't allocate a fence array. + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Chunming Zhou <david1.zhou@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 82 +++++++++++++++++++++++++++++++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h | 2 + + 2 files changed, 84 insertions(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c +index 8645460..1dcfaee 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c +@@ -44,6 +44,12 @@ static DEFINE_IDA(amdgpu_vm_pasid_ida); + static DEFINE_IDA2(amdgpu_vm_pasid_ida); + #endif + ++/* Helper to free pasid from a fence callback */ ++struct amdgpu_pasid_cb { ++ struct dma_fence_cb cb; ++ unsigned int pasid; ++}; ++ + /** + * amdgpu_pasid_alloc - Allocate a PASID + * @bits: Maximum width of the PASID in bits, must be at least 1 +@@ -79,6 +85,82 @@ void amdgpu_pasid_free(unsigned int pasid) + ida_simple_remove(&amdgpu_vm_pasid_ida, pasid); + } + ++static void amdgpu_pasid_free_cb(struct dma_fence *fence, ++ struct dma_fence_cb *_cb) ++{ ++ struct amdgpu_pasid_cb *cb = ++ container_of(_cb, struct amdgpu_pasid_cb, cb); ++ ++ amdgpu_pasid_free(cb->pasid); ++ dma_fence_put(fence); ++ kfree(cb); ++} ++ ++/** ++ * amdgpu_pasid_free_delayed - free pasid when fences signal ++ * ++ * @resv: reservation object with the fences to wait for ++ * @pasid: pasid to free ++ * ++ * Free the pasid only after all the fences in resv are signaled. ++ */ ++void amdgpu_pasid_free_delayed(struct reservation_object *resv, ++ unsigned int pasid) ++{ ++ struct dma_fence *fence, **fences; ++ struct amdgpu_pasid_cb *cb; ++ unsigned count; ++ int r; ++ ++ r = reservation_object_get_fences_rcu(resv, NULL, &count, &fences); ++ if (r) ++ goto fallback; ++ ++ if (count == 0) { ++ amdgpu_pasid_free(pasid); ++ return; ++ } ++ ++ if (count == 1) { ++ fence = fences[0]; ++ kfree(fences); ++ } else { ++ uint64_t context = dma_fence_context_alloc(1); ++ struct dma_fence_array *array; ++ ++ array = dma_fence_array_create(count, fences, context, ++ 1, false); ++ if (!array) { ++ kfree(fences); ++ goto fallback; ++ } ++ fence = &array->base; ++ } ++ ++ cb = kmalloc(sizeof(*cb), GFP_KERNEL); ++ if (!cb) { ++ /* Last resort when we are OOM */ ++ dma_fence_wait(fence, false); ++ dma_fence_put(fence); ++ amdgpu_pasid_free(pasid); ++ } else { ++ cb->pasid = pasid; ++ if (dma_fence_add_callback(fence, &cb->cb, ++ amdgpu_pasid_free_cb)) ++ amdgpu_pasid_free_cb(fence, &cb->cb); ++ } ++ ++ return; ++ ++fallback: ++ /* Not enough memory for the delayed delete, as last resort ++ * block for all the fences to complete. ++ */ ++ reservation_object_wait_timeout_rcu(resv, true, false, ++ MAX_SCHEDULE_TIMEOUT); ++ amdgpu_pasid_free(pasid); ++} ++ + /* + * VMID manager + * +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h +index ad931fa..38f37c1 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h +@@ -69,6 +69,8 @@ struct amdgpu_vmid_mgr { + + int amdgpu_pasid_alloc(unsigned int bits); + void amdgpu_pasid_free(unsigned int pasid); ++void amdgpu_pasid_free_delayed(struct reservation_object *resv, ++ unsigned int pasid); + + bool amdgpu_vmid_had_gpu_reset(struct amdgpu_device *adev, + struct amdgpu_vmid *id); +-- +2.7.4 + |