diff options
author | Felix Kuehling <Felix.Kuehling@amd.com> | 2015-11-23 17:43:48 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-12-21 16:39:14 -0500 |
commit | 005ae95e6ec119c64e2d16eb65a94c49e1dcf9f0 (patch) | |
tree | 8739151b1ce8a4d1645e980a9297abe9a4936bc8 /drivers/gpu/drm/amd/amdgpu | |
parent | 42ef344c0994cc453477afdc7a8eadc578ed0257 (diff) |
drm/amdgpu: Fix off-by-one errors in amdgpu_vm_bo_map
eaddr is sometimes treated as the last address inside the address
range, and sometimes as the first address outside the range. This
was resulting in errors when a test filled up the entire address
space. Make it consistent to always be the last address within the
range.
Signed-off-by: Felix.Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index e0fa9d9ff5c2..d6ff5dad98f6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -1010,13 +1010,13 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, | |||
1010 | return -EINVAL; | 1010 | return -EINVAL; |
1011 | 1011 | ||
1012 | /* make sure object fit at this offset */ | 1012 | /* make sure object fit at this offset */ |
1013 | eaddr = saddr + size; | 1013 | eaddr = saddr + size - 1; |
1014 | if ((saddr >= eaddr) || (offset + size > amdgpu_bo_size(bo_va->bo))) | 1014 | if ((saddr >= eaddr) || (offset + size > amdgpu_bo_size(bo_va->bo))) |
1015 | return -EINVAL; | 1015 | return -EINVAL; |
1016 | 1016 | ||
1017 | last_pfn = eaddr / AMDGPU_GPU_PAGE_SIZE; | 1017 | last_pfn = eaddr / AMDGPU_GPU_PAGE_SIZE; |
1018 | if (last_pfn > adev->vm_manager.max_pfn) { | 1018 | if (last_pfn >= adev->vm_manager.max_pfn) { |
1019 | dev_err(adev->dev, "va above limit (0x%08X > 0x%08X)\n", | 1019 | dev_err(adev->dev, "va above limit (0x%08X >= 0x%08X)\n", |
1020 | last_pfn, adev->vm_manager.max_pfn); | 1020 | last_pfn, adev->vm_manager.max_pfn); |
1021 | return -EINVAL; | 1021 | return -EINVAL; |
1022 | } | 1022 | } |
@@ -1025,7 +1025,7 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, | |||
1025 | eaddr /= AMDGPU_GPU_PAGE_SIZE; | 1025 | eaddr /= AMDGPU_GPU_PAGE_SIZE; |
1026 | 1026 | ||
1027 | spin_lock(&vm->it_lock); | 1027 | spin_lock(&vm->it_lock); |
1028 | it = interval_tree_iter_first(&vm->va, saddr, eaddr - 1); | 1028 | it = interval_tree_iter_first(&vm->va, saddr, eaddr); |
1029 | spin_unlock(&vm->it_lock); | 1029 | spin_unlock(&vm->it_lock); |
1030 | if (it) { | 1030 | if (it) { |
1031 | struct amdgpu_bo_va_mapping *tmp; | 1031 | struct amdgpu_bo_va_mapping *tmp; |
@@ -1046,7 +1046,7 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, | |||
1046 | 1046 | ||
1047 | INIT_LIST_HEAD(&mapping->list); | 1047 | INIT_LIST_HEAD(&mapping->list); |
1048 | mapping->it.start = saddr; | 1048 | mapping->it.start = saddr; |
1049 | mapping->it.last = eaddr - 1; | 1049 | mapping->it.last = eaddr; |
1050 | mapping->offset = offset; | 1050 | mapping->offset = offset; |
1051 | mapping->flags = flags; | 1051 | mapping->flags = flags; |
1052 | 1052 | ||