xref: /src/sys/contrib/openzfs/config/kernel-blk-queue.m4 (revision 8a62a2a5659d1839d8799b4274c04469d7f17c78)
1dnl # SPDX-License-Identifier: CDDL-1.0
2dnl #
3dnl # 2.6.39 API change,
4dnl # blk_start_plug() and blk_finish_plug()
5dnl #
6AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_PLUG], [
7	ZFS_LINUX_TEST_SRC([blk_plug], [
8		#include <linux/blkdev.h>
9	],[
10		struct blk_plug plug __attribute__ ((unused));
11
12		blk_start_plug(&plug);
13		blk_finish_plug(&plug);
14	])
15])
16
17AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_PLUG], [
18	AC_MSG_CHECKING([whether struct blk_plug is available])
19	ZFS_LINUX_TEST_RESULT([blk_plug], [
20		AC_MSG_RESULT(yes)
21	],[
22		ZFS_LINUX_TEST_ERROR([blk_plug])
23	])
24])
25
26dnl #
27dnl # 2.6.32 - 4.11: statically allocated bdi in request_queue
28dnl # 4.12: dynamically allocated bdi in request_queue
29dnl # 6.11: bdi no longer available through request_queue, so get it from
30dnl #       the gendisk attached to the queue
31dnl #
32AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_BDI], [
33	ZFS_LINUX_TEST_SRC([blk_queue_bdi], [
34		#include <linux/blkdev.h>
35	],[
36		struct request_queue q;
37		struct backing_dev_info bdi;
38		q.backing_dev_info = &bdi;
39	])
40])
41
42AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_BDI], [
43	AC_MSG_CHECKING([whether blk_queue bdi is dynamic])
44	ZFS_LINUX_TEST_RESULT([blk_queue_bdi], [
45		AC_MSG_RESULT(yes)
46		AC_DEFINE(HAVE_BLK_QUEUE_BDI_DYNAMIC, 1,
47		    [blk queue backing_dev_info is dynamic])
48	],[
49		AC_MSG_RESULT(no)
50	])
51])
52
53AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_DISK_BDI], [
54	ZFS_LINUX_TEST_SRC([blk_queue_disk_bdi], [
55		#include <linux/blkdev.h>
56		#include <linux/backing-dev.h>
57	], [
58		struct request_queue q;
59		struct gendisk disk;
60		struct backing_dev_info bdi __attribute__ ((unused));
61		q.disk = &disk;
62		q.disk->bdi = &bdi;
63	])
64])
65
66AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_DISK_BDI], [
67	AC_MSG_CHECKING([whether backing_dev_info is available through queue gendisk])
68	ZFS_LINUX_TEST_RESULT([blk_queue_disk_bdi], [
69		AC_MSG_RESULT(yes)
70		AC_DEFINE(HAVE_BLK_QUEUE_DISK_BDI, 1,
71		    [backing_dev_info is available through queue gendisk])
72	],[
73		AC_MSG_RESULT(no)
74	])
75])
76
77dnl #
78dnl # 5.9: added blk_queue_update_readahead(),
79dnl # 5.15: renamed to disk_update_readahead()
80dnl #
81AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_UPDATE_READAHEAD], [
82	ZFS_LINUX_TEST_SRC([blk_queue_update_readahead], [
83		#include <linux/blkdev.h>
84	],[
85		struct request_queue q;
86		blk_queue_update_readahead(&q);
87	])
88
89	ZFS_LINUX_TEST_SRC([disk_update_readahead], [
90		#include <linux/blkdev.h>
91	],[
92		struct gendisk disk;
93		disk_update_readahead(&disk);
94	])
95])
96
97AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_UPDATE_READAHEAD], [
98	AC_MSG_CHECKING([whether blk_queue_update_readahead() exists])
99	ZFS_LINUX_TEST_RESULT([blk_queue_update_readahead], [
100		AC_MSG_RESULT(yes)
101		AC_DEFINE(HAVE_BLK_QUEUE_UPDATE_READAHEAD, 1,
102		    [blk_queue_update_readahead() exists])
103	],[
104		AC_MSG_RESULT(no)
105
106		AC_MSG_CHECKING([whether disk_update_readahead() exists])
107		ZFS_LINUX_TEST_RESULT([disk_update_readahead], [
108			AC_MSG_RESULT(yes)
109			AC_DEFINE(HAVE_DISK_UPDATE_READAHEAD, 1,
110			    [disk_update_readahead() exists])
111		],[
112			AC_MSG_RESULT(no)
113		])
114	])
115])
116
117dnl #
118dnl # 5.19: bdev_max_discard_sectors() available
119dnl # 2.6.32: blk_queue_discard() available
120dnl #
121AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_DISCARD], [
122	ZFS_LINUX_TEST_SRC([bdev_max_discard_sectors], [
123		#include <linux/blkdev.h>
124	],[
125		struct block_device *bdev __attribute__ ((unused)) = NULL;
126		unsigned int error __attribute__ ((unused));
127
128		error = bdev_max_discard_sectors(bdev);
129	])
130
131	ZFS_LINUX_TEST_SRC([blk_queue_discard], [
132		#include <linux/blkdev.h>
133	],[
134		struct request_queue r;
135		struct request_queue *q = &r;
136		int value __attribute__ ((unused));
137		memset(q, 0, sizeof(r));
138		value = blk_queue_discard(q);
139	],[-Wframe-larger-than=8192])
140])
141
142AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_DISCARD], [
143	AC_MSG_CHECKING([whether bdev_max_discard_sectors() is available])
144	ZFS_LINUX_TEST_RESULT([bdev_max_discard_sectors], [
145		AC_MSG_RESULT(yes)
146		AC_DEFINE(HAVE_BDEV_MAX_DISCARD_SECTORS, 1,
147		    [bdev_max_discard_sectors() is available])
148	],[
149		AC_MSG_RESULT(no)
150
151		AC_MSG_CHECKING([whether blk_queue_discard() is available])
152		ZFS_LINUX_TEST_RESULT([blk_queue_discard], [
153			AC_MSG_RESULT(yes)
154			AC_DEFINE(HAVE_BLK_QUEUE_DISCARD, 1,
155			    [blk_queue_discard() is available])
156		],[
157			ZFS_LINUX_TEST_ERROR([blk_queue_discard])
158		])
159	])
160])
161
162dnl #
163dnl # 5.19: bdev_max_secure_erase_sectors() available
164dnl # 4.8: blk_queue_secure_erase() available
165dnl #
166AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_SECURE_ERASE], [
167	ZFS_LINUX_TEST_SRC([bdev_max_secure_erase_sectors], [
168		#include <linux/blkdev.h>
169	],[
170		struct block_device *bdev __attribute__ ((unused)) = NULL;
171		unsigned int error __attribute__ ((unused));
172
173		error = bdev_max_secure_erase_sectors(bdev);
174	])
175
176	ZFS_LINUX_TEST_SRC([blk_queue_secure_erase], [
177		#include <linux/blkdev.h>
178	],[
179		struct request_queue r;
180		struct request_queue *q = &r;
181		int value __attribute__ ((unused));
182		memset(q, 0, sizeof(r));
183		value = blk_queue_secure_erase(q);
184	],[-Wframe-larger-than=8192])
185])
186
187AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_SECURE_ERASE], [
188	AC_MSG_CHECKING([whether bdev_max_secure_erase_sectors() is available])
189	ZFS_LINUX_TEST_RESULT([bdev_max_secure_erase_sectors], [
190		AC_MSG_RESULT(yes)
191		AC_DEFINE(HAVE_BDEV_MAX_SECURE_ERASE_SECTORS, 1,
192		    [bdev_max_secure_erase_sectors() is available])
193	],[
194		AC_MSG_RESULT(no)
195
196		AC_MSG_CHECKING([whether blk_queue_secure_erase() is available])
197		ZFS_LINUX_TEST_RESULT([blk_queue_secure_erase], [
198			AC_MSG_RESULT(yes)
199			AC_DEFINE(HAVE_BLK_QUEUE_SECURE_ERASE, 1,
200			    [blk_queue_secure_erase() is available])
201		],[
202			ZFS_LINUX_TEST_ERROR([blk_queue_secure_erase])
203		])
204	])
205])
206
207dnl #
208dnl # 2.6.34 API change
209dnl # blk_queue_max_hw_sectors() replaces blk_queue_max_sectors().
210dnl #
211AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_MAX_HW_SECTORS], [
212	ZFS_LINUX_TEST_SRC([blk_queue_max_hw_sectors], [
213		#include <linux/blkdev.h>
214	], [
215		struct request_queue *q __attribute__ ((unused)) = NULL;
216		(void) blk_queue_max_hw_sectors(q, BLK_SAFE_MAX_SECTORS);
217	], [])
218])
219
220AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_MAX_HW_SECTORS], [
221	AC_MSG_CHECKING([whether blk_queue_max_hw_sectors() is available])
222	ZFS_LINUX_TEST_RESULT([blk_queue_max_hw_sectors], [
223		AC_MSG_RESULT(yes)
224	],[
225		AC_MSG_RESULT(no)
226	])
227])
228
229dnl #
230dnl # 7.0 API change
231dnl # blk_queue_rot() replaces blk_queue_nonrot() (inverted meaning)
232dnl #
233AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_ROT], [
234	ZFS_LINUX_TEST_SRC([blk_queue_rot], [
235		#include <linux/blkdev.h>
236	], [
237		struct request_queue *q __attribute__ ((unused)) = NULL;
238		(void) blk_queue_rot(q);
239	], [])
240])
241
242AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_ROT], [
243	AC_MSG_CHECKING([whether blk_queue_rot() is available])
244	ZFS_LINUX_TEST_RESULT([blk_queue_rot], [
245		AC_MSG_RESULT(yes)
246		AC_DEFINE(HAVE_BLK_QUEUE_ROT, 1,
247		    [blk_queue_rot() is available])
248	],[
249		AC_MSG_RESULT(no)
250	])
251])
252
253dnl #
254dnl # 2.6.34 API change
255dnl # blk_queue_max_segments() consolidates blk_queue_max_hw_segments()
256dnl # and blk_queue_max_phys_segments().
257dnl #
258AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_MAX_SEGMENTS], [
259	ZFS_LINUX_TEST_SRC([blk_queue_max_segments], [
260		#include <linux/blkdev.h>
261	], [
262		struct request_queue *q __attribute__ ((unused)) = NULL;
263		(void) blk_queue_max_segments(q, BLK_MAX_SEGMENTS);
264	], [])
265])
266
267AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_MAX_SEGMENTS], [
268	AC_MSG_CHECKING([whether blk_queue_max_segments() is available])
269	ZFS_LINUX_TEST_RESULT([blk_queue_max_segments], [
270		AC_MSG_RESULT(yes)
271	], [
272		AC_MSG_RESULT(no)
273	])
274])
275
276AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_MQ_RQ_HCTX], [
277	ZFS_LINUX_TEST_SRC([blk_mq_rq_hctx], [
278		#include <linux/blk-mq.h>
279		#include <linux/blkdev.h>
280	], [
281		struct request rq = {0};
282		struct blk_mq_hw_ctx *hctx = NULL;
283		rq.mq_hctx = hctx;
284	], [])
285])
286
287AC_DEFUN([ZFS_AC_KERNEL_BLK_MQ_RQ_HCTX], [
288	AC_MSG_CHECKING([whether block multiqueue hardware context is cached in struct request])
289	ZFS_LINUX_TEST_RESULT([blk_mq_rq_hctx], [
290		AC_MSG_RESULT(yes)
291		AC_DEFINE(HAVE_BLK_MQ_RQ_HCTX, 1, [block multiqueue hardware context is cached in struct request])
292	], [
293		AC_MSG_RESULT(no)
294	])
295])
296
297AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE], [
298	ZFS_AC_KERNEL_SRC_BLK_QUEUE_PLUG
299	ZFS_AC_KERNEL_SRC_BLK_QUEUE_BDI
300	ZFS_AC_KERNEL_SRC_BLK_QUEUE_DISK_BDI
301	ZFS_AC_KERNEL_SRC_BLK_QUEUE_UPDATE_READAHEAD
302	ZFS_AC_KERNEL_SRC_BLK_QUEUE_DISCARD
303	ZFS_AC_KERNEL_SRC_BLK_QUEUE_SECURE_ERASE
304	ZFS_AC_KERNEL_SRC_BLK_QUEUE_MAX_HW_SECTORS
305	ZFS_AC_KERNEL_SRC_BLK_QUEUE_MAX_SEGMENTS
306	ZFS_AC_KERNEL_SRC_BLK_QUEUE_ROT
307	ZFS_AC_KERNEL_SRC_BLK_MQ_RQ_HCTX
308])
309
310AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE], [
311	ZFS_AC_KERNEL_BLK_QUEUE_PLUG
312	ZFS_AC_KERNEL_BLK_QUEUE_BDI
313	ZFS_AC_KERNEL_BLK_QUEUE_DISK_BDI
314	ZFS_AC_KERNEL_BLK_QUEUE_UPDATE_READAHEAD
315	ZFS_AC_KERNEL_BLK_QUEUE_DISCARD
316	ZFS_AC_KERNEL_BLK_QUEUE_SECURE_ERASE
317	ZFS_AC_KERNEL_BLK_QUEUE_MAX_HW_SECTORS
318	ZFS_AC_KERNEL_BLK_QUEUE_MAX_SEGMENTS
319	ZFS_AC_KERNEL_BLK_QUEUE_ROT
320	ZFS_AC_KERNEL_BLK_MQ_RQ_HCTX
321])
322