aboutsummaryrefslogtreecommitdiffstats
path: root/config/kernel-generic_io_acct.m4
blob: a6a1090042948f2357244c8405b20340396b7072 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
dnl #
dnl # Check for generic io accounting interface.
dnl #
AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT], [
	ZFS_LINUX_TEST_SRC([bdev_io_acct_63], [
		#include <linux/blkdev.h>
	], [
		struct block_device *bdev = NULL;
		struct bio *bio = NULL;
		unsigned long passed_time = 0;
		unsigned long start_time;

		start_time = bdev_start_io_acct(bdev, bio_op(bio),
		    passed_time);
		bdev_end_io_acct(bdev, bio_op(bio), bio_sectors(bio), start_time);
	])

	ZFS_LINUX_TEST_SRC([bdev_io_acct_old], [
		#include <linux/blkdev.h>
	], [
		struct block_device *bdev = NULL;
		struct bio *bio = NULL;
		unsigned long passed_time = 0;
		unsigned long start_time;

		start_time = bdev_start_io_acct(bdev, bio_sectors(bio),
		    bio_op(bio), passed_time);
		bdev_end_io_acct(bdev, bio_op(bio), start_time);
	])

	ZFS_LINUX_TEST_SRC([disk_io_acct], [
		#include <linux/blkdev.h>
	], [
		struct gendisk *disk = NULL;
		struct bio *bio = NULL;
		unsigned long start_time;

		start_time = disk_start_io_acct(disk, bio_sectors(bio), bio_op(bio));
		disk_end_io_acct(disk, bio_op(bio), start_time);
	])

	ZFS_LINUX_TEST_SRC([bio_io_acct], [
		#include <linux/blkdev.h>
	], [
		struct bio *bio = NULL;
		unsigned long start_time;

		start_time = bio_start_io_acct(bio);
		bio_end_io_acct(bio, start_time);
	])

	ZFS_LINUX_TEST_SRC([generic_acct_3args], [
		#include <linux/bio.h>

		void (*generic_start_io_acct_f)(int, unsigned long,
		    struct hd_struct *) = &generic_start_io_acct;
		void (*generic_end_io_acct_f)(int, struct hd_struct *,
		    unsigned long) = &generic_end_io_acct;
	], [
		generic_start_io_acct(0, 0, NULL);
		generic_end_io_acct(0, NULL, 0);
	])

	ZFS_LINUX_TEST_SRC([generic_acct_4args], [
		#include <linux/bio.h>

		void (*generic_start_io_acct_f)(struct request_queue *, int,
		    unsigned long, struct hd_struct *) = &generic_start_io_acct;
		void (*generic_end_io_acct_f)(struct request_queue *, int,
		    struct hd_struct *, unsigned long) = &generic_end_io_acct;
	], [
		generic_start_io_acct(NULL, 0, 0, NULL);
		generic_end_io_acct(NULL, 0, NULL, 0);
	])
])

AC_DEFUN([ZFS_AC_KERNEL_GENERIC_IO_ACCT], [
	dnl #
	dnl # Linux 6.3, and then backports thereof, changed
	dnl # the signatures on bdev_start_io_acct/bdev_end_io_acct
	dnl #
	AC_MSG_CHECKING([whether 6.3+ bdev_*_io_acct() are available])
	ZFS_LINUX_TEST_RESULT([bdev_io_acct_63], [
		AC_MSG_RESULT(yes)
		AC_DEFINE(HAVE_BDEV_IO_ACCT_63, 1, [bdev_*_io_acct() available])
	], [
		AC_MSG_RESULT(no)

		dnl #
		dnl # 5.19 API,
		dnl #
		dnl # disk_start_io_acct() and disk_end_io_acct() have been replaced by
		dnl # bdev_start_io_acct() and bdev_end_io_acct().
		dnl #
		AC_MSG_CHECKING([whether pre-6.3 bdev_*_io_acct() are available])
		ZFS_LINUX_TEST_RESULT([bdev_io_acct_old], [
			AC_MSG_RESULT(yes)
			AC_DEFINE(HAVE_BDEV_IO_ACCT_OLD, 1, [bdev_*_io_acct() available])
		], [
			AC_MSG_RESULT(no)
			dnl #
			dnl # 5.12 API,
			dnl #
			dnl # bio_start_io_acct() and bio_end_io_acct() became GPL-exported
			dnl # so use disk_start_io_acct() and disk_end_io_acct() instead
			dnl #
			AC_MSG_CHECKING([whether generic disk_*_io_acct() are available])
			ZFS_LINUX_TEST_RESULT([disk_io_acct], [
				AC_MSG_RESULT(yes)
				AC_DEFINE(HAVE_DISK_IO_ACCT, 1, [disk_*_io_acct() available])
			], [
				AC_MSG_RESULT(no)

				dnl #
				dnl # 5.7 API,
				dnl #
				dnl # Added bio_start_io_acct() and bio_end_io_acct() helpers.
				dnl #
				AC_MSG_CHECKING([whether generic bio_*_io_acct() are available])
				ZFS_LINUX_TEST_RESULT([bio_io_acct], [
					AC_MSG_RESULT(yes)
					AC_DEFINE(HAVE_BIO_IO_ACCT, 1, [bio_*_io_acct() available])
				], [
					AC_MSG_RESULT(no)

					dnl #
					dnl # 4.14 API,
					dnl #
					dnl # generic_start_io_acct/generic_end_io_acct now require
					dnl # request_queue to be provided. No functional changes,
					dnl # but preparation for inflight accounting.
					dnl #
					AC_MSG_CHECKING([whether generic_*_io_acct wants 4 args])
					ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_4args],
					    [generic_start_io_acct], [block/bio.c], [
						AC_MSG_RESULT(yes)
						AC_DEFINE(HAVE_GENERIC_IO_ACCT_4ARG, 1,
						    [generic_*_io_acct() 4 arg available])
					], [
						AC_MSG_RESULT(no)

						dnl #
						dnl # 3.19 API addition
						dnl #
						dnl # torvalds/linux@394ffa50 allows us to increment
						dnl # iostat counters without generic_make_request().
						dnl #
						AC_MSG_CHECKING(
						    [whether generic_*_io_acct wants 3 args])
						ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_3args],
						    [generic_start_io_acct], [block/bio.c], [
							AC_MSG_RESULT(yes)
							AC_DEFINE(HAVE_GENERIC_IO_ACCT_3ARG, 1,
							    [generic_*_io_acct() 3 arg available])
						], [
							AC_MSG_RESULT(no)
						])
					])
				])
			])
		])
	])
])