aboutsummaryrefslogtreecommitdiffstats
path: root/config/kernel-generic_io_acct.m4
blob: a8a448c6fe96285e3993b4e656f417fda6237095 (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
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], [
		#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 # 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 generic bdev_*_io_acct() are available])
	ZFS_LINUX_TEST_RESULT([bdev_io_acct], [
		AC_MSG_RESULT(yes)
		AC_DEFINE(HAVE_BDEV_IO_ACCT, 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)
					])
				])
			])
		])
	])
])