diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2018-12-30 15:38:07 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2018-12-30 15:38:07 +0000 |
commit | e5a3393a15a0b0d31cdf8c378bc538971204cf5e (patch) | |
tree | 5a9613c708c1e7c6d87cb6ac5dfe43a9aee169d4 /sys | |
parent | 46aedfa274133207ddbe771843190eccbf6b61a7 (diff) | |
download | src-e5a3393a15a0b0d31cdf8c378bc538971204cf5e.tar.gz src-e5a3393a15a0b0d31cdf8c378bc538971204cf5e.zip |
Implement zap_vma_ptes() for managed device objects.
Reviewed by: markj
Discussed with: hselasky
Tested by: zeising
MFC after: 1 week
Sponsored by: Mellanox Technologies
Differential revision: https://reviews.freebsd.org/D18606
Notes
Notes:
svn path=/head/; revision=342627
Diffstat (limited to 'sys')
-rw-r--r-- | sys/compat/linuxkpi/common/include/linux/mm.h | 8 | ||||
-rw-r--r-- | sys/compat/linuxkpi/common/src/linux_compat.c | 19 |
2 files changed, 21 insertions, 6 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/mm.h b/sys/compat/linuxkpi/common/include/linux/mm.h index c127697fb2c6..26bd01b6e623 100644 --- a/sys/compat/linuxkpi/common/include/linux/mm.h +++ b/sys/compat/linuxkpi/common/include/linux/mm.h @@ -180,12 +180,8 @@ apply_to_page_range(struct mm_struct *mm, unsigned long address, return (-ENOTSUP); } -static inline int -zap_vma_ptes(struct vm_area_struct *vma, unsigned long address, - unsigned long size) -{ - return (-ENOTSUP); -} +int zap_vma_ptes(struct vm_area_struct *vma, unsigned long address, + unsigned long size); static inline int remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, diff --git a/sys/compat/linuxkpi/common/src/linux_compat.c b/sys/compat/linuxkpi/common/src/linux_compat.c index 3953d1634629..297c6d8e01d8 100644 --- a/sys/compat/linuxkpi/common/src/linux_compat.c +++ b/sys/compat/linuxkpi/common/src/linux_compat.c @@ -672,6 +672,25 @@ static struct cdev_pager_ops linux_cdev_pager_ops[2] = { }, }; +int +zap_vma_ptes(struct vm_area_struct *vma, unsigned long address, + unsigned long size) +{ + vm_object_t obj; + vm_page_t m; + + obj = vma->vm_obj; + if (obj == NULL || (obj->flags & OBJ_UNMANAGED) != 0) + return (-ENOTSUP); + VM_OBJECT_RLOCK(obj); + for (m = vm_page_find_least(obj, OFF_TO_IDX(address)); + m != NULL && m->pindex < OFF_TO_IDX(address + size); + m = TAILQ_NEXT(m, listq)) + pmap_remove_all(m); + VM_OBJECT_RUNLOCK(obj); + return (0); +} + #define OPW(fp,td,code) ({ \ struct file *__fpop; \ __typeof(code) __retval; \ |