aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/5715-drm-amdkfd-change-system-memory-overcommit-limit.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5715-drm-amdkfd-change-system-memory-overcommit-limit.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/5715-drm-amdkfd-change-system-memory-overcommit-limit.patch208
1 files changed, 208 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5715-drm-amdkfd-change-system-memory-overcommit-limit.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5715-drm-amdkfd-change-system-memory-overcommit-limit.patch
new file mode 100644
index 00000000..30a33a7e
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5715-drm-amdkfd-change-system-memory-overcommit-limit.patch
@@ -0,0 +1,208 @@
+From 60d88de85ee6c3e91253719333071f4c15d864a1 Mon Sep 17 00:00:00 2001
+From: Eric Huang <JinhuiEric.Huang@amd.com>
+Date: Wed, 5 Sep 2018 11:46:14 -0400
+Subject: [PATCH 5715/5725] drm/amdkfd: change system memory overcommit limit
+
+It is to improve system limit by:
+1. replacing userptrlimit with a total memory limit that
+conunts TTM memory usage and userptr usage.
+2. counting acc size for all BOs.
+
+KFD-387
+
+Change-Id: I30a356c5cb7517a7e7ad5425de4e79cfc3109594
+Signed-off-by: Eric Huang <JinHuiEric.Huang@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 106 +++++++++++++----------
+ 1 file changed, 59 insertions(+), 47 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+index 8cd9f0d..15a64e8 100755
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+@@ -41,9 +41,9 @@
+ /* Impose limit on how much memory KFD can use */
+ static struct {
+ uint64_t max_system_mem_limit;
+- uint64_t max_userptr_mem_limit;
++ uint64_t max_ttm_mem_limit;
+ int64_t system_mem_used;
+- int64_t userptr_mem_used;
++ int64_t ttm_mem_used;
+ spinlock_t mem_limit_lock;
+ } kfd_mem_limit;
+
+@@ -85,8 +85,8 @@ static bool check_if_add_bo_to_vm(struct amdgpu_vm *avm,
+ }
+
+ /* Set memory usage limits. Current, limits are
+- * System (kernel) memory - 3/8th System RAM
+- * Userptr memory - 3/4th System RAM
++ * System (TTM + userptr) memory - 3/4th System RAM
++ * TTM memory - 3/8th System RAM
+ */
+ void amdgpu_amdkfd_gpuvm_init_mem_limits(void)
+ {
+@@ -98,48 +98,54 @@ void amdgpu_amdkfd_gpuvm_init_mem_limits(void)
+ mem *= si.mem_unit;
+
+ spin_lock_init(&kfd_mem_limit.mem_limit_lock);
+- kfd_mem_limit.max_system_mem_limit = (mem >> 1) - (mem >> 3);
+- kfd_mem_limit.max_userptr_mem_limit = mem - (mem >> 2);
+- pr_debug("Kernel memory limit %lluM, userptr limit %lluM\n",
++ kfd_mem_limit.max_system_mem_limit = (mem >> 1) + (mem >> 2);
++ kfd_mem_limit.max_ttm_mem_limit = (mem >> 1) - (mem >> 3);
++ pr_debug("Kernel memory limit %lluM, TTM limit %lluM\n",
+ (kfd_mem_limit.max_system_mem_limit >> 20),
+- (kfd_mem_limit.max_userptr_mem_limit >> 20));
++ (kfd_mem_limit.max_ttm_mem_limit >> 20));
+ }
+
+ static int amdgpu_amdkfd_reserve_system_mem_limit(struct amdgpu_device *adev,
+- uint64_t size, u32 domain)
++ uint64_t size, u32 domain, bool sg)
+ {
+- size_t acc_size;
++ size_t acc_size, system_mem_needed, ttm_mem_needed;
+ int ret = 0;
+
+ acc_size = ttm_bo_dma_acc_size(&adev->mman.bdev, size,
+ sizeof(struct amdgpu_bo));
+
+ spin_lock(&kfd_mem_limit.mem_limit_lock);
++
+ if (domain == AMDGPU_GEM_DOMAIN_GTT) {
+- if (kfd_mem_limit.system_mem_used + (acc_size + size) >
+- kfd_mem_limit.max_system_mem_limit) {
+- ret = -ENOMEM;
+- goto err_no_mem;
+- }
+- kfd_mem_limit.system_mem_used += (acc_size + size);
+- } else if (domain == AMDGPU_GEM_DOMAIN_CPU) {
+- if ((kfd_mem_limit.system_mem_used + acc_size >
+- kfd_mem_limit.max_system_mem_limit) ||
+- (kfd_mem_limit.userptr_mem_used + (size + acc_size) >
+- kfd_mem_limit.max_userptr_mem_limit)) {
+- ret = -ENOMEM;
+- goto err_no_mem;
+- }
+- kfd_mem_limit.system_mem_used += acc_size;
+- kfd_mem_limit.userptr_mem_used += size;
++ /* TTM GTT memory */
++ system_mem_needed = acc_size + size;
++ ttm_mem_needed = acc_size + size;
++ } else if (domain == AMDGPU_GEM_DOMAIN_CPU && !sg) {
++ /* Userptr */
++ system_mem_needed = acc_size + size;
++ ttm_mem_needed = acc_size;
++ } else {
++ /* VRAM and SG */
++ system_mem_needed = acc_size;
++ ttm_mem_needed = acc_size;
+ }
+-err_no_mem:
++
++ if ((kfd_mem_limit.system_mem_used + system_mem_needed >
++ kfd_mem_limit.max_system_mem_limit) ||
++ (kfd_mem_limit.ttm_mem_used + ttm_mem_needed >
++ kfd_mem_limit.max_ttm_mem_limit))
++ ret = -ENOMEM;
++ else {
++ kfd_mem_limit.system_mem_used += system_mem_needed;
++ kfd_mem_limit.ttm_mem_used += ttm_mem_needed;
++ }
++
+ spin_unlock(&kfd_mem_limit.mem_limit_lock);
+ return ret;
+ }
+
+ static void unreserve_system_mem_limit(struct amdgpu_device *adev,
+- uint64_t size, u32 domain)
++ uint64_t size, u32 domain, bool sg)
+ {
+ size_t acc_size;
+
+@@ -149,14 +155,18 @@ static void unreserve_system_mem_limit(struct amdgpu_device *adev,
+ spin_lock(&kfd_mem_limit.mem_limit_lock);
+ if (domain == AMDGPU_GEM_DOMAIN_GTT) {
+ kfd_mem_limit.system_mem_used -= (acc_size + size);
+- } else if (domain == AMDGPU_GEM_DOMAIN_CPU) {
++ kfd_mem_limit.ttm_mem_used -= (acc_size + size);
++ } else if (domain == AMDGPU_GEM_DOMAIN_CPU && !sg) {
++ kfd_mem_limit.system_mem_used -= (acc_size + size);
++ kfd_mem_limit.ttm_mem_used -= acc_size;
++ } else {
+ kfd_mem_limit.system_mem_used -= acc_size;
+- kfd_mem_limit.userptr_mem_used -= size;
++ kfd_mem_limit.ttm_mem_used -= acc_size;
+ }
+ WARN_ONCE(kfd_mem_limit.system_mem_used < 0,
+ "kfd system memory accounting unbalanced");
+- WARN_ONCE(kfd_mem_limit.userptr_mem_used < 0,
+- "kfd userptr memory accounting unbalanced");
++ WARN_ONCE(kfd_mem_limit.ttm_mem_used < 0,
++ "kfd TTM memory accounting unbalanced");
+
+ spin_unlock(&kfd_mem_limit.mem_limit_lock);
+ }
+@@ -166,17 +176,22 @@ void amdgpu_amdkfd_unreserve_system_memory_limit(struct amdgpu_bo *bo)
+ spin_lock(&kfd_mem_limit.mem_limit_lock);
+
+ if (bo->flags & AMDGPU_AMDKFD_USERPTR_BO) {
+- kfd_mem_limit.system_mem_used -= bo->tbo.acc_size;
+- kfd_mem_limit.userptr_mem_used -= amdgpu_bo_size(bo);
+- } else if (bo->preferred_domains == AMDGPU_GEM_DOMAIN_GTT &&
+- !bo->tbo.sg) {
+ kfd_mem_limit.system_mem_used -=
+ (bo->tbo.acc_size + amdgpu_bo_size(bo));
++ kfd_mem_limit.ttm_mem_used -= bo->tbo.acc_size;
++ } else if (bo->preferred_domains == AMDGPU_GEM_DOMAIN_GTT) {
++ kfd_mem_limit.system_mem_used -=
++ (bo->tbo.acc_size + amdgpu_bo_size(bo));
++ kfd_mem_limit.ttm_mem_used -=
++ (bo->tbo.acc_size + amdgpu_bo_size(bo));
++ } else {
++ kfd_mem_limit.system_mem_used -= bo->tbo.acc_size;
++ kfd_mem_limit.ttm_mem_used -= bo->tbo.acc_size;
+ }
+ WARN_ONCE(kfd_mem_limit.system_mem_used < 0,
+ "kfd system memory accounting unbalanced");
+- WARN_ONCE(kfd_mem_limit.userptr_mem_used < 0,
+- "kfd userptr memory accounting unbalanced");
++ WARN_ONCE(kfd_mem_limit.ttm_mem_used < 0,
++ "kfd TTM memory accounting unbalanced");
+
+ spin_unlock(&kfd_mem_limit.mem_limit_lock);
+ }
+@@ -1285,13 +1300,11 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
+
+ amdgpu_sync_create(&(*mem)->sync);
+
+- if (!sg) {
+- ret = amdgpu_amdkfd_reserve_system_mem_limit(adev, size,
+- alloc_domain);
+- if (ret) {
+- pr_debug("Insufficient system memory\n");
+- goto err_reserve_limit;
+- }
++ ret = amdgpu_amdkfd_reserve_system_mem_limit(adev, size,
++ alloc_domain, !!sg);
++ if (ret) {
++ pr_debug("Insufficient system memory\n");
++ goto err_reserve_limit;
+ }
+
+ pr_debug("\tcreate BO VA 0x%llx size 0x%llx domain %s\n",
+@@ -1346,8 +1359,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
+ /* Don't unreserve system mem limit twice */
+ goto err_reserve_limit;
+ err_bo_create:
+- if (!sg)
+- unreserve_system_mem_limit(adev, size, alloc_domain);
++ unreserve_system_mem_limit(adev, size, alloc_domain, !!sg);
+ err_reserve_limit:
+ kfree(*mem);
+ err:
+--
+2.7.4
+