block: remove blk-exec.c
authorChristoph Hellwig <hch@lst.de>
Wed, 17 Nov 2021 06:13:56 +0000 (07:13 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 29 Nov 2021 13:34:50 +0000 (06:34 -0700)
All this code is tightly coupled to the blk-mq core, so move it
there.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Link: https://lore.kernel.org/r/20211117061404.331732-4-hch@lst.de
[axboe: remove doc generation for blk-exec.c]
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Documentation/core-api/kernel-api.rst
Documentation/translations/zh_CN/core-api/kernel-api.rst
block/Makefile
block/blk-exec.c [deleted file]
block/blk-mq.c

index 2e71868..19f501d 100644 (file)
@@ -294,9 +294,6 @@ Block Devices
 .. kernel-doc:: block/blk-settings.c
    :export:
 
-.. kernel-doc:: block/blk-exec.c
-   :export:
-
 .. kernel-doc:: block/blk-flush.c
    :export:
 
index 44df57e..f38eaa6 100644 (file)
@@ -5,7 +5,7 @@
 
 obj-y          := bdev.o fops.o bio.o elevator.o blk-core.o blk-sysfs.o \
                        blk-flush.o blk-settings.o blk-ioc.o blk-map.o \
-                       blk-exec.o blk-merge.o blk-timeout.o \
+                       blk-merge.o blk-timeout.o \
                        blk-lib.o blk-mq.o blk-mq-tag.o blk-stat.o \
                        blk-mq-sysfs.o blk-mq-cpumap.o blk-mq-sched.o ioctl.o \
                        genhd.o ioprio.o badblocks.o partitions/ blk-rq-qos.o \
diff --git a/block/blk-exec.c b/block/blk-exec.c
deleted file mode 100644 (file)
index 1b8b47f..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Functions related to setting various queue properties from drivers
- */
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/bio.h>
-#include <linux/blkdev.h>
-#include <linux/blk-mq.h>
-#include <linux/sched/sysctl.h>
-
-#include "blk.h"
-#include "blk-mq-sched.h"
-
-/**
- * blk_end_sync_rq - executes a completion event on a request
- * @rq: request to complete
- * @error: end I/O status of the request
- */
-static void blk_end_sync_rq(struct request *rq, blk_status_t error)
-{
-       struct completion *waiting = rq->end_io_data;
-
-       rq->end_io_data = (void *)(uintptr_t)error;
-
-       /*
-        * complete last, if this is a stack request the process (and thus
-        * the rq pointer) could be invalid right after this complete()
-        */
-       complete(waiting);
-}
-
-/**
- * blk_execute_rq_nowait - insert a request to I/O scheduler for execution
- * @bd_disk:   matching gendisk
- * @rq:                request to insert
- * @at_head:    insert request at head or tail of queue
- * @done:      I/O completion handler
- *
- * Description:
- *    Insert a fully prepared request at the back of the I/O scheduler queue
- *    for execution.  Don't wait for completion.
- *
- * Note:
- *    This function will invoke @done directly if the queue is dead.
- */
-void blk_execute_rq_nowait(struct gendisk *bd_disk, struct request *rq,
-                          int at_head, rq_end_io_fn *done)
-{
-       WARN_ON(irqs_disabled());
-       WARN_ON(!blk_rq_is_passthrough(rq));
-
-       rq->rq_disk = bd_disk;
-       rq->end_io = done;
-
-       blk_account_io_start(rq);
-
-       /*
-        * don't check dying flag for MQ because the request won't
-        * be reused after dying flag is set
-        */
-       blk_mq_sched_insert_request(rq, at_head, true, false);
-}
-EXPORT_SYMBOL_GPL(blk_execute_rq_nowait);
-
-static bool blk_rq_is_poll(struct request *rq)
-{
-       if (!rq->mq_hctx)
-               return false;
-       if (rq->mq_hctx->type != HCTX_TYPE_POLL)
-               return false;
-       if (WARN_ON_ONCE(!rq->bio))
-               return false;
-       return true;
-}
-
-static void blk_rq_poll_completion(struct request *rq, struct completion *wait)
-{
-       do {
-               bio_poll(rq->bio, NULL, 0);
-               cond_resched();
-       } while (!completion_done(wait));
-}
-
-/**
- * blk_execute_rq - insert a request into queue for execution
- * @bd_disk:   matching gendisk
- * @rq:                request to insert
- * @at_head:    insert request at head or tail of queue
- *
- * Description:
- *    Insert a fully prepared request at the back of the I/O scheduler queue
- *    for execution and wait for completion.
- * Return: The blk_status_t result provided to blk_mq_end_request().
- */
-blk_status_t blk_execute_rq(struct gendisk *bd_disk, struct request *rq, int at_head)
-{
-       DECLARE_COMPLETION_ONSTACK(wait);
-       unsigned long hang_check;
-
-       rq->end_io_data = &wait;
-       blk_execute_rq_nowait(bd_disk, rq, at_head, blk_end_sync_rq);
-
-       /* Prevent hang_check timer from firing at us during very long I/O */
-       hang_check = sysctl_hung_task_timeout_secs;
-
-       if (blk_rq_is_poll(rq))
-               blk_rq_poll_completion(rq, &wait);
-       else if (hang_check)
-               while (!wait_for_completion_io_timeout(&wait, hang_check * (HZ/2)));
-       else
-               wait_for_completion_io(&wait);
-
-       return (blk_status_t)(uintptr_t)rq->end_io_data;
-}
-EXPORT_SYMBOL(blk_execute_rq);
index 8874a63..3e5dc87 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/crash_dump.h>
 #include <linux/prefetch.h>
 #include <linux/blk-crypto.h>
+#include <linux/sched/sysctl.h>
 
 #include <trace/events/block.h>
 
@@ -1058,6 +1059,112 @@ void blk_mq_start_request(struct request *rq)
 }
 EXPORT_SYMBOL(blk_mq_start_request);
 
+/**
+ * blk_end_sync_rq - executes a completion event on a request
+ * @rq: request to complete
+ * @error: end I/O status of the request
+ */
+static void blk_end_sync_rq(struct request *rq, blk_status_t error)
+{
+       struct completion *waiting = rq->end_io_data;
+
+       rq->end_io_data = (void *)(uintptr_t)error;
+
+       /*
+        * complete last, if this is a stack request the process (and thus
+        * the rq pointer) could be invalid right after this complete()
+        */
+       complete(waiting);
+}
+
+/**
+ * blk_execute_rq_nowait - insert a request to I/O scheduler for execution
+ * @bd_disk:   matching gendisk
+ * @rq:                request to insert
+ * @at_head:    insert request at head or tail of queue
+ * @done:      I/O completion handler
+ *
+ * Description:
+ *    Insert a fully prepared request at the back of the I/O scheduler queue
+ *    for execution.  Don't wait for completion.
+ *
+ * Note:
+ *    This function will invoke @done directly if the queue is dead.
+ */
+void blk_execute_rq_nowait(struct gendisk *bd_disk, struct request *rq,
+                          int at_head, rq_end_io_fn *done)
+{
+       WARN_ON(irqs_disabled());
+       WARN_ON(!blk_rq_is_passthrough(rq));
+
+       rq->rq_disk = bd_disk;
+       rq->end_io = done;
+
+       blk_account_io_start(rq);
+
+       /*
+        * don't check dying flag for MQ because the request won't
+        * be reused after dying flag is set
+        */
+       blk_mq_sched_insert_request(rq, at_head, true, false);
+}
+EXPORT_SYMBOL_GPL(blk_execute_rq_nowait);
+
+static bool blk_rq_is_poll(struct request *rq)
+{
+       if (!rq->mq_hctx)
+               return false;
+       if (rq->mq_hctx->type != HCTX_TYPE_POLL)
+               return false;
+       if (WARN_ON_ONCE(!rq->bio))
+               return false;
+       return true;
+}
+
+static void blk_rq_poll_completion(struct request *rq, struct completion *wait)
+{
+       do {
+               bio_poll(rq->bio, NULL, 0);
+               cond_resched();
+       } while (!completion_done(wait));
+}
+
+/**
+ * blk_execute_rq - insert a request into queue for execution
+ * @bd_disk:   matching gendisk
+ * @rq:                request to insert
+ * @at_head:    insert request at head or tail of queue
+ *
+ * Description:
+ *    Insert a fully prepared request at the back of the I/O scheduler queue
+ *    for execution and wait for completion.
+ * Return: The blk_status_t result provided to blk_mq_end_request().
+ */
+blk_status_t blk_execute_rq(struct gendisk *bd_disk, struct request *rq,
+               int at_head)
+{
+       DECLARE_COMPLETION_ONSTACK(wait);
+       unsigned long hang_check;
+
+       rq->end_io_data = &wait;
+       blk_execute_rq_nowait(bd_disk, rq, at_head, blk_end_sync_rq);
+
+       /* Prevent hang_check timer from firing at us during very long I/O */
+       hang_check = sysctl_hung_task_timeout_secs;
+
+       if (blk_rq_is_poll(rq))
+               blk_rq_poll_completion(rq, &wait);
+       else if (hang_check)
+               while (!wait_for_completion_io_timeout(&wait,
+                               hang_check * (HZ/2)))
+                       ;
+       else
+               wait_for_completion_io(&wait);
+
+       return (blk_status_t)(uintptr_t)rq->end_io_data;
+}
+EXPORT_SYMBOL(blk_execute_rq);
+
 static void __blk_mq_requeue_request(struct request *rq)
 {
        struct request_queue *q = rq->q;