From 889ad0b8905ad64624aa9eba244827f2f1cce91c Mon Sep 17 00:00:00 2001
From: John Baldwin <jhb@FreeBSD.org>
Date: Fri, 13 Dec 2019 19:27:51 +0000
Subject: [PATCH] Use a callout instead of timeout(9) for delayed zio's.

Reviewed by:	avg
Differential Revision:	https://reviews.freebsd.org/D22597
---
 sys/cddl/compat/opensolaris/sys/systm.h              |  3 ---
 .../contrib/opensolaris/uts/common/fs/zfs/sys/zio.h  |  3 +++
 sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c | 12 ++++++++++++
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/sys/cddl/compat/opensolaris/sys/systm.h b/sys/cddl/compat/opensolaris/sys/systm.h
index f6a0dce4502b..fe0e1998c2c4 100644
--- a/sys/cddl/compat/opensolaris/sys/systm.h
+++ b/sys/cddl/compat/opensolaris/sys/systm.h
@@ -42,9 +42,6 @@
 
 #define	delay(x)	pause("soldelay", (x))
 
-#define	timeout_generic(type, fn, arg, t, r, f)			\
-    timeout(fn, arg, t / (NANOSEC/hz) + 1)
-
 #endif	/* _KERNEL */
 
 #endif	/* _OPENSOLARIS_SYS_SYSTM_H_ */
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
index dcf8f5d48924..d1c66933b3bd 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
@@ -474,6 +474,9 @@ struct zio {
 
 #ifdef __FreeBSD__
 	struct bio	*io_bio;
+#ifdef _KERNEL
+	struct callout	io_timer;
+#endif
 #endif
 
 	/* Internal pipeline state */
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
index 3b5dc482d55b..6cacc6a8e227 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zio.c
@@ -659,6 +659,9 @@ zio_create(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
 
 	mutex_init(&zio->io_lock, NULL, MUTEX_DEFAULT, NULL);
 	cv_init(&zio->io_cv, NULL, CV_DEFAULT, NULL);
+#if defined(__FreeBSD__) && defined(_KERNEL)
+	callout_init(&zio->io_timer, 1);
+#endif
 
 	list_create(&zio->io_parent_list, sizeof (zio_link_t),
 	    offsetof(zio_link_t, zl_parent_node));
@@ -726,6 +729,10 @@ zio_create(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
 static void
 zio_destroy(zio_t *zio)
 {
+#ifdef __FreeBSD__
+	KASSERT(!(callout_active(&zio->io_timer) ||
+	    callout_pending(&zio->io_timer)), ("zio_destroy: timer active"));
+#endif
 	metaslab_trace_fini(&zio->io_alloc_list);
 	list_destroy(&zio->io_parent_list);
 	list_destroy(&zio->io_child_list);
@@ -1710,8 +1717,13 @@ zio_delay_interrupt(zio_t *zio)
 			DTRACE_PROBE3(zio__delay__hit, zio_t *, zio,
 			    hrtime_t, now, hrtime_t, diff);
 
+#ifdef __FreeBSD__
+			callout_reset_sbt(&zio->io_timer, nstosbt(diff), 0,
+			    (void (*)(void *))zio_interrupt, zio, C_HARDCLOCK);
+#else
 			(void) timeout_generic(CALLOUT_NORMAL,
 			    (void (*)(void *))zio_interrupt, zio, diff, 1, 0);
+#endif
 		}
 
 		return;