forked from openzfs/zfs
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
In `config/kernel-timer.m4` refactor slightly to check more generally for the new `timer_setup()` APIs, but also check the callback signature because some kernels (notably 4.14) have the new `timer_setup()` API but use the old callback signature. Also add a check for a `flags` member in `struct timer_list`, which was added in 4.1-rc8. Add compatibility shims to `include/spl/sys/timer.h` to allow using the new timer APIs with the only two caveats being that the callback argument type must be declared as `spl_timer_list_t` and an explicit assignment is required to get the timer variable for the `timer_of()` macro. So the callback would look like this: ```c __cv_wakeup(spl_timer_list_t t) { struct timer_list *tmr = (struct timer_list *)t; struct thing *parent = from_timer(parent, tmr, parent_timer_field); ... /* do stuff with parent */ ``` Make some minor changes to `spl-condvar.c` and `spl-taskq.c` to use the new timer APIs instead of conditional code. Reviewed-by: Tomohiro Kusumi <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Rafael Kitover <[email protected]> Closes openzfs#8647
- Loading branch information
1 parent
63b88f7
commit e0cd6c2
Showing
5 changed files
with
103 additions
and
40 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 |
---|---|---|
@@ -1,32 +1,73 @@ | ||
dnl # 4.14-rc3 API change | ||
dnl # https://lwn.net/Articles/735887/ | ||
dnl # | ||
dnl # 4.15 API change | ||
dnl # https://lkml.org/lkml/2017/11/25/90 | ||
dnl # Check if timer_list.func get passed a timer_list or an unsigned long | ||
dnl # (older kernels). Also sanity check the from_timer() and timer_setup() | ||
dnl # macros are available as well, since they will be used in the same newer | ||
dnl # kernels that support the new timer_list.func signature. | ||
dnl # | ||
AC_DEFUN([ZFS_AC_KERNEL_TIMER_FUNCTION_TIMER_LIST], [ | ||
AC_MSG_CHECKING([whether timer_list.function gets a timer_list]) | ||
dnl # Also check for the existance of flags in struct timer_list, they were | ||
dnl # added in 4.1-rc8 via 0eeda71bc30d. | ||
|
||
AC_DEFUN([ZFS_AC_KERNEL_TIMER_SETUP], [ | ||
AC_MSG_CHECKING([whether timer_setup() is available]) | ||
tmp_flags="$EXTRA_KCFLAGS" | ||
EXTRA_KCFLAGS="-Werror" | ||
ZFS_LINUX_TRY_COMPILE([ | ||
#include <linux/timer.h> | ||
void task_expire(struct timer_list *tl) {} | ||
struct my_task_timer { | ||
struct timer_list timer; | ||
int data; | ||
}; | ||
void task_expire(struct timer_list *tl) | ||
{ | ||
struct my_task_timer *task_timer = from_timer(task_timer, tl, timer); | ||
task_timer->data = 42; | ||
} | ||
],[ | ||
struct my_task_timer task_timer; | ||
timer_setup(&task_timer.timer, task_expire, 0); | ||
],[ | ||
#ifndef from_timer | ||
#error "No from_timer() macro" | ||
#endif | ||
AC_MSG_RESULT(yes) | ||
AC_DEFINE(HAVE_KERNEL_TIMER_SETUP, 1, | ||
[timer_setup() is available]) | ||
],[ | ||
AC_MSG_RESULT(no) | ||
]) | ||
struct timer_list timer; | ||
timer.function = task_expire; | ||
timer_setup(&timer, NULL, 0); | ||
AC_MSG_CHECKING([whether timer function expects timer_list]) | ||
ZFS_LINUX_TRY_COMPILE([ | ||
#include <linux/timer.h> | ||
void task_expire(struct timer_list *tl) {} | ||
],[ | ||
struct timer_list tl; | ||
tl.function = task_expire; | ||
],[ | ||
AC_MSG_RESULT(yes) | ||
AC_DEFINE(HAVE_KERNEL_TIMER_FUNCTION_TIMER_LIST, 1, | ||
[timer_list.function gets a timer_list]) | ||
],[ | ||
AC_MSG_RESULT(no) | ||
]) | ||
AC_MSG_CHECKING([whether struct timer_list has flags]) | ||
ZFS_LINUX_TRY_COMPILE([ | ||
#include <linux/timer.h> | ||
],[ | ||
struct timer_list tl; | ||
tl.flags = 2; | ||
],[ | ||
AC_MSG_RESULT(yes) | ||
AC_DEFINE(HAVE_KERNEL_TIMER_LIST_FLAGS, 1, | ||
[struct timer_list has a flags member]) | ||
],[ | ||
AC_MSG_RESULT(no) | ||
]) | ||
EXTRA_KCFLAGS="$tmp_flags" | ||
]) |
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