aboutsummaryrefslogtreecommitdiffstats
path: root/include/os
diff options
context:
space:
mode:
authorRob Norris <[email protected]>2024-07-30 21:40:35 +1000
committerTony Hutter <[email protected]>2024-08-22 15:42:14 -0700
commit4fa84563b84b73eaa4d5ad126476b5142448f9b1 (patch)
tree7fc9c4afa559a5c61b7234c5b1dac4c8215af958 /include/os
parent6961d4fb573e030b60efa983d7f3a52f88cd3875 (diff)
Linux 6.11: enable queue flush through queue limits
In 6.11 struct queue_limits gains a 'features' field, where, among other things, flush and write-cache are enabled. Detect it and use it. Along the way, the blk_queue_set_write_cache() compat wrapper gets a little cleanup. Since both flags are alway set together, its now a single bool. Also the very very ancient version that sets q->flush_flags directly couldn't actually turn it off, so I've fixed that. Not that we use it, but still. Reviewed-by: Tony Hutter <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Rob Norris <[email protected]> Sponsored-by: https://despairlabs.com/sponsor/ Closes #16400
Diffstat (limited to 'include/os')
-rw-r--r--include/os/linux/kernel/linux/blkdev_compat.h31
1 files changed, 19 insertions, 12 deletions
diff --git a/include/os/linux/kernel/linux/blkdev_compat.h b/include/os/linux/kernel/linux/blkdev_compat.h
index b0f398354..0d07fd4b8 100644
--- a/include/os/linux/kernel/linux/blkdev_compat.h
+++ b/include/os/linux/kernel/linux/blkdev_compat.h
@@ -57,6 +57,11 @@ blk_queue_flag_clear(unsigned int flag, struct request_queue *q)
#endif
/*
+ * 6.11 API
+ * Setting the flush flags directly is no longer possible; flush flags are set
+ * on the queue_limits structure and passed to blk_disk_alloc(). In this case
+ * we remove this function entirely.
+ *
* 4.7 API,
* The blk_queue_write_cache() interface has replaced blk_queue_flush()
* interface. However, the new interface is GPL-only thus we implement
@@ -68,31 +73,33 @@ blk_queue_flag_clear(unsigned int flag, struct request_queue *q)
* new one is GPL-only. Thus if the GPL-only version is detected we
* implement our own trivial helper.
*/
+#if !defined(HAVE_BLK_ALLOC_DISK_2ARG) || \
+ !defined(HAVE_BLKDEV_QUEUE_LIMITS_FEATURES)
static inline void
-blk_queue_set_write_cache(struct request_queue *q, bool wc, bool fua)
+blk_queue_set_write_cache(struct request_queue *q, bool on)
{
#if defined(HAVE_BLK_QUEUE_WRITE_CACHE_GPL_ONLY)
- if (wc)
+ if (on) {
blk_queue_flag_set(QUEUE_FLAG_WC, q);
- else
- blk_queue_flag_clear(QUEUE_FLAG_WC, q);
- if (fua)
blk_queue_flag_set(QUEUE_FLAG_FUA, q);
- else
+ } else {
+ blk_queue_flag_clear(QUEUE_FLAG_WC, q);
blk_queue_flag_clear(QUEUE_FLAG_FUA, q);
+ }
#elif defined(HAVE_BLK_QUEUE_WRITE_CACHE)
- blk_queue_write_cache(q, wc, fua);
+ blk_queue_write_cache(q, on, on);
#elif defined(HAVE_BLK_QUEUE_FLUSH_GPL_ONLY)
- if (wc)
- q->flush_flags |= REQ_FLUSH;
- if (fua)
- q->flush_flags |= REQ_FUA;
+ if (on)
+ q->flush_flags |= REQ_FLUSH | REQ_FUA;
+ else
+ q->flush_flags &= ~(REQ_FLUSH | REQ_FUA);
#elif defined(HAVE_BLK_QUEUE_FLUSH)
- blk_queue_flush(q, (wc ? REQ_FLUSH : 0) | (fua ? REQ_FUA : 0));
+ blk_queue_flush(q, on ? (REQ_FLUSH | REQ_FUA) : 0);
#else
#error "Unsupported kernel"
#endif
}
+#endif /* !HAVE_BLK_ALLOC_DISK_2ARG || !HAVE_BLKDEV_QUEUE_LIMITS_FEATURES */
static inline void
blk_queue_set_read_ahead(struct request_queue *q, unsigned long ra_pages)