Skip to content
Permalink
Browse files
mm: introduce vma_set_file function
Add the new vma_set_file() function to allow changing
vma->vm_file with the necessary refcount dance.

Signed-off-by: Christian König <christian.koenig@amd.com>
  • Loading branch information
Christian König authored and intel-lab-lkp committed Sep 14, 2020
1 parent a6dfead commit c558278651bbea7cb67487890a983608764cc7f4
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 11 deletions.
@@ -1163,20 +1163,14 @@ int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
return -EINVAL;

/* readjust the vma */
get_file(dmabuf->file);
oldfile = vma->vm_file;
vma->vm_file = dmabuf->file;
oldfile = vma_set_file(vma, dmabuf->file);
vma->vm_pgoff = pgoff;

ret = dmabuf->ops->mmap(dmabuf, vma);
if (ret) {
/* restore old parameters on failure */
vma->vm_file = oldfile;
fput(dmabuf->file);
} else {
if (oldfile)
fput(oldfile);
}
/* restore old parameters on failure */
if (ret)
vma_set_file(vma, oldfile);

return ret;

}
@@ -2679,6 +2679,8 @@ static inline void vma_set_page_prot(struct vm_area_struct *vma)
}
#endif

struct file *vma_set_file(struct vm_area_struct *vma, struct file *file);

#ifdef CONFIG_NUMA_BALANCING
unsigned long change_prot_numa(struct vm_area_struct *vma,
unsigned long start, unsigned long end);
@@ -136,6 +136,22 @@ void vma_set_page_prot(struct vm_area_struct *vma)
WRITE_ONCE(vma->vm_page_prot, vm_page_prot);
}

/*
* Change backing file, only valid to use during initial VMA setup.
*/
struct file *vma_set_file(struct vm_area_struct *vma, struct file *file)
{
if (file)
get_file(file);

swap(vma->vm_file, file);

if (file)
fput(file);

return file;
}

/*
* Requires inode->i_mapping->i_mmap_rwsem
*/

0 comments on commit c558278

Please sign in to comment.