mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 01:51:00 +03:00
config: remove HAVE_GET_USER_PAGES_*
get_user_pages_unlocked() had stabilised by 4.9. Sponsored-by: https://despairlabs.com/sponsor/ Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de> Signed-off-by: Rob Norris <robn@despairlabs.com> Closes #16479
This commit is contained in:
parent
696d7a71a0
commit
5df65ca9c1
@ -1,179 +0,0 @@
|
|||||||
dnl #
|
|
||||||
dnl # get_user_pages_unlocked() function was not available till 4.0.
|
|
||||||
dnl # In earlier kernels (< 4.0) get_user_pages() is available().
|
|
||||||
dnl #
|
|
||||||
dnl # 4.0 API change,
|
|
||||||
dnl # long get_user_pages_unlocked(struct task_struct *tsk,
|
|
||||||
dnl # struct mm_struct *mm, unsigned long start, unsigned long nr_pages,
|
|
||||||
dnl # int write, int force, struct page **pages)
|
|
||||||
dnl #
|
|
||||||
dnl # 4.8 API change,
|
|
||||||
dnl # long get_user_pages_unlocked(unsigned long start,
|
|
||||||
dnl # unsigned long nr_pages, int write, int force, struct page **page)
|
|
||||||
dnl #
|
|
||||||
dnl # 4.9 API change,
|
|
||||||
dnl # long get_user_pages_unlocked(usigned long start, int nr_pages,
|
|
||||||
dnl # struct page **pages, unsigned int gup_flags)
|
|
||||||
dnl #
|
|
||||||
|
|
||||||
dnl#
|
|
||||||
dnl# Check available get_user_pages/_unlocked interfaces.
|
|
||||||
dnl#
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_GET_USER_PAGES], [
|
|
||||||
ZFS_LINUX_TEST_SRC([get_user_pages_unlocked_gup_flags], [
|
|
||||||
#include <linux/mm.h>
|
|
||||||
], [
|
|
||||||
unsigned long start = 0;
|
|
||||||
unsigned long nr_pages = 1;
|
|
||||||
unsigned int gup_flags = 0;
|
|
||||||
struct page **pages = NULL;
|
|
||||||
long ret __attribute__ ((unused));
|
|
||||||
|
|
||||||
ret = get_user_pages_unlocked(start, nr_pages, pages,
|
|
||||||
gup_flags);
|
|
||||||
])
|
|
||||||
|
|
||||||
ZFS_LINUX_TEST_SRC([get_user_pages_unlocked_write_flag], [
|
|
||||||
#include <linux/mm.h>
|
|
||||||
], [
|
|
||||||
unsigned long start = 0;
|
|
||||||
unsigned long nr_pages = 1;
|
|
||||||
int write = 0;
|
|
||||||
int force = 0;
|
|
||||||
long ret __attribute__ ((unused));
|
|
||||||
struct page **pages = NULL;
|
|
||||||
|
|
||||||
ret = get_user_pages_unlocked(start, nr_pages, write, force,
|
|
||||||
pages);
|
|
||||||
])
|
|
||||||
|
|
||||||
ZFS_LINUX_TEST_SRC([get_user_pages_unlocked_task_struct], [
|
|
||||||
#include <linux/mm.h>
|
|
||||||
], [
|
|
||||||
struct task_struct *tsk = NULL;
|
|
||||||
struct mm_struct *mm = NULL;
|
|
||||||
unsigned long start = 0;
|
|
||||||
unsigned long nr_pages = 1;
|
|
||||||
int write = 0;
|
|
||||||
int force = 0;
|
|
||||||
struct page **pages = NULL;
|
|
||||||
long ret __attribute__ ((unused));
|
|
||||||
|
|
||||||
ret = get_user_pages_unlocked(tsk, mm, start, nr_pages, write,
|
|
||||||
force, pages);
|
|
||||||
])
|
|
||||||
|
|
||||||
ZFS_LINUX_TEST_SRC([get_user_pages_unlocked_task_struct_gup_flags], [
|
|
||||||
#include <linux/mm.h>
|
|
||||||
], [
|
|
||||||
struct task_struct *tsk = NULL;
|
|
||||||
struct mm_struct *mm = NULL;
|
|
||||||
unsigned long start = 0;
|
|
||||||
unsigned long nr_pages = 1;
|
|
||||||
struct page **pages = NULL;
|
|
||||||
unsigned int gup_flags = 0;
|
|
||||||
long ret __attribute__ ((unused));
|
|
||||||
|
|
||||||
ret = get_user_pages_unlocked(tsk, mm, start, nr_pages,
|
|
||||||
pages, gup_flags);
|
|
||||||
])
|
|
||||||
|
|
||||||
ZFS_LINUX_TEST_SRC([get_user_pages_task_struct], [
|
|
||||||
#include <linux/mm.h>
|
|
||||||
], [
|
|
||||||
struct task_struct *tsk = NULL;
|
|
||||||
struct mm_struct *mm = NULL;
|
|
||||||
struct vm_area_struct **vmas = NULL;
|
|
||||||
unsigned long start = 0;
|
|
||||||
unsigned long nr_pages = 1;
|
|
||||||
int write = 0;
|
|
||||||
int force = 0;
|
|
||||||
struct page **pages = NULL;
|
|
||||||
int ret __attribute__ ((unused));
|
|
||||||
|
|
||||||
ret = get_user_pages(tsk, mm, start, nr_pages, write,
|
|
||||||
force, pages, vmas);
|
|
||||||
])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl #
|
|
||||||
dnl # Supported get_user_pages/_unlocked interfaces checked newest to oldest.
|
|
||||||
dnl # We first check for get_user_pages_unlocked as that is available in
|
|
||||||
dnl # newer kernels.
|
|
||||||
dnl #
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_GET_USER_PAGES], [
|
|
||||||
dnl #
|
|
||||||
dnl # Current API (as of 4.9) of get_user_pages_unlocked
|
|
||||||
dnl #
|
|
||||||
AC_MSG_CHECKING([whether get_user_pages_unlocked() takes gup flags])
|
|
||||||
ZFS_LINUX_TEST_RESULT([get_user_pages_unlocked_gup_flags], [
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
AC_DEFINE(HAVE_GET_USER_PAGES_UNLOCKED_GUP_FLAGS, 1,
|
|
||||||
[get_user_pages_unlocked() takes gup flags])
|
|
||||||
], [
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
|
|
||||||
dnl #
|
|
||||||
dnl # 4.8 API change, get_user_pages_unlocked
|
|
||||||
dnl #
|
|
||||||
AC_MSG_CHECKING(
|
|
||||||
[whether get_user_pages_unlocked() takes write flag])
|
|
||||||
ZFS_LINUX_TEST_RESULT([get_user_pages_unlocked_write_flag], [
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
AC_DEFINE(HAVE_GET_USER_PAGES_UNLOCKED_WRITE_FLAG, 1,
|
|
||||||
[get_user_pages_unlocked() takes write flag])
|
|
||||||
], [
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
|
|
||||||
dnl #
|
|
||||||
dnl # 4.0-4.3, 4.5-4.7 API, get_user_pages_unlocked
|
|
||||||
dnl #
|
|
||||||
AC_MSG_CHECKING(
|
|
||||||
[whether get_user_pages_unlocked() takes task_struct])
|
|
||||||
ZFS_LINUX_TEST_RESULT(
|
|
||||||
[get_user_pages_unlocked_task_struct], [
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
AC_DEFINE(
|
|
||||||
HAVE_GET_USER_PAGES_UNLOCKED_TASK_STRUCT, 1,
|
|
||||||
[get_user_pages_unlocked() takes task_struct])
|
|
||||||
], [
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
|
|
||||||
dnl #
|
|
||||||
dnl # 4.4 API, get_user_pages_unlocked
|
|
||||||
dnl #
|
|
||||||
AC_MSG_CHECKING(
|
|
||||||
[whether get_user_pages_unlocked() takes task_struct, gup_flags])
|
|
||||||
ZFS_LINUX_TEST_RESULT(
|
|
||||||
[get_user_pages_unlocked_task_struct_gup_flags], [
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
AC_DEFINE(
|
|
||||||
HAVE_GET_USER_PAGES_UNLOCKED_TASK_STRUCT_GUP_FLAGS, 1,
|
|
||||||
[get_user_pages_unlocked() takes task_struct, gup_flags])
|
|
||||||
], [
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
|
|
||||||
dnl #
|
|
||||||
dnl # get_user_pages
|
|
||||||
dnl #
|
|
||||||
AC_MSG_CHECKING(
|
|
||||||
[whether get_user_pages() takes struct task_struct])
|
|
||||||
ZFS_LINUX_TEST_RESULT(
|
|
||||||
[get_user_pages_task_struct], [
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
AC_DEFINE(
|
|
||||||
HAVE_GET_USER_PAGES_TASK_STRUCT, 1,
|
|
||||||
[get_user_pages() takes task_struct])
|
|
||||||
], [
|
|
||||||
dnl #
|
|
||||||
dnl # If we cannot map the user's
|
|
||||||
dnl # pages in then we cannot do
|
|
||||||
dnl # Direct I/O
|
|
||||||
dnl #
|
|
||||||
ZFS_LINUX_TEST_ERROR([Direct I/O])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
])
|
|
@ -78,7 +78,6 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
|||||||
ZFS_AC_KERNEL_SRC_VFS_FILEMAP_DIRTY_FOLIO
|
ZFS_AC_KERNEL_SRC_VFS_FILEMAP_DIRTY_FOLIO
|
||||||
ZFS_AC_KERNEL_SRC_VFS_READ_FOLIO
|
ZFS_AC_KERNEL_SRC_VFS_READ_FOLIO
|
||||||
ZFS_AC_KERNEL_SRC_VFS_FSYNC_2ARGS
|
ZFS_AC_KERNEL_SRC_VFS_FSYNC_2ARGS
|
||||||
ZFS_AC_KERNEL_SRC_GET_USER_PAGES
|
|
||||||
ZFS_AC_KERNEL_SRC_VFS_DIRECT_IO
|
ZFS_AC_KERNEL_SRC_VFS_DIRECT_IO
|
||||||
ZFS_AC_KERNEL_SRC_VFS_READPAGES
|
ZFS_AC_KERNEL_SRC_VFS_READPAGES
|
||||||
ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||||
@ -187,7 +186,6 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
|||||||
ZFS_AC_KERNEL_VFS_FILEMAP_DIRTY_FOLIO
|
ZFS_AC_KERNEL_VFS_FILEMAP_DIRTY_FOLIO
|
||||||
ZFS_AC_KERNEL_VFS_READ_FOLIO
|
ZFS_AC_KERNEL_VFS_READ_FOLIO
|
||||||
ZFS_AC_KERNEL_VFS_FSYNC_2ARGS
|
ZFS_AC_KERNEL_VFS_FSYNC_2ARGS
|
||||||
ZFS_AC_KERNEL_GET_USER_PAGES
|
|
||||||
ZFS_AC_KERNEL_VFS_DIRECT_IO
|
ZFS_AC_KERNEL_VFS_DIRECT_IO
|
||||||
ZFS_AC_KERNEL_VFS_READPAGES
|
ZFS_AC_KERNEL_VFS_READPAGES
|
||||||
ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
|
||||||
|
@ -48,49 +48,4 @@
|
|||||||
#define zfs_access_ok(type, addr, size) access_ok(addr, size)
|
#define zfs_access_ok(type, addr, size) access_ok(addr, size)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* read returning FOLL_WRITE is due to the fact that we are stating
|
|
||||||
* that the kernel will have write access to the user pages. So, when
|
|
||||||
* a Direct I/O read request is issued, the kernel must write to the user
|
|
||||||
* pages.
|
|
||||||
*
|
|
||||||
* get_user_pages_unlocked was not available to 4.0, so we also check
|
|
||||||
* for get_user_pages on older kernels.
|
|
||||||
*/
|
|
||||||
/* 4.9 API change - for and read flag is passed as gup flags */
|
|
||||||
#if defined(HAVE_GET_USER_PAGES_UNLOCKED_GUP_FLAGS)
|
|
||||||
#define zfs_get_user_pages(addr, numpages, read, pages) \
|
|
||||||
get_user_pages_unlocked(addr, numpages, pages, read ? FOLL_WRITE : 0)
|
|
||||||
|
|
||||||
/* 4.8 API change - no longer takes struct task_struct as arguement */
|
|
||||||
#elif defined(HAVE_GET_USER_PAGES_UNLOCKED_WRITE_FLAG)
|
|
||||||
#define zfs_get_user_pages(addr, numpages, read, pages) \
|
|
||||||
get_user_pages_unlocked(addr, numpages, read, 0, pages)
|
|
||||||
|
|
||||||
/* 4.0-4.3, 4.5-4.7 API */
|
|
||||||
#elif defined(HAVE_GET_USER_PAGES_UNLOCKED_TASK_STRUCT)
|
|
||||||
#define zfs_get_user_pages(addr, numpages, read, pages) \
|
|
||||||
get_user_pages_unlocked(current, current->mm, addr, numpages, read, 0, \
|
|
||||||
pages)
|
|
||||||
|
|
||||||
/* 4.4 API */
|
|
||||||
#elif defined(HAVE_GET_USER_PAGES_UNLOCKED_TASK_STRUCT_GUP_FLAGS)
|
|
||||||
#define zfs_get_user_pages(addr, numpages, read, pages) \
|
|
||||||
get_user_pages_unlocked(current, current->mm, addr, numpages, pages, \
|
|
||||||
read ? FOLL_WRITE : 0)
|
|
||||||
|
|
||||||
/* Using get_user_pages if kernel is < 4.0 */
|
|
||||||
#elif defined(HAVE_GET_USER_PAGES_TASK_STRUCT)
|
|
||||||
#define zfs_get_user_pages(addr, numpages, read, pages) \
|
|
||||||
get_user_pages(current, current->mm, addr, numpages, read, 0, pages, \
|
|
||||||
NULL)
|
|
||||||
#else
|
|
||||||
/*
|
|
||||||
* This case is unreachable. We must be able to use either
|
|
||||||
* get_user_pages_unlocked() or get_user_pages() to map user pages into
|
|
||||||
* the kernel.
|
|
||||||
*/
|
|
||||||
#error "Unknown Direct I/O interface"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _ZFS_KMAP_H */
|
#endif /* _ZFS_KMAP_H */
|
||||||
|
@ -589,9 +589,16 @@ zfs_uio_iov_step(struct iovec v, zfs_uio_rw_t rw, zfs_uio_t *uio,
|
|||||||
size_t len = v.iov_len;
|
size_t len = v.iov_len;
|
||||||
unsigned long n = DIV_ROUND_UP(len, PAGE_SIZE);
|
unsigned long n = DIV_ROUND_UP(len, PAGE_SIZE);
|
||||||
|
|
||||||
long res = zfs_get_user_pages(
|
/*
|
||||||
P2ALIGN_TYPED(addr, PAGE_SIZE, unsigned long), n, rw == UIO_READ,
|
* read returning FOLL_WRITE is due to the fact that we are stating
|
||||||
&uio->uio_dio.pages[uio->uio_dio.npages]);
|
* that the kernel will have write access to the user pages. So, when a
|
||||||
|
* Direct I/O read request is issued, the kernel must write to the user
|
||||||
|
* pages.
|
||||||
|
*/
|
||||||
|
long res = get_user_pages_unlocked(
|
||||||
|
P2ALIGN_TYPED(addr, PAGE_SIZE, unsigned long), n,
|
||||||
|
&uio->uio_dio.pages[uio->uio_dio.npages],
|
||||||
|
rw == UIO_READ ? FOLL_WRITE : 0);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
return (SET_ERROR(-res));
|
return (SET_ERROR(-res));
|
||||||
} else if (len != (res * PAGE_SIZE)) {
|
} else if (len != (res * PAGE_SIZE)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user