Skip to content

Commit 36720b8

Browse files
committed
Add another bdev_io_acct case for Linux 6.3+ compat
Linux 6.3+, and backports from it, changed the signatures on bdev_io_{start,end}_acct. Add a case for it. Fixes: openzfs#14658 Signed-off-by: Rich Ercolani <[email protected]>
1 parent 9fa007d commit 36720b8

File tree

2 files changed

+68
-39
lines changed

2 files changed

+68
-39
lines changed

config/kernel-generic_io_acct.m4

+61-37
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,20 @@ dnl #
22
dnl # Check for generic io accounting interface.
33
dnl #
44
AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT], [
5-
ZFS_LINUX_TEST_SRC([bdev_io_acct], [
5+
ZFS_LINUX_TEST_SRC([bdev_io_acct_63], [
6+
#include <linux/blkdev.h>
7+
], [
8+
struct block_device *bdev = NULL;
9+
struct bio *bio = NULL;
10+
unsigned long passed_time = 0;
11+
unsigned long start_time;
12+
13+
start_time = bdev_start_io_acct(bdev, bio_op(bio),
14+
passed_time);
15+
bdev_end_io_acct(bdev, bio_op(bio), bio_sectors(bio), start_time);
16+
])
17+
18+
ZFS_LINUX_TEST_SRC([bdev_io_acct_old], [
619
#include <linux/blkdev.h>
720
], [
821
struct block_device *bdev = NULL;
@@ -63,74 +76,85 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT], [
6376

6477
AC_DEFUN([ZFS_AC_KERNEL_GENERIC_IO_ACCT], [
6578
dnl #
66-
dnl # 5.19 API,
79+
dnl # Linux 6.3, and then backports thereof, changed
80+
dnl # the signatures on bdev_start_io_acct/bdev_end_io_acct
6781
dnl #
68-
dnl # disk_start_io_acct() and disk_end_io_acct() have been replaced by
69-
dnl # bdev_start_io_acct() and bdev_end_io_acct().
70-
dnl #
71-
AC_MSG_CHECKING([whether generic bdev_*_io_acct() are available])
72-
ZFS_LINUX_TEST_RESULT([bdev_io_acct], [
82+
AC_MSG_CHECKING([whether 6.3+ bdev_*_io_acct() are available])
83+
ZFS_LINUX_TEST_RESULT([bdev_io_acct_63], [
7384
AC_MSG_RESULT(yes)
74-
AC_DEFINE(HAVE_BDEV_IO_ACCT, 1, [bdev_*_io_acct() available])
85+
AC_DEFINE(HAVE_BDEV_IO_ACCT_63, 1, [bdev_*_io_acct() available])
7586
], [
7687
AC_MSG_RESULT(no)
7788
7889
dnl #
79-
dnl # 5.12 API,
90+
dnl # 5.19 API,
8091
dnl #
81-
dnl # bio_start_io_acct() and bio_end_io_acct() became GPL-exported
82-
dnl # so use disk_start_io_acct() and disk_end_io_acct() instead
92+
dnl # disk_start_io_acct() and disk_end_io_acct() have been replaced by
93+
dnl # bdev_start_io_acct() and bdev_end_io_acct().
8394
dnl #
84-
AC_MSG_CHECKING([whether generic disk_*_io_acct() are available])
85-
ZFS_LINUX_TEST_RESULT([disk_io_acct], [
95+
AC_MSG_CHECKING([whether pre-6.3 bdev_*_io_acct() are available])
96+
ZFS_LINUX_TEST_RESULT([bdev_io_acct_old], [
8697
AC_MSG_RESULT(yes)
87-
AC_DEFINE(HAVE_DISK_IO_ACCT, 1, [disk_*_io_acct() available])
98+
AC_DEFINE(HAVE_BDEV_IO_ACCT_OLD, 1, [bdev_*_io_acct() available])
8899
], [
89100
AC_MSG_RESULT(no)
90-
91101
dnl #
92-
dnl # 5.7 API,
102+
dnl # 5.12 API,
93103
dnl #
94-
dnl # Added bio_start_io_acct() and bio_end_io_acct() helpers.
104+
dnl # bio_start_io_acct() and bio_end_io_acct() became GPL-exported
105+
dnl # so use disk_start_io_acct() and disk_end_io_acct() instead
95106
dnl #
96-
AC_MSG_CHECKING([whether generic bio_*_io_acct() are available])
97-
ZFS_LINUX_TEST_RESULT([bio_io_acct], [
107+
AC_MSG_CHECKING([whether generic disk_*_io_acct() are available])
108+
ZFS_LINUX_TEST_RESULT([disk_io_acct], [
98109
AC_MSG_RESULT(yes)
99-
AC_DEFINE(HAVE_BIO_IO_ACCT, 1, [bio_*_io_acct() available])
110+
AC_DEFINE(HAVE_DISK_IO_ACCT, 1, [disk_*_io_acct() available])
100111
], [
101112
AC_MSG_RESULT(no)
102113
103114
dnl #
104-
dnl # 4.14 API,
115+
dnl # 5.7 API,
105116
dnl #
106-
dnl # generic_start_io_acct/generic_end_io_acct now require
107-
dnl # request_queue to be provided. No functional changes,
108-
dnl # but preparation for inflight accounting.
117+
dnl # Added bio_start_io_acct() and bio_end_io_acct() helpers.
109118
dnl #
110-
AC_MSG_CHECKING([whether generic_*_io_acct wants 4 args])
111-
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_4args],
112-
[generic_start_io_acct], [block/bio.c], [
119+
AC_MSG_CHECKING([whether generic bio_*_io_acct() are available])
120+
ZFS_LINUX_TEST_RESULT([bio_io_acct], [
113121
AC_MSG_RESULT(yes)
114-
AC_DEFINE(HAVE_GENERIC_IO_ACCT_4ARG, 1,
115-
[generic_*_io_acct() 4 arg available])
122+
AC_DEFINE(HAVE_BIO_IO_ACCT, 1, [bio_*_io_acct() available])
116123
], [
117124
AC_MSG_RESULT(no)
118125
119126
dnl #
120-
dnl # 3.19 API addition
127+
dnl # 4.14 API,
121128
dnl #
122-
dnl # torvalds/linux@394ffa50 allows us to increment
123-
dnl # iostat counters without generic_make_request().
129+
dnl # generic_start_io_acct/generic_end_io_acct now require
130+
dnl # request_queue to be provided. No functional changes,
131+
dnl # but preparation for inflight accounting.
124132
dnl #
125-
AC_MSG_CHECKING(
126-
[whether generic_*_io_acct wants 3 args])
127-
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_3args],
133+
AC_MSG_CHECKING([whether generic_*_io_acct wants 4 args])
134+
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_4args],
128135
[generic_start_io_acct], [block/bio.c], [
129136
AC_MSG_RESULT(yes)
130-
AC_DEFINE(HAVE_GENERIC_IO_ACCT_3ARG, 1,
131-
[generic_*_io_acct() 3 arg available])
137+
AC_DEFINE(HAVE_GENERIC_IO_ACCT_4ARG, 1,
138+
[generic_*_io_acct() 4 arg available])
132139
], [
133140
AC_MSG_RESULT(no)
141+
142+
dnl #
143+
dnl # 3.19 API addition
144+
dnl #
145+
dnl # torvalds/linux@394ffa50 allows us to increment
146+
dnl # iostat counters without generic_make_request().
147+
dnl #
148+
AC_MSG_CHECKING(
149+
[whether generic_*_io_acct wants 3 args])
150+
ZFS_LINUX_TEST_RESULT_SYMBOL([generic_acct_3args],
151+
[generic_start_io_acct], [block/bio.c], [
152+
AC_MSG_RESULT(yes)
153+
AC_DEFINE(HAVE_GENERIC_IO_ACCT_3ARG, 1,
154+
[generic_*_io_acct() 3 arg available])
155+
], [
156+
AC_MSG_RESULT(no)
157+
])
134158
])
135159
])
136160
])

include/os/linux/kernel/linux/blkdev_compat.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,10 @@ blk_generic_start_io_acct(struct request_queue *q __attribute__((unused)),
592592
struct gendisk *disk __attribute__((unused)),
593593
int rw __attribute__((unused)), struct bio *bio)
594594
{
595-
#if defined(HAVE_BDEV_IO_ACCT)
595+
#if defined(HAVE_BDEV_IO_ACCT_63)
596+
return (bdev_start_io_acct(bio->bi_bdev, bio_op(bio),
597+
jiffies));
598+
#elif defined(HAVE_BDEV_IO_ACCT_OLD)
596599
return (bdev_start_io_acct(bio->bi_bdev, bio_sectors(bio),
597600
bio_op(bio), jiffies));
598601
#elif defined(HAVE_DISK_IO_ACCT)
@@ -618,7 +621,9 @@ blk_generic_end_io_acct(struct request_queue *q __attribute__((unused)),
618621
struct gendisk *disk __attribute__((unused)),
619622
int rw __attribute__((unused)), struct bio *bio, unsigned long start_time)
620623
{
621-
#if defined(HAVE_BDEV_IO_ACCT)
624+
#if defined(HAVE_BDEV_IO_ACCT_63)
625+
bdev_end_io_acct(bio->bi_bdev, bio_op(bio), bio_sectors(bio), start_time);
626+
#elif defined(HAVE_BDEV_IO_ACCT_OLD)
622627
bdev_end_io_acct(bio->bi_bdev, bio_op(bio), start_time);
623628
#elif defined(HAVE_DISK_IO_ACCT)
624629
disk_end_io_acct(disk, bio_op(bio), start_time);

0 commit comments

Comments
 (0)