mmc: card: do away with indirection pointer
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 20 Sep 2016 09:34:38 +0000 (11:34 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Mon, 26 Sep 2016 19:31:31 +0000 (21:31 +0200)
We have enough vtables in the kernel as it is, we don't need
this one to create even more artificial separation of concerns.

As is proved by the Makefile:

obj-$(CONFIG_MMC_BLOCK)         += mmc_block.o
mmc_block-objs                  := block.o queue.o

block.c and queue.c are baked into the same mmc_block.o object.
So why would one of these objects access a function in the
other object by dereferencing a pointer?

Create a new block.h header file for the single shared function
from block to queue and remove the function pointer and just
call the queue request function.

Apart from making the code more readable, this also makes link
optimizations possible and probably speeds up the call as well.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/card/block.c
drivers/mmc/card/block.h [new file with mode: 0644]
drivers/mmc/card/queue.c
drivers/mmc/card/queue.h

index 03670aa5ac8e5025b107a87e82cacccc97fded32..c3335112e68c29cfe4a16eae0aabf4368682d357 100644 (file)
@@ -2144,7 +2144,7 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
        return 0;
 }
 
-static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
+int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
 {
        int ret;
        struct mmc_blk_data *md = mq->data;
@@ -2265,7 +2265,6 @@ again:
        if (ret)
                goto err_putdisk;
 
-       md->queue.issue_fn = mmc_blk_issue_rq;
        md->queue.data = md;
 
        md->disk->major = MMC_BLOCK_MAJOR;
diff --git a/drivers/mmc/card/block.h b/drivers/mmc/card/block.h
new file mode 100644 (file)
index 0000000..cdabb2e
--- /dev/null
@@ -0,0 +1 @@
+int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req);
index 708057261b38982fffa9f42204b841260ff67432..8037f73a109a14a4b9593e4034705ebc29ec8752 100644 (file)
@@ -19,7 +19,9 @@
 
 #include <linux/mmc/card.h>
 #include <linux/mmc/host.h>
+
 #include "queue.h"
+#include "block.h"
 
 #define MMC_QUEUE_BOUNCESZ     65536
 
@@ -68,7 +70,7 @@ static int mmc_queue_thread(void *d)
                        bool req_is_special = mmc_req_is_special(req);
 
                        set_current_state(TASK_RUNNING);
-                       mq->issue_fn(mq, req);
+                       mmc_blk_issue_rq(mq, req);
                        cond_resched();
                        if (mq->flags & MMC_QUEUE_NEW_REQUEST) {
                                mq->flags &= ~MMC_QUEUE_NEW_REQUEST;
index fee5e127146519efdd2b6b3ed35fc5ea1858667a..3c15a75bae862d0466ad0ca43bef2b5e49ba13ed 100644 (file)
@@ -57,8 +57,6 @@ struct mmc_queue {
        unsigned int            flags;
 #define MMC_QUEUE_SUSPENDED    (1 << 0)
 #define MMC_QUEUE_NEW_REQUEST  (1 << 1)
-
-       int                     (*issue_fn)(struct mmc_queue *, struct request *);
        void                    *data;
        struct request_queue    *queue;
        struct mmc_queue_req    mqrq[2];