| From cdcc307050faf69e422c2e9f6d8fb3ad724e4bba Mon Sep 17 00:00:00 2001 |
| From: Ralph Campbell <rcampbell@nvidia.com> |
| Date: Tue, 3 Mar 2020 16:13:36 -0800 |
| Subject: [PATCH] drm/nouveau/svm: fix vma range check for migration |
| |
| commit b92103b559c77abc5f8b7bec269230a219c880b7 upstream. |
| |
| find_vma_intersection(mm, start, end) only guarantees that end is greater |
| than or equal to vma->vm_start but doesn't guarantee that start is |
| greater than or equal to vma->vm_start. The calculation for the |
| intersecting range in nouveau_svmm_bind() isn't accounting for this and |
| can call migrate_vma_setup() with a starting address less than |
| vma->vm_start. This results in migrate_vma_setup() returning -EINVAL for |
| the range instead of nouveau skipping that part of the range and migrating |
| the rest. |
| |
| Signed-off-by: Ralph Campbell <rcampbell@nvidia.com> |
| Signed-off-by: Ben Skeggs <bskeggs@redhat.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpu/drm/nouveau/nouveau_svm.c b/drivers/gpu/drm/nouveau/nouveau_svm.c |
| index e6943fab1b5b..fd10499329bf 100644 |
| --- a/drivers/gpu/drm/nouveau/nouveau_svm.c |
| +++ b/drivers/gpu/drm/nouveau/nouveau_svm.c |
| @@ -186,6 +186,7 @@ nouveau_svmm_bind(struct drm_device *dev, void *data, |
| if (!vma) |
| break; |
| |
| + addr = max(addr, vma->vm_start); |
| next = min(vma->vm_end, end); |
| /* This is a best effort so we ignore errors */ |
| nouveau_dmem_migrate_vma(cli->drm, vma, addr, next); |
| -- |
| 2.7.4 |
| |