forked from luck/tmp_suning_uos_patched
mm/hmm: always return EBUSY for invalid ranges in hmm_range_{fault,snapshot}
We should not have two different error codes for the same condition. EAGAIN must be reserved for the FAULT_FLAG_ALLOW_RETRY retry case and signals to the caller that the mmap_sem has been unlocked. Use EBUSY for the !valid case so that callers can get the locking right. Link: https://lore.kernel.org/r/20190724065258.16603-2-hch@lst.de Tested-by: Ralph Campbell <rcampbell@nvidia.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Ralph Campbell <rcampbell@nvidia.com> Reviewed-by: Jason Gunthorpe <jgg@mellanox.com> Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> [jgg: elaborated commit message] Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
parent
5f9e832c13
commit
2bcbeaefde
|
@ -237,7 +237,7 @@ The usage pattern is::
|
||||||
ret = hmm_range_snapshot(&range);
|
ret = hmm_range_snapshot(&range);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
up_read(&mm->mmap_sem);
|
up_read(&mm->mmap_sem);
|
||||||
if (ret == -EAGAIN) {
|
if (ret == -EBUSY) {
|
||||||
/*
|
/*
|
||||||
* No need to check hmm_range_wait_until_valid() return value
|
* No need to check hmm_range_wait_until_valid() return value
|
||||||
* on retry we will get proper error with hmm_range_snapshot()
|
* on retry we will get proper error with hmm_range_snapshot()
|
||||||
|
|
10
mm/hmm.c
10
mm/hmm.c
|
@ -946,7 +946,7 @@ EXPORT_SYMBOL(hmm_range_unregister);
|
||||||
* @range: range
|
* @range: range
|
||||||
* Return: -EINVAL if invalid argument, -ENOMEM out of memory, -EPERM invalid
|
* Return: -EINVAL if invalid argument, -ENOMEM out of memory, -EPERM invalid
|
||||||
* permission (for instance asking for write and range is read only),
|
* permission (for instance asking for write and range is read only),
|
||||||
* -EAGAIN if you need to retry, -EFAULT invalid (ie either no valid
|
* -EBUSY if you need to retry, -EFAULT invalid (ie either no valid
|
||||||
* vma or it is illegal to access that range), number of valid pages
|
* vma or it is illegal to access that range), number of valid pages
|
||||||
* in range->pfns[] (from range start address).
|
* in range->pfns[] (from range start address).
|
||||||
*
|
*
|
||||||
|
@ -967,7 +967,7 @@ long hmm_range_snapshot(struct hmm_range *range)
|
||||||
do {
|
do {
|
||||||
/* If range is no longer valid force retry. */
|
/* If range is no longer valid force retry. */
|
||||||
if (!range->valid)
|
if (!range->valid)
|
||||||
return -EAGAIN;
|
return -EBUSY;
|
||||||
|
|
||||||
vma = find_vma(hmm->mm, start);
|
vma = find_vma(hmm->mm, start);
|
||||||
if (vma == NULL || (vma->vm_flags & device_vma))
|
if (vma == NULL || (vma->vm_flags & device_vma))
|
||||||
|
@ -1062,10 +1062,8 @@ long hmm_range_fault(struct hmm_range *range, bool block)
|
||||||
|
|
||||||
do {
|
do {
|
||||||
/* If range is no longer valid force retry. */
|
/* If range is no longer valid force retry. */
|
||||||
if (!range->valid) {
|
if (!range->valid)
|
||||||
up_read(&hmm->mm->mmap_sem);
|
return -EBUSY;
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
vma = find_vma(hmm->mm, start);
|
vma = find_vma(hmm->mm, start);
|
||||||
if (vma == NULL || (vma->vm_flags & device_vma))
|
if (vma == NULL || (vma->vm_flags & device_vma))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user