-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This current state of adding Direct IO support to ZFS on Linux rebased on ZoL master. The current work still remaining is: 1. Handle issues related to Direct IO requests for dbuf's with multiple holds. 2. Create ZTS tests 3. Further debugging At the moment, tests have been run using FIO and XDD to resolve all failed VERIFY and ASSERT statements. Signed-off-by: Brian <[email protected]> Co-authored-by: Mark Maybee <[email protected]> Co-authored-by: Brian Atkinson <[email protected]>
- Loading branch information
1 parent
093902e
commit 04e3a35
Showing
23 changed files
with
1,966 additions
and
206 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
dnl # | ||
dnl # get_user_pages_unlocked() function was not available till 4.0. | ||
dnl # | ||
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 # 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 # 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 # In earlier kernels (< 4.0) get_user_pages() is available | ||
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_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 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 API, get_user_pages_unlocked | ||
dnl # | ||
AC_MSG_CHECKING( | ||
[whether get_user_pages_unlocked() takes struct 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 struct task_struct]) | ||
], [ | ||
AC_MSG_RESULT(no) | ||
dnl # get_user_pages | ||
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 struct task_struct]) | ||
], [ | ||
dnl # | ||
dnl # If we can not map the users pages in | ||
dnl # then we can not do Direct IO | ||
dnl # | ||
ZFS_LINUX_TEST_ERROR([Direct IO]) | ||
]) | ||
]) | ||
]) | ||
]) | ||
]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.