[PATCH 2/3] docs: mmc: fix stale async request documentation
From: Shawn Lin
Date: Thu Sep 17 2026 - 06:22:57 EST
From: Shawn Lin <shawn.lin@xxxxxxxxx>
mmc-async-req.rst still documents interfaces that no longer exist:
- mmc_start_req() was renamed to mmc_start_areq() by commit c3399ef55d8e
("mmc: core: rename mmc_start_req() to *areq()") and then removed together
with the rest of the asynchronous request machinery when the block driver
switched to blk-mq, by commits 81196976ed94 ("mmc: block: Add blk-mq support")
and 126b62700386 ("mmc: core: Remove code no longer needed after the switch to blk-mq").
- mmc_blk_issue_rw_rq() was removed by commit 0fbfd1251830
("mmc: block: Remove code no longer needed after the switch to blk-mq"),
and was replaced by mmc_blk_mq_issue_rw_rq().
- The is_first_req argument of the ->pre_req() callback was dropped by
commit d3c6aac3bdfe ("mmc: delete is_first_req parameter from pre-request callback"),
so the "Optimize for the first request" section is obsolete as well.
- The Linaro wiki page holding the IOZone/mmc_test measurements no longer exists.
Update the document to describe the current request lifecycle: mmc_pre_req(),
mmc_start_request(), mmc_wait_for_req() and mmc_post_req()), and drop the sections
describing the long-gone interfaces and the dead link.
Signed-off-by: Shawn Lin <shawn.lin@xxxxxxxxx>
---
Documentation/driver-api/mmc/mmc-async-req.rst | 64 ++++++--------------------
1 file changed, 13 insertions(+), 51 deletions(-)
diff --git a/Documentation/driver-api/mmc/mmc-async-req.rst b/Documentation/driver-api/mmc/mmc-async-req.rst
index 0f7197c..d9d4ac7 100644
--- a/Documentation/driver-api/mmc/mmc-async-req.rst
+++ b/Documentation/driver-api/mmc/mmc-async-req.rst
@@ -23,7 +23,7 @@ MMC request.
MMC block driver
================
-The mmc_blk_issue_rw_rq() in the MMC block driver is made non-blocking.
+The mmc_blk_mq_issue_rw_rq() in the MMC block driver is made non-blocking.
The increase in throughput is proportional to the time it takes to
prepare (major part of preparations are dma_map_sg() and dma_unmap_sg())
@@ -34,21 +34,20 @@ platform. In power save mode, when clocks run on a lower frequency, the DMA
preparation may cost even more. As long as these slower preparations are run
in parallel with the transfer performance won't be affected.
-Details on measurements from IOZone and mmc_test
-================================================
+MMC core API
+============
-https://wiki.linaro.org/WorkingGroups/Kernel/Specs/StoragePerfMMC-async-req
+The preparation of a request is separated from starting the transfer, so
+that a host can prepare a request while another one is still in progress:
-MMC core API extension
-======================
-
-There is one new public function mmc_start_req().
-
-It starts a new MMC command request for a host. The function isn't
-truly non-blocking. If there is an ongoing async request it waits
-for completion of that request and starts the new one and returns. It
-doesn't wait for the new request to complete. If there is no ongoing
-request it starts the new request and returns immediately.
+ * mmc_pre_req() prepares a request before it is started. It may be called
+ while another request is running on the host.
+ * mmc_start_request() starts a prepared request without waiting for it to
+ complete. mmc_wait_for_req() starts a request and waits for it to
+ complete as well.
+ * mmc_post_req() releases the resources allocated by mmc_pre_req() after
+ the request has completed. It may likewise run while another request is
+ active.
MMC host extensions
===================
@@ -59,40 +58,3 @@ to before and after the actual mmc_host_ops.request() function is called.
In the DMA case pre_req() may do dma_map_sg() and prepare the DMA
descriptor, and post_req() runs the dma_unmap_sg().
-
-Optimize for the first request
-==============================
-
-The first request in a series of requests can't be prepared in parallel
-with the previous transfer, since there is no previous request.
-
-The argument is_first_req in pre_req() indicates that there is no previous
-request. The host driver may optimize for this scenario to minimize
-the performance loss. A way to optimize for this is to split the current
-request in two chunks, prepare the first chunk and start the request,
-and finally prepare the second chunk and start the transfer.
-
-Pseudocode to handle is_first_req scenario with minimal prepare overhead::
-
- if (is_first_req && req->size > threshold)
- /* start MMC transfer for the complete transfer size */
- mmc_start_command(MMC_CMD_TRANSFER_FULL_SIZE);
-
- /*
- * Begin to prepare DMA while cmd is being processed by MMC.
- * The first chunk of the request should take the same time
- * to prepare as the "MMC process command time".
- * If prepare time exceeds MMC cmd time
- * the transfer is delayed, guesstimate max 4k as first chunk size.
- */
- prepare_1st_chunk_for_dma(req);
- /* flush pending desc to the DMAC (dmaengine.h) */
- dma_issue_pending(req->dma_desc);
-
- prepare_2nd_chunk_for_dma(req);
- /*
- * The second issue_pending should be called before MMC runs out
- * of the first chunk. If the MMC runs out of the first data chunk
- * before this call, the transfer is delayed.
- */
- dma_issue_pending(req->dma_desc);
--
2.7.4