diff options
| -rw-r--r-- | drivers/vfio/vfio_iommu_type1.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/drivers/vfio/vfio_iommu_type1.c b/drivers/vfio/vfio_iommu_type1.c index e6e7f155bdd9..35c90089478e 100644 --- a/drivers/vfio/vfio_iommu_type1.c +++ b/drivers/vfio/vfio_iommu_type1.c | |||
| @@ -265,6 +265,7 @@ static long vfio_pin_pages(unsigned long vaddr, long npage, | |||
| 265 | unsigned long limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; | 265 | unsigned long limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT; |
| 266 | bool lock_cap = capable(CAP_IPC_LOCK); | 266 | bool lock_cap = capable(CAP_IPC_LOCK); |
| 267 | long ret, i; | 267 | long ret, i; |
| 268 | bool rsvd; | ||
| 268 | 269 | ||
| 269 | if (!current->mm) | 270 | if (!current->mm) |
| 270 | return -ENODEV; | 271 | return -ENODEV; |
| @@ -273,10 +274,9 @@ static long vfio_pin_pages(unsigned long vaddr, long npage, | |||
| 273 | if (ret) | 274 | if (ret) |
| 274 | return ret; | 275 | return ret; |
| 275 | 276 | ||
| 276 | if (is_invalid_reserved_pfn(*pfn_base)) | 277 | rsvd = is_invalid_reserved_pfn(*pfn_base); |
| 277 | return 1; | ||
| 278 | 278 | ||
| 279 | if (!lock_cap && current->mm->locked_vm + 1 > limit) { | 279 | if (!rsvd && !lock_cap && current->mm->locked_vm + 1 > limit) { |
| 280 | put_pfn(*pfn_base, prot); | 280 | put_pfn(*pfn_base, prot); |
| 281 | pr_warn("%s: RLIMIT_MEMLOCK (%ld) exceeded\n", __func__, | 281 | pr_warn("%s: RLIMIT_MEMLOCK (%ld) exceeded\n", __func__, |
| 282 | limit << PAGE_SHIFT); | 282 | limit << PAGE_SHIFT); |
| @@ -284,7 +284,8 @@ static long vfio_pin_pages(unsigned long vaddr, long npage, | |||
| 284 | } | 284 | } |
| 285 | 285 | ||
| 286 | if (unlikely(disable_hugepages)) { | 286 | if (unlikely(disable_hugepages)) { |
| 287 | vfio_lock_acct(1); | 287 | if (!rsvd) |
| 288 | vfio_lock_acct(1); | ||
| 288 | return 1; | 289 | return 1; |
| 289 | } | 290 | } |
| 290 | 291 | ||
| @@ -296,12 +297,14 @@ static long vfio_pin_pages(unsigned long vaddr, long npage, | |||
| 296 | if (ret) | 297 | if (ret) |
| 297 | break; | 298 | break; |
| 298 | 299 | ||
| 299 | if (pfn != *pfn_base + i || is_invalid_reserved_pfn(pfn)) { | 300 | if (pfn != *pfn_base + i || |
| 301 | rsvd != is_invalid_reserved_pfn(pfn)) { | ||
| 300 | put_pfn(pfn, prot); | 302 | put_pfn(pfn, prot); |
| 301 | break; | 303 | break; |
| 302 | } | 304 | } |
| 303 | 305 | ||
| 304 | if (!lock_cap && current->mm->locked_vm + i + 1 > limit) { | 306 | if (!rsvd && !lock_cap && |
| 307 | current->mm->locked_vm + i + 1 > limit) { | ||
| 305 | put_pfn(pfn, prot); | 308 | put_pfn(pfn, prot); |
| 306 | pr_warn("%s: RLIMIT_MEMLOCK (%ld) exceeded\n", | 309 | pr_warn("%s: RLIMIT_MEMLOCK (%ld) exceeded\n", |
| 307 | __func__, limit << PAGE_SHIFT); | 310 | __func__, limit << PAGE_SHIFT); |
| @@ -309,7 +312,8 @@ static long vfio_pin_pages(unsigned long vaddr, long npage, | |||
| 309 | } | 312 | } |
| 310 | } | 313 | } |
| 311 | 314 | ||
| 312 | vfio_lock_acct(i); | 315 | if (!rsvd) |
| 316 | vfio_lock_acct(i); | ||
| 313 | 317 | ||
| 314 | return i; | 318 | return i; |
| 315 | } | 319 | } |
