zvol_os: fix compile with blk-mq on Linux 4.x
99741bde5
accesses a cached blk-mq hardware context through the mq_hctx
field of struct request. However, this field did not exist until 5.0.
Before that, the private function blk_mq_map_queue() was used to dig it
out of broader queue context. This commit detects this situation, and
handles it with a poor-man's simulation of that function.
Sponsored-by: Klara, Inc.
Sponsored-by: Wasabi Technology, Inc.
Reviewed-by: Ameer Hamza <ahamza@ixsystems.com>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Rob Norris <rob.norris@klarasystems.com>
Closes #16069
This commit is contained in:
parent
5c0fe099ec
commit
3c5f354a8c
|
@ -377,6 +377,14 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_MQ], [
|
||||||
(void) blk_mq_alloc_tag_set(&tag_set);
|
(void) blk_mq_alloc_tag_set(&tag_set);
|
||||||
return BLK_STS_OK;
|
return BLK_STS_OK;
|
||||||
], [])
|
], [])
|
||||||
|
ZFS_LINUX_TEST_SRC([blk_mq_rq_hctx], [
|
||||||
|
#include <linux/blk-mq.h>
|
||||||
|
#include <linux/blkdev.h>
|
||||||
|
], [
|
||||||
|
struct request rq = {0};
|
||||||
|
struct blk_mq_hw_ctx *hctx = NULL;
|
||||||
|
rq.mq_hctx = hctx;
|
||||||
|
], [])
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_BLK_MQ], [
|
AC_DEFUN([ZFS_AC_KERNEL_BLK_MQ], [
|
||||||
|
@ -384,6 +392,13 @@ AC_DEFUN([ZFS_AC_KERNEL_BLK_MQ], [
|
||||||
ZFS_LINUX_TEST_RESULT([blk_mq], [
|
ZFS_LINUX_TEST_RESULT([blk_mq], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_BLK_MQ, 1, [block multiqueue is available])
|
AC_DEFINE(HAVE_BLK_MQ, 1, [block multiqueue is available])
|
||||||
|
AC_MSG_CHECKING([whether block multiqueue hardware context is cached in struct request])
|
||||||
|
ZFS_LINUX_TEST_RESULT([blk_mq_rq_hctx], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_BLK_MQ_RQ_HCTX, 1, [block multiqueue hardware context is cached in struct request])
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
], [
|
], [
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
])
|
])
|
||||||
|
|
|
@ -551,7 +551,12 @@ zvol_request_impl(zvol_state_t *zv, struct bio *bio, struct request *rq,
|
||||||
uint_t taskq_hash;
|
uint_t taskq_hash;
|
||||||
#ifdef HAVE_BLK_MQ
|
#ifdef HAVE_BLK_MQ
|
||||||
if (rq)
|
if (rq)
|
||||||
|
#ifdef HAVE_BLK_MQ_RQ_HCTX
|
||||||
blk_mq_hw_queue = rq->mq_hctx->queue_num;
|
blk_mq_hw_queue = rq->mq_hctx->queue_num;
|
||||||
|
#else
|
||||||
|
blk_mq_hw_queue =
|
||||||
|
rq->q->queue_hw_ctx[rq->q->mq_map[rq->cpu]]->queue_num;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
taskq_hash = cityhash4((uintptr_t)zv, offset >> ZVOL_TASKQ_OFFSET_SHIFT,
|
taskq_hash = cityhash4((uintptr_t)zv, offset >> ZVOL_TASKQ_OFFSET_SHIFT,
|
||||||
blk_mq_hw_queue, 0);
|
blk_mq_hw_queue, 0);
|
||||||
|
|
Loading…
Reference in New Issue