xref: /freebsd/sys/contrib/openzfs/config/kernel-workqueue.m4 (revision 22649d4dba730d46244fd2dff4fd174903c8379f)
1*22649d4dSMartin Matuskadnl # SPDX-License-Identifier: CDDL-1.0
2*22649d4dSMartin Matuskadnl #
3*22649d4dSMartin Matuskadnl # 5.19 API change
4*22649d4dSMartin Matuskadnl # flush_workqueue() will no longer compile for system/global workqueues,
5*22649d4dSMartin Matuskadnl # __flush_workqueue() introduced with no restrictions.
6*22649d4dSMartin Matuskadnl #
7*22649d4dSMartin Matuskadnl # 6.17 API change
8*22649d4dSMartin Matuskadnl # schedule_delayed_work() now queues to system_percpu_wq, system_wq
9*22649d4dSMartin Matuskadnl # deprecated.
10*22649d4dSMartin Matuskadnl #
11*22649d4dSMartin Matuskadnl # We cannot simply test for system_percpu_wq, as it has been backported
12*22649d4dSMartin Matuskadnl # to LTS kernels where it is _not_ used for the delay queue. However,
13*22649d4dSMartin Matuskadnl # the same commit that introduced it on mainline (a2be943b46b4a) also
14*22649d4dSMartin Matuskadnl # added system_percpu_wq to the flush_workqueue() macro as one of the
15*22649d4dSMartin Matuskadnl # global workqueues to reject at compiletime, and removed system_wq.
16*22649d4dSMartin Matuskadnl # That part however, was _not_ backported, so we can use it to determine
17*22649d4dSMartin Matuskadnl # which waitqueue is used for delay - if __flush_workqueue() accepts it,
18*22649d4dSMartin Matuskadnl # but flush_workqueue() does not, then it is the delay workqueue.
19*22649d4dSMartin Matuskadnl #
20*22649d4dSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_FLUSH_DELAY_WORKQUEUE], [
21*22649d4dSMartin Matuska	ZFS_LINUX_TEST_SRC([flush_workqueue_system], [
22*22649d4dSMartin Matuska		#include <linux/workqueue.h>
23*22649d4dSMartin Matuska	], [
24*22649d4dSMartin Matuska		flush_workqueue(system_wq);
25*22649d4dSMartin Matuska	])
26*22649d4dSMartin Matuska	ZFS_LINUX_TEST_SRC([flush_workqueue_percpu], [
27*22649d4dSMartin Matuska		#include <linux/workqueue.h>
28*22649d4dSMartin Matuska	], [
29*22649d4dSMartin Matuska		flush_workqueue(system_percpu_wq);
30*22649d4dSMartin Matuska	])
31*22649d4dSMartin Matuska	ZFS_LINUX_TEST_SRC([flush_workqueue_internal_system], [
32*22649d4dSMartin Matuska		#include <linux/workqueue.h>
33*22649d4dSMartin Matuska	], [
34*22649d4dSMartin Matuska		__flush_workqueue(system_wq);
35*22649d4dSMartin Matuska	])
36*22649d4dSMartin Matuska	ZFS_LINUX_TEST_SRC([flush_workqueue_internal_percpu], [
37*22649d4dSMartin Matuska		#include <linux/workqueue.h>
38*22649d4dSMartin Matuska	], [
39*22649d4dSMartin Matuska		__flush_workqueue(system_percpu_wq);
40*22649d4dSMartin Matuska	])
41*22649d4dSMartin Matuska])
42*22649d4dSMartin Matuska
43*22649d4dSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_FLUSH_DELAY_WORKQUEUE], [
44*22649d4dSMartin Matuska	AC_MSG_CHECKING([how to flush delay workqueue])
45*22649d4dSMartin Matuska	ZFS_LINUX_TEST_RESULT([flush_workqueue_internal_percpu], [
46*22649d4dSMartin Matuska		dnl system_percpu_wq exists. the flush_workqueue()
47*22649d4dSMartin Matuska		dnl macro will reject the one used for delay
48*22649d4dSMartin Matuska		ZFS_LINUX_TEST_RESULT([flush_workqueue_percpu], [
49*22649d4dSMartin Matuska			AC_MSG_RESULT([internal+system])
50*22649d4dSMartin Matuska			AC_DEFINE(HAVE_FLUSH_DELAY_WORKQUEUE_INTERNAL, 1,
51*22649d4dSMartin Matuska			    [use __flush_workqueue() to flush delay workqueue])
52*22649d4dSMartin Matuska		], [
53*22649d4dSMartin Matuska			AC_MSG_RESULT([internal+percpu])
54*22649d4dSMartin Matuska			AC_DEFINE(HAVE_FLUSH_DELAY_WORKQUEUE_INTERNAL, 1,
55*22649d4dSMartin Matuska			    [use __flush_workqueue() to flush delay workqueue])
56*22649d4dSMartin Matuska			AC_DEFINE(HAVE_FLUSH_DELAY_WORKQUEUE_PERCPU, 1,
57*22649d4dSMartin Matuska			    [use system_delay_wq for delay workqueue])
58*22649d4dSMartin Matuska		])
59*22649d4dSMartin Matuska	], [
60*22649d4dSMartin Matuska		dnl system_percpu_wq does not exist. use whichever did
61*22649d4dSMartin Matuska		dnl not reject it
62*22649d4dSMartin Matuska		ZFS_LINUX_TEST_RESULT([flush_workqueue_internal_system], [
63*22649d4dSMartin Matuska			AC_MSG_RESULT([internal+system])
64*22649d4dSMartin Matuska			AC_DEFINE(HAVE_FLUSH_DELAY_WORKQUEUE_INTERNAL, 1,
65*22649d4dSMartin Matuska			    [use __flush_workqueue() to flush delay workqueue])
66*22649d4dSMartin Matuska		], [
67*22649d4dSMartin Matuska			AC_MSG_RESULT([system])
68*22649d4dSMartin Matuska		])
69*22649d4dSMartin Matuska	])
70*22649d4dSMartin Matuska])
71*22649d4dSMartin Matuska
72*22649d4dSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_SRC_WORKQUEUE], [
73*22649d4dSMartin Matuska	ZFS_AC_KERNEL_SRC_FLUSH_DELAY_WORKQUEUE
74*22649d4dSMartin Matuska])
75*22649d4dSMartin MatuskaAC_DEFUN([ZFS_AC_KERNEL_WORKQUEUE], [
76*22649d4dSMartin Matuska	ZFS_AC_KERNEL_FLUSH_DELAY_WORKQUEUE
77*22649d4dSMartin Matuska])
78