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