5sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget /translations/zh_CN/block/blk-mqmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/zh_TW/block/blk-mqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/it_IT/block/blk-mqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/ja_JP/block/blk-mqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/ko_KR/block/blk-mqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/pt_BR/block/blk-mqmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget /translations/sp_SP/block/blk-mqmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhh:/var/lib/git/docbuild/linux/Documentation/block/blk-mq.rsthKubhsection)}(hhh](htitle)}(h0Multi-Queue Block IO Queueing Mechanism (blk-mq)h]h0Multi-Queue Block IO Queueing Mechanism (blk-mq)}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hX*The Multi-Queue Block IO Queueing Mechanism is an API to enable fast storage devices to achieve a huge number of input/output operations per second (IOPS) through queueing and submitting IO requests to block devices simultaneously, benefiting from the parallelism offered by modern storage devices.h]hX*The Multi-Queue Block IO Queueing Mechanism is an API to enable fast storage devices to achieve a huge number of input/output operations per second (IOPS) through queueing and submitting IO requests to block devices simultaneously, benefiting from the parallelism offered by modern storage devices.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h Introductionh]h Introduction}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(h Backgroundh]h Background}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hXMagnetic hard disks have been the de facto standard from the beginning of the development of the kernel. The Block IO subsystem aimed to achieve the best performance possible for those devices with a high penalty when doing random access, and the bottleneck was the mechanical moving parts, a lot slower than any layer on the storage stack. One example of such optimization technique involves ordering read/write requests according to the current position of the hard disk head.h]hXMagnetic hard disks have been the de facto standard from the beginning of the development of the kernel. The Block IO subsystem aimed to achieve the best performance possible for those devices with a high penalty when doing random access, and the bottleneck was the mechanical moving parts, a lot slower than any layer on the storage stack. One example of such optimization technique involves ordering read/write requests according to the current position of the hard disk head.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXyHowever, with the development of Solid State Drives and Non-Volatile Memories without mechanical parts nor random access penalty and capable of performing high parallel access, the bottleneck of the stack had moved from the storage device to the operating system. In order to take advantage of the parallelism in those devices' design, the multi-queue mechanism was introduced.h]hX{However, with the development of Solid State Drives and Non-Volatile Memories without mechanical parts nor random access penalty and capable of performing high parallel access, the bottleneck of the stack had moved from the storage device to the operating system. In order to take advantage of the parallelism in those devices’ design, the multi-queue mechanism was introduced.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hXFThe former design had a single queue to store block IO requests with a single lock. That did not scale well in SMP systems due to dirty data in cache and the bottleneck of having a single lock for multiple processors. This setup also suffered with congestion when different processes (or the same process, moving to different CPUs) wanted to perform block IO. Instead of this, the blk-mq API spawns multiple queues with individual entry points local to the CPU, removing the need for a lock. A deeper explanation on how this works is covered in the following section (`Operation`_).h](hX8The former design had a single queue to store block IO requests with a single lock. That did not scale well in SMP systems due to dirty data in cache and the bottleneck of having a single lock for multiple processors. This setup also suffered with congestion when different processes (or the same process, moving to different CPUs) wanted to perform block IO. Instead of this, the blk-mq API spawns multiple queues with individual entry points local to the CPU, removing the need for a lock. A deeper explanation on how this works is covered in the following section (}(hj+hhhNhNubh reference)}(h `Operation`_h]h Operation}(hj5hhhNhNubah}(h]h ]h"]h$]h&]name Operationrefid operationuh1j3hj+resolvedKubh).}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h] backgroundah ]h"] backgroundah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Operationh]h Operation}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjZhhhhhK*ubh)}(hXWhen the userspace performs IO to a block device (reading or writing a file, for instance), blk-mq takes action: it will store and manage IO requests to the block device, acting as middleware between the userspace (and a file system, if present) and the block device driver.h]hXWhen the userspace performs IO to a block device (reading or writing a file, for instance), blk-mq takes action: it will store and manage IO requests to the block device, acting as middleware between the userspace (and a file system, if present) and the block device driver.}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjZhhubh)}(hXblk-mq has two group of queues: software staging queues and hardware dispatch queues. When the request arrives at the block layer, it will try the shortest path possible: send it directly to the hardware queue. However, there are two cases that it might not do that: if there's an IO scheduler attached at the layer or if we want to try to merge requests. In both cases, requests will be sent to the software queue.h]hXblk-mq has two group of queues: software staging queues and hardware dispatch queues. When the request arrives at the block layer, it will try the shortest path possible: send it directly to the hardware queue. However, there are two cases that it might not do that: if there’s an IO scheduler attached at the layer or if we want to try to merge requests. In both cases, requests will be sent to the software queue.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK1hjZhhubh)}(hXqThen, after the requests are processed by software queues, they will be placed at the hardware queue, a second stage queue where the hardware has direct access to process those requests. However, if the hardware does not have enough resources to accept more requests, blk-mq will place requests on a temporary queue, to be sent in the future, when the hardware is able.h]hXqThen, after the requests are processed by software queues, they will be placed at the hardware queue, a second stage queue where the hardware has direct access to process those requests. However, if the hardware does not have enough resources to accept more requests, blk-mq will place requests on a temporary queue, to be sent in the future, when the hardware is able.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK8hjZhhubh)}(hhh](h)}(hSoftware staging queuesh]hSoftware staging queues}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK?ubh)}(hXThe block IO subsystem adds requests in the software staging queues (represented by struct blk_mq_ctx) in case that they weren't sent directly to the driver. A request is one or more BIOs. They arrived at the block layer through the data structure struct bio. The block layer will then build a new structure from it, the struct request that will be used to communicate with the device driver. Each queue has its own lock and the number of queues is defined by a per-CPU or per-node basis.h]hXThe block IO subsystem adds requests in the software staging queues (represented by struct blk_mq_ctx) in case that they weren’t sent directly to the driver. A request is one or more BIOs. They arrived at the block layer through the data structure struct bio. The block layer will then build a new structure from it, the struct request that will be used to communicate with the device driver. Each queue has its own lock and the number of queues is defined by a per-CPU or per-node basis.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKAhjhhubh)}(hXThe staging queue can be used to merge requests for adjacent sectors. For instance, requests for sector 3-6, 6-7, 7-9 can become one request for 3-9. Even if random access to SSDs and NVMs have the same time of response compared to sequential access, grouped requests for sequential access decreases the number of individual requests. This technique of merging requests is called plugging.h]hXThe staging queue can be used to merge requests for adjacent sectors. For instance, requests for sector 3-6, 6-7, 7-9 can become one request for 3-9. Even if random access to SSDs and NVMs have the same time of response compared to sequential access, grouped requests for sequential access decreases the number of individual requests. This technique of merging requests is called plugging.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKIhjhhubh)}(hAlong with that, the requests can be reordered to ensure fairness of system resources (e.g. to ensure that no application suffers from starvation) and/or to improve IO performance, by an IO scheduler.h]hAlong with that, the requests can be reordered to ensure fairness of system resources (e.g. to ensure that no application suffers from starvation) and/or to improve IO performance, by an IO scheduler.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjhhubh)}(hhh](h)}(h IO Schedulersh]h IO Schedulers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKUubh)}(hX There are several schedulers implemented by the block layer, each one following a heuristic to improve the IO performance. They are "pluggable" (as in plug and play), in the sense of they can be selected at run time using sysfs. You can read more about Linux's IO schedulers `here `_. The scheduling happens only between requests in the same queue, so it is not possible to merge requests from different queues, otherwise there would be cache trashing and a need to have a lock for each queue. After the scheduling, the requests are eligible to be sent to the hardware. One of the possible schedulers to be selected is the NONE scheduler, the most straightforward one. It will just place requests on whatever software queue the process is running on, without any reordering. When the device starts processing requests in the hardware queue (a.k.a. run the hardware queue), the software queues mapped to that hardware queue will be drained in sequence according to their mapping.h](hXThere are several schedulers implemented by the block layer, each one following a heuristic to improve the IO performance. They are “pluggable” (as in plug and play), in the sense of they can be selected at run time using sysfs. You can read more about Linux’s IO schedulers }(hjhhhNhNubj4)}(hA`here `_h]hhere}(hjhhhNhNubah}(h]h ]h"]h$]h&]namehererefuri7https://www.kernel.org/doc/html/latest/block/index.htmluh1j3hjubhtarget)}(h: h]h}(h]hereah ]h"]hereah$]h&]refurijuh1j referencedKhjubhX. The scheduling happens only between requests in the same queue, so it is not possible to merge requests from different queues, otherwise there would be cache trashing and a need to have a lock for each queue. After the scheduling, the requests are eligible to be sent to the hardware. One of the possible schedulers to be selected is the NONE scheduler, the most straightforward one. It will just place requests on whatever software queue the process is running on, without any reordering. When the device starts processing requests in the hardware queue (a.k.a. run the hardware queue), the software queues mapped to that hardware queue will be drained in sequence according to their mapping.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKWhjhhubeh}(h] io-schedulersah ]h"] io schedulersah$]h&]uh1hhjhhhhhKUubeh}(h]software-staging-queuesah ]h"]software staging queuesah$]h&]uh1hhjZhhhhhK?ubh)}(hhh](h)}(hHardware dispatch queuesh]hHardware dispatch queues}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hhhhhKgubh)}(hXThe hardware queue (represented by struct blk_mq_hw_ctx) is a struct used by device drivers to map the device submission queues (or device DMA ring buffer), and are the last step of the block layer submission code before the low level device driver taking ownership of the request. To run this queue, the block layer removes requests from the associated software queues and tries to dispatch to the hardware.h]hXThe hardware queue (represented by struct blk_mq_hw_ctx) is a struct used by device drivers to map the device submission queues (or device DMA ring buffer), and are the last step of the block layer submission code before the low level device driver taking ownership of the request. To run this queue, the block layer removes requests from the associated software queues and tries to dispatch to the hardware.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKihj%hhubh)}(hXsIf it's not possible to send the requests directly to hardware, they will be added to a linked list (``hctx->dispatch``) of requests. Then, next time the block layer runs a queue, it will send the requests laying at the ``dispatch`` list first, to ensure a fairness dispatch with those requests that were ready to be sent first. The number of hardware queues depends on the number of hardware contexts supported by the hardware and its device driver, but it will not be more than the number of cores of the system. There is no reordering at this stage, and each software queue has a set of hardware queues to send requests for.h](hgIf it’s not possible to send the requests directly to hardware, they will be added to a linked list (}(hjDhhhNhNubhliteral)}(h``hctx->dispatch``h]hhctx->dispatch}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjDubhe) of requests. Then, next time the block layer runs a queue, it will send the requests laying at the }(hjDhhhNhNubjM)}(h ``dispatch``h]hdispatch}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjDubhX list first, to ensure a fairness dispatch with those requests that were ready to be sent first. The number of hardware queues depends on the number of hardware contexts supported by the hardware and its device driver, but it will not be more than the number of cores of the system. There is no reordering at this stage, and each software queue has a set of hardware queues to send requests for.}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKphj%hhubhnote)}(hNeither the block layer nor the device protocols guarantee the order of completion of requests. This must be handled by higher layers, like the filesystem.h]h)}(hNeither the block layer nor the device protocols guarantee the order of completion of requests. This must be handled by higher layers, like the filesystem.h]hNeither the block layer nor the device protocols guarantee the order of completion of requests. This must be handled by higher layers, like the filesystem.}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK|hjzubah}(h]h ]h"]h$]h&]uh1jxhj%hhhhhNubeh}(h]hardware-dispatch-queuesah ]h"]hardware dispatch queuesah$]h&]uh1hhjZhhhhhKgubh)}(hhh](h)}(hTag-based completionh]hTag-based completion}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hXIn order to indicate which request has been completed, every request is identified by an integer, ranging from 0 to the dispatch queue size. This tag is generated by the block layer and later reused by the device driver, removing the need to create a redundant identifier. When a request is completed in the driver, the tag is sent back to the block layer to notify it of the finalization. This removes the need to do a linear search to find out which IO has been completed.h]hXIn order to indicate which request has been completed, every request is identified by an integer, ranging from 0 to the dispatch queue size. This tag is generated by the block layer and later reused by the device driver, removing the need to create a redundant identifier. When a request is completed in the driver, the tag is sent back to the block layer to notify it of the finalization. This removes the need to do a linear search to find out which IO has been completed.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]tag-based-completionah ]h"]tag-based completionah$]h&]uh1hhjZhhhhhKubeh}(h]jFah ]h"] operationah$]h&]uh1hhhhhhhhK*j Kubh)}(hhh](h)}(hFurther readingh]hFurther reading}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh bullet_list)}(hhh](h list_item)}(hj`Linux Block IO: Introducing Multi-queue SSD Access on Multi-core Systems `_ h]h)}(hi`Linux Block IO: Introducing Multi-queue SSD Access on Multi-core Systems `_h](j4)}(hjh]hHLinux Block IO: Introducing Multi-queue SSD Access on Multi-core Systems}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameHLinux Block IO: Introducing Multi-queue SSD Access on Multi-core Systemsjhttp://kernel.dk/blk-mq.pdfuh1j3hjubj)}(h h]h}(h]Glinux-block-io-introducing-multi-queue-ssd-access-on-multi-core-systemsah ]h"]Hlinux block io: introducing multi-queue ssd access on multi-core systemsah$]h&]refurijuh1jj Khjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hA`NOOP scheduler `_ h]h)}(h@`NOOP scheduler `_h](j4)}(hjh]hNOOP scheduler}(hjhhhNhNubah}(h]h ]h"]h$]h&]nameNOOP schedulerj,https://en.wikipedia.org/wiki/Noop_scheduleruh1j3hjubj)}(h/ h]h}(h]noop-schedulerah ]h"]noop schedulerah$]h&]refurij(uh1jj Khjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubj)}(hY`Null block device driver `_ h]h)}(hX`Null block device driver `_h](j4)}(hjHh]hNull block device driver}(hjJhhhNhNubah}(h]h ]h"]h$]h&]nameNull block device driverj:https://www.kernel.org/doc/html/latest/block/null_blk.htmluh1j3hjFubj)}(h= h]h}(h]null-block-device-driverah ]h"]null block device driverah$]h&]refurijYuh1jj KhjFubeh}(h]h ]h"]h$]h&]uh1hhhhKhjBubah}(h]h ]h"]h$]h&]uh1jhjhhhhhNubeh}(h]h ]h"]h$]h&]bullet-uh1jhhhKhjhhubeh}(h]further-readingah ]h"]further readingah$]h&]uh1hhhhhhhhKubeh}(h] introductionah ]h"] introductionah$]h&]uh1hhhhhhhhK ubh)}(hhh](h)}(hSource code documentationh]hSource code documentation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singleblk_eh_timer_return (C enum)c.blk_eh_timer_returnhNtauh1jhjhhhNhNubhdesc)}(hhh](hdesc_signature)}(hblk_eh_timer_returnh]hdesc_signature_line)}(henum blk_eh_timer_returnh](hdesc_sig_keyword)}(henumh]henum}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhKubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhKubh desc_name)}(hblk_eh_timer_returnh]h desc_sig_name)}(hjh]hblk_eh_timer_return}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1jsphinx_line_type declaratorhjhhhjhKubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhKhjhhubh desc_content)}(hhh]h)}(h&How the timeout handler should proceedh]h&How the timeout handler should proceed}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM3hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](cenumeh"]h$]h&]domainj0objtypej1desctypej1noindex noindexentrynocontentsentryuh1jhhhjhNhNubh container)}(h**Constants** ``BLK_EH_DONE`` The block driver completed the command or will complete it at a later time. ``BLK_EH_RESET_TIMER`` Reset the request timer and continue waiting for the request to complete.h](h)}(h **Constants**h]hstrong)}(hjCh]h Constants}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjAubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM7hj=ubhdefinition_list)}(hhh](hdefinition_list_item)}(h\``BLK_EH_DONE`` The block driver completed the command or will complete it at a later time. h](hterm)}(h``BLK_EH_DONE``h]jM)}(hjjh]h BLK_EH_DONE}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM;hjbubh definition)}(hhh]h)}(hKThe block driver completed the command or will complete it at a later time.h]hKThe block driver completed the command or will complete it at a later time.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM:hjubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1j`hjhM;hj]ubja)}(h```BLK_EH_RESET_TIMER`` Reset the request timer and continue waiting for the request to complete.h](jg)}(h``BLK_EH_RESET_TIMER``h]jM)}(hjh]hBLK_EH_RESET_TIMER}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM>hjubj)}(hhh]h)}(hIReset the request timer and continue waiting for the request to complete.h]hIReset the request timer and continue waiting for the request to complete.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM>hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhM>hj]ubeh}(h]h ]h"]h$]h&]uh1j[hj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_mq_hw_ctx (C struct)c.blk_mq_hw_ctxhNtauh1jhjhhhNhNubj)}(hhh](j)}(h blk_mq_hw_ctxh]j)}(hstruct blk_mq_hw_ctxh](j)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMDubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMDubj)}(h blk_mq_hw_ctxh]j)}(hjh]h blk_mq_hw_ctx}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhj hMDubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhj hMDubah}(h]jah ](j j eh"]h$]h&]jj)jhuh1jhj hMDhjhhubj)}(hhh]h)}(h;State for a hardware queue facing the hardware block deviceh]h;State for a hardware queue facing the hardware block device}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM?hj?hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hMDubeh}(h]h ](j0structeh"]h$]h&]j5j0j6jZj7jZj8j9j:uh1jhhhjhNhNubj<)}(hX**Definition**:: struct blk_mq_hw_ctx { struct { spinlock_t lock; struct list_head dispatch; unsigned long state; }; struct delayed_work run_work; cpumask_var_t cpumask; int next_cpu; int next_cpu_batch; unsigned long flags; void *sched_data; struct request_queue *queue; struct blk_flush_queue *fq; void *driver_data; struct sbitmap ctx_map; struct blk_mq_ctx *dispatch_from; unsigned int dispatch_busy; unsigned short type; unsigned short nr_ctx; struct blk_mq_ctx **ctxs; spinlock_t dispatch_wait_lock; wait_queue_entry_t dispatch_wait; atomic_t wait_index; struct blk_mq_tags *tags; struct blk_mq_tags *sched_tags; unsigned int numa_node; unsigned int queue_num; atomic_t nr_active; struct hlist_node cpuhp_online; struct hlist_node cpuhp_dead; struct kobject kobj; #ifdef CONFIG_BLK_DEBUG_FS; struct dentry *debugfs_dir; struct dentry *sched_debugfs_dir; #endif; struct list_head hctx_list; }; **Members** ``{unnamed_struct}`` anonymous ``lock`` Protects the dispatch list. ``dispatch`` Used for requests that are ready to be dispatched to the hardware but for some reason (e.g. lack of resources) could not be sent to the hardware. As soon as the driver can send new requests, requests at this list will be sent first for a fairer dispatch. ``state`` BLK_MQ_S_* flags. Defines the state of the hw queue (active, scheduled to restart, stopped). ``run_work`` Used for scheduling a hardware queue run at a later time. ``cpumask`` Map of available CPUs where this hctx can run. ``next_cpu`` Used by blk_mq_hctx_next_cpu() for round-robin CPU selection from **cpumask**. ``next_cpu_batch`` Counter of how many works left in the batch before changing to the next CPU. ``flags`` BLK_MQ_F_* flags. Defines the behaviour of the queue. ``sched_data`` Pointer owned by the IO scheduler attached to a request queue. It's up to the IO scheduler how to use this pointer. ``queue`` Pointer to the request queue that owns this hardware context. ``fq`` Queue of requests that need to perform a flush operation. ``driver_data`` Pointer to data owned by the block driver that created this hctx ``ctx_map`` Bitmap for each software queue. If bit is on, there is a pending request in that software queue. ``dispatch_from`` Software queue to be used when no scheduler was selected. ``dispatch_busy`` Number used by blk_mq_update_dispatch_busy() to decide if the hw_queue is busy using Exponential Weighted Moving Average algorithm. ``type`` HCTX_TYPE_* flags. Type of hardware queue. ``nr_ctx`` Number of software queues. ``ctxs`` Array of software queues. ``dispatch_wait_lock`` Lock for dispatch_wait queue. ``dispatch_wait`` Waitqueue to put requests when there is no tag available at the moment, to wait for another try in the future. ``wait_index`` Index of next available dispatch_wait queue to insert requests. ``tags`` Tags owned by the block driver. A tag at this set is only assigned when a request is dispatched from a hardware queue. ``sched_tags`` Tags owned by I/O scheduler. If there is an I/O scheduler associated with a request queue, a tag is assigned when that request is allocated. Else, this member is not used. ``numa_node`` NUMA node the storage adapter has been connected to. ``queue_num`` Index of this hardware queue. ``nr_active`` Number of active requests. Only used when a tag set is shared across request queues. ``cpuhp_online`` List to store request if CPU is going to die ``cpuhp_dead`` List to store request if some CPU die. ``kobj`` Kernel object for sysfs. ``debugfs_dir`` debugfs directory for this hardware queue. Named as cpu. ``sched_debugfs_dir`` debugfs directory for the scheduler. ``hctx_list`` if this hctx is not in use, this is an entry in q->unused_hctx_list.h](h)}(h**Definition**::h](jF)}(h**Definition**h]h Definition}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjbubh:}(hjbhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMChj^ubh literal_block)}(hXstruct blk_mq_hw_ctx { struct { spinlock_t lock; struct list_head dispatch; unsigned long state; }; struct delayed_work run_work; cpumask_var_t cpumask; int next_cpu; int next_cpu_batch; unsigned long flags; void *sched_data; struct request_queue *queue; struct blk_flush_queue *fq; void *driver_data; struct sbitmap ctx_map; struct blk_mq_ctx *dispatch_from; unsigned int dispatch_busy; unsigned short type; unsigned short nr_ctx; struct blk_mq_ctx **ctxs; spinlock_t dispatch_wait_lock; wait_queue_entry_t dispatch_wait; atomic_t wait_index; struct blk_mq_tags *tags; struct blk_mq_tags *sched_tags; unsigned int numa_node; unsigned int queue_num; atomic_t nr_active; struct hlist_node cpuhp_online; struct hlist_node cpuhp_dead; struct kobject kobj; #ifdef CONFIG_BLK_DEBUG_FS; struct dentry *debugfs_dir; struct dentry *sched_debugfs_dir; #endif; struct list_head hctx_list; };h]hXstruct blk_mq_hw_ctx { struct { spinlock_t lock; struct list_head dispatch; unsigned long state; }; struct delayed_work run_work; cpumask_var_t cpumask; int next_cpu; int next_cpu_batch; unsigned long flags; void *sched_data; struct request_queue *queue; struct blk_flush_queue *fq; void *driver_data; struct sbitmap ctx_map; struct blk_mq_ctx *dispatch_from; unsigned int dispatch_busy; unsigned short type; unsigned short nr_ctx; struct blk_mq_ctx **ctxs; spinlock_t dispatch_wait_lock; wait_queue_entry_t dispatch_wait; atomic_t wait_index; struct blk_mq_tags *tags; struct blk_mq_tags *sched_tags; unsigned int numa_node; unsigned int queue_num; atomic_t nr_active; struct hlist_node cpuhp_online; struct hlist_node cpuhp_dead; struct kobject kobj; #ifdef CONFIG_BLK_DEBUG_FS; struct dentry *debugfs_dir; struct dentry *sched_debugfs_dir; #endif; struct list_head hctx_list; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMEhj^ubh)}(h **Members**h]jF)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMlhj^ubj\)}(hhh](ja)}(h``{unnamed_struct}`` anonymous h](jg)}(h``{unnamed_struct}``h]jM)}(hjh]h{unnamed_struct}}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhKhjubj)}(hhh]h)}(h anonymoush]h anonymous}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhKhjubja)}(h%``lock`` Protects the dispatch list. h](jg)}(h``lock``h]jM)}(hjh]hlock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMEhjubj)}(hhh]h)}(hProtects the dispatch list.h]hProtects the dispatch list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMEhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMEhjubja)}(hX ``dispatch`` Used for requests that are ready to be dispatched to the hardware but for some reason (e.g. lack of resources) could not be sent to the hardware. As soon as the driver can send new requests, requests at this list will be sent first for a fairer dispatch. h](jg)}(h ``dispatch``h]jM)}(hj#h]hdispatch}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj!ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMLhjubj)}(hhh]h)}(hUsed for requests that are ready to be dispatched to the hardware but for some reason (e.g. lack of resources) could not be sent to the hardware. As soon as the driver can send new requests, requests at this list will be sent first for a fairer dispatch.h]hUsed for requests that are ready to be dispatched to the hardware but for some reason (e.g. lack of resources) could not be sent to the hardware. As soon as the driver can send new requests, requests at this list will be sent first for a fairer dispatch.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMHhj9ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hj8hMLhjubja)}(hg``state`` BLK_MQ_S_* flags. Defines the state of the hw queue (active, scheduled to restart, stopped). h](jg)}(h ``state``h]jM)}(hj]h]hstate}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj[ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMQhjWubj)}(hhh]h)}(h\BLK_MQ_S_* flags. Defines the state of the hw queue (active, scheduled to restart, stopped).h]h\BLK_MQ_S_* flags. Defines the state of the hw queue (active, scheduled to restart, stopped).}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMPhjsubah}(h]h ]h"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]uh1j`hjrhMQhjubja)}(hG``run_work`` Used for scheduling a hardware queue run at a later time. h](jg)}(h ``run_work``h]jM)}(hjh]hrun_work}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMWhjubj)}(hhh]h)}(h9Used for scheduling a hardware queue run at a later time.h]h9Used for scheduling a hardware queue run at a later time.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMWhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMWhjubja)}(h;``cpumask`` Map of available CPUs where this hctx can run. h](jg)}(h ``cpumask``h]jM)}(hjh]hcpumask}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMZhjubj)}(hhh]h)}(h.Map of available CPUs where this hctx can run.h]h.Map of available CPUs where this hctx can run.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMZhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMZhjubja)}(h\``next_cpu`` Used by blk_mq_hctx_next_cpu() for round-robin CPU selection from **cpumask**. h](jg)}(h ``next_cpu``h]jM)}(hj h]hnext_cpu}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM^hjubj)}(hhh]h)}(hNUsed by blk_mq_hctx_next_cpu() for round-robin CPU selection from **cpumask**.h](hBUsed by blk_mq_hctx_next_cpu() for round-robin CPU selection from }(hj"hhhNhNubjF)}(h **cpumask**h]hcpumask}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj"ubh.}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM]hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhM^hjubja)}(h```next_cpu_batch`` Counter of how many works left in the batch before changing to the next CPU. h](jg)}(h``next_cpu_batch``h]jM)}(hjUh]hnext_cpu_batch}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjSubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMchjOubj)}(hhh]h)}(hLCounter of how many works left in the batch before changing to the next CPU.h]hLCounter of how many works left in the batch before changing to the next CPU.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMbhjkubah}(h]h ]h"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]uh1j`hjjhMchjubja)}(h@``flags`` BLK_MQ_F_* flags. Defines the behaviour of the queue. h](jg)}(h ``flags``h]jM)}(hjh]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMghjubj)}(hhh]h)}(h5BLK_MQ_F_* flags. Defines the behaviour of the queue.h]h5BLK_MQ_F_* flags. Defines the behaviour of the queue.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMghjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMghjubja)}(h``sched_data`` Pointer owned by the IO scheduler attached to a request queue. It's up to the IO scheduler how to use this pointer. h](jg)}(h``sched_data``h]jM)}(hjh]h sched_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMlhjubj)}(hhh]h)}(hsPointer owned by the IO scheduler attached to a request queue. It's up to the IO scheduler how to use this pointer.h]huPointer owned by the IO scheduler attached to a request queue. It’s up to the IO scheduler how to use this pointer.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMkhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMlhjubja)}(hH``queue`` Pointer to the request queue that owns this hardware context. h](jg)}(h ``queue``h]jM)}(hjh]hqueue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMphjubj)}(hhh]h)}(h=Pointer to the request queue that owns this hardware context.h]h=Pointer to the request queue that owns this hardware context.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMphjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMphjubja)}(hA``fq`` Queue of requests that need to perform a flush operation. h](jg)}(h``fq``h]jM)}(hj;h]hfq}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj9ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMshj5ubj)}(hhh]h)}(h9Queue of requests that need to perform a flush operation.h]h9Queue of requests that need to perform a flush operation.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhMshjQubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1j`hjPhMshjubja)}(hQ``driver_data`` Pointer to data owned by the block driver that created this hctx h](jg)}(h``driver_data``h]jM)}(hjth]h driver_data}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjrubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMxhjnubj)}(hhh]h)}(h@Pointer to data owned by the block driver that created this hctxh]h@Pointer to data owned by the block driver that created this hctx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMwhjubah}(h]h ]h"]h$]h&]uh1jhjnubeh}(h]h ]h"]h$]h&]uh1j`hjhMxhjubja)}(hm``ctx_map`` Bitmap for each software queue. If bit is on, there is a pending request in that software queue. h](jg)}(h ``ctx_map``h]jM)}(hjh]hctx_map}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM~hjubj)}(hhh]h)}(h`Bitmap for each software queue. If bit is on, there is a pending request in that software queue.h]h`Bitmap for each software queue. If bit is on, there is a pending request in that software queue.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM}hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhM~hjubja)}(hL``dispatch_from`` Software queue to be used when no scheduler was selected. h](jg)}(h``dispatch_from``h]jM)}(hjh]h dispatch_from}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(h9Software queue to be used when no scheduler was selected.h]h9Software queue to be used when no scheduler was selected.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhjubja)}(h``dispatch_busy`` Number used by blk_mq_update_dispatch_busy() to decide if the hw_queue is busy using Exponential Weighted Moving Average algorithm. h](jg)}(h``dispatch_busy``h]jM)}(hj" h]h dispatch_busy}(hj$ hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(hNumber used by blk_mq_update_dispatch_busy() to decide if the hw_queue is busy using Exponential Weighted Moving Average algorithm.h]hNumber used by blk_mq_update_dispatch_busy() to decide if the hw_queue is busy using Exponential Weighted Moving Average algorithm.}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj8 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj7 hMhjubja)}(h4``type`` HCTX_TYPE_* flags. Type of hardware queue. h](jg)}(h``type``h]jM)}(hj\ h]htype}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjZ ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjV ubj)}(hhh]h)}(h*HCTX_TYPE_* flags. Type of hardware queue.h]h*HCTX_TYPE_* flags. Type of hardware queue.}(hju hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjq hMhjr ubah}(h]h ]h"]h$]h&]uh1jhjV ubeh}(h]h ]h"]h$]h&]uh1j`hjq hMhjubja)}(h&``nr_ctx`` Number of software queues. h](jg)}(h ``nr_ctx``h]jM)}(hj h]hnr_ctx}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(hNumber of software queues.h]hNumber of software queues.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj hMhjubja)}(h#``ctxs`` Array of software queues. h](jg)}(h``ctxs``h]jM)}(hj h]hctxs}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(hArray of software queues.h]hArray of software queues.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj hMhjubja)}(h5``dispatch_wait_lock`` Lock for dispatch_wait queue. h](jg)}(h``dispatch_wait_lock``h]jM)}(hj h]hdispatch_wait_lock}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(hLock for dispatch_wait queue.h]hLock for dispatch_wait queue.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj hMhjubja)}(h``dispatch_wait`` Waitqueue to put requests when there is no tag available at the moment, to wait for another try in the future. h](jg)}(h``dispatch_wait``h]jM)}(hj@ h]h dispatch_wait}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj> ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj: ubj)}(hhh]h)}(hnWaitqueue to put requests when there is no tag available at the moment, to wait for another try in the future.h]hnWaitqueue to put requests when there is no tag available at the moment, to wait for another try in the future.}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjV ubah}(h]h ]h"]h$]h&]uh1jhj: ubeh}(h]h ]h"]h$]h&]uh1j`hjU hMhjubja)}(hO``wait_index`` Index of next available dispatch_wait queue to insert requests. h](jg)}(h``wait_index``h]jM)}(hjz h]h wait_index}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjx ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjt ubj)}(hhh]h)}(h?Index of next available dispatch_wait queue to insert requests.h]h?Index of next available dispatch_wait queue to insert requests.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubah}(h]h ]h"]h$]h&]uh1jhjt ubeh}(h]h ]h"]h$]h&]uh1j`hj hMhjubja)}(h``tags`` Tags owned by the block driver. A tag at this set is only assigned when a request is dispatched from a hardware queue. h](jg)}(h``tags``h]jM)}(hj h]htags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(hvTags owned by the block driver. A tag at this set is only assigned when a request is dispatched from a hardware queue.h]hvTags owned by the block driver. A tag at this set is only assigned when a request is dispatched from a hardware queue.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj hMhjubja)}(h``sched_tags`` Tags owned by I/O scheduler. If there is an I/O scheduler associated with a request queue, a tag is assigned when that request is allocated. Else, this member is not used. h](jg)}(h``sched_tags``h]jM)}(hj h]h sched_tags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(hTags owned by I/O scheduler. If there is an I/O scheduler associated with a request queue, a tag is assigned when that request is allocated. Else, this member is not used.h]hTags owned by I/O scheduler. If there is an I/O scheduler associated with a request queue, a tag is assigned when that request is allocated. Else, this member is not used.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj hMhjubja)}(hC``numa_node`` NUMA node the storage adapter has been connected to. h](jg)}(h ``numa_node``h]jM)}(hj( h]h numa_node}(hj* hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj& ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj" ubj)}(hhh]h)}(h4NUMA node the storage adapter has been connected to.h]h4NUMA node the storage adapter has been connected to.}(hjA hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj= hMhj> ubah}(h]h ]h"]h$]h&]uh1jhj" ubeh}(h]h ]h"]h$]h&]uh1j`hj= hMhjubja)}(h,``queue_num`` Index of this hardware queue. h](jg)}(h ``queue_num``h]jM)}(hja h]h queue_num}(hjc hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj_ ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj[ ubj)}(hhh]h)}(hIndex of this hardware queue.h]hIndex of this hardware queue.}(hjz hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjv hMhjw ubah}(h]h ]h"]h$]h&]uh1jhj[ ubeh}(h]h ]h"]h$]h&]uh1j`hjv hMhjubja)}(hc``nr_active`` Number of active requests. Only used when a tag set is shared across request queues. h](jg)}(h ``nr_active``h]jM)}(hj h]h nr_active}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(hTNumber of active requests. Only used when a tag set is shared across request queues.h]hTNumber of active requests. Only used when a tag set is shared across request queues.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj hMhjubja)}(h>``cpuhp_online`` List to store request if CPU is going to die h](jg)}(h``cpuhp_online``h]jM)}(hj h]h cpuhp_online}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(h,List to store request if CPU is going to dieh]h,List to store request if CPU is going to die}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj hMhjubja)}(h6``cpuhp_dead`` List to store request if some CPU die. h](jg)}(h``cpuhp_dead``h]jM)}(hj h]h cpuhp_dead}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(h&List to store request if some CPU die.h]h&List to store request if some CPU die.}(hj& hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj" hMhj# ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj" hMhjubja)}(h"``kobj`` Kernel object for sysfs. h](jg)}(h``kobj``h]jM)}(hjF h]hkobj}(hjH hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjD ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj@ ubj)}(hhh]h)}(hKernel object for sysfs.h]hKernel object for sysfs.}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[ hMhj\ ubah}(h]h ]h"]h$]h&]uh1jhj@ ubeh}(h]h ]h"]h$]h&]uh1j`hj[ hMhjubja)}(hU``debugfs_dir`` debugfs directory for this hardware queue. Named as cpu. h](jg)}(h``debugfs_dir``h]jM)}(hj h]h debugfs_dir}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj} ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjy ubj)}(hhh]h)}(hDdebugfs directory for this hardware queue. Named as cpu.h]hDdebugfs directory for this hardware queue. Named as cpu.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubah}(h]h ]h"]h$]h&]uh1jhjy ubeh}(h]h ]h"]h$]h&]uh1j`hj hMhjubja)}(h;``sched_debugfs_dir`` debugfs directory for the scheduler. h](jg)}(h``sched_debugfs_dir``h]jM)}(hj h]hsched_debugfs_dir}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(h$debugfs directory for the scheduler.h]h$debugfs directory for the scheduler.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj hMhjubja)}(hR``hctx_list`` if this hctx is not in use, this is an entry in q->unused_hctx_list.h](jg)}(h ``hctx_list``h]jM)}(hj h]h hctx_list}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(hDif this hctx is not in use, this is an entry in q->unused_hctx_list.h]hDif this hctx is not in use, this is an entry in q->unused_hctx_list.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj hMhjubeh}(h]h ]h"]h$]h&]uh1j[hj^ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_mq_queue_map (C struct)c.blk_mq_queue_maphNtauh1jhjhhhNhNubj)}(hhh](j)}(hblk_mq_queue_maph]j)}(hstruct blk_mq_queue_maph](j)}(hjh]hstruct}(hjK hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG hhhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMubj)}(h h]h }(hjY hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG hhhjX hMubj)}(hblk_mq_queue_maph]j)}(hjE h]hblk_mq_queue_map}(hjk hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjg ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjG hhhjX hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjC hhhjX hMubah}(h]j> ah ](j j eh"]h$]h&]jj)jhuh1jhjX hMhj@ hhubj)}(hhh]h)}(h&Map software queues to hardware queuesh]h&Map software queues to hardware queues}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj hhubah}(h]h ]h"]h$]h&]uh1jhj@ hhhjX hMubeh}(h]h ](j0structeh"]h$]h&]j5j0j6j j7j j8j9j:uh1jhhhjhNhNubj<)}(hXG**Definition**:: struct blk_mq_queue_map { unsigned int *mq_map; unsigned int nr_queues; unsigned int queue_offset; }; **Members** ``mq_map`` CPU ID to hardware queue index map. This is an array with nr_cpu_ids elements. Each element has a value in the range [**queue_offset**, **queue_offset** + **nr_queues**). ``nr_queues`` Number of hardware queues to map CPU IDs onto. ``queue_offset`` First hardware queue to map onto. Used by the PCIe NVMe driver to map each hardware queue type (enum hctx_type) onto a distinct set of hardware queues.h](h)}(h**Definition**::h](jF)}(h**Definition**h]h Definition}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hqstruct blk_mq_queue_map { unsigned int *mq_map; unsigned int nr_queues; unsigned int queue_offset; };h]hqstruct blk_mq_queue_map { unsigned int *mq_map; unsigned int nr_queues; unsigned int queue_offset; };}hj sbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubh)}(h **Members**h]jF)}(hj h]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj\)}(hhh](ja)}(h``mq_map`` CPU ID to hardware queue index map. This is an array with nr_cpu_ids elements. Each element has a value in the range [**queue_offset**, **queue_offset** + **nr_queues**). h](jg)}(h ``mq_map``h]jM)}(hj h]hmq_map}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(hCPU ID to hardware queue index map. This is an array with nr_cpu_ids elements. Each element has a value in the range [**queue_offset**, **queue_offset** + **nr_queues**).h](hvCPU ID to hardware queue index map. This is an array with nr_cpu_ids elements. Each element has a value in the range [}(hjhhhNhNubjF)}(h**queue_offset**h]h queue_offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh, }(hjhhhNhNubjF)}(h**queue_offset**h]h queue_offset}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh + }(hjhhhNhNubjF)}(h **nr_queues**h]h nr_queues}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj ubja)}(h=``nr_queues`` Number of hardware queues to map CPU IDs onto. h](jg)}(h ``nr_queues``h]jM)}(hjjh]h nr_queues}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjhubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjdubj)}(hhh]h)}(h.Number of hardware queues to map CPU IDs onto.h]h.Number of hardware queues to map CPU IDs onto.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjdubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj ubja)}(h``queue_offset`` First hardware queue to map onto. Used by the PCIe NVMe driver to map each hardware queue type (enum hctx_type) onto a distinct set of hardware queues.h](jg)}(h``queue_offset``h]jM)}(hjh]h queue_offset}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hFirst hardware queue to map onto. Used by the PCIe NVMe driver to map each hardware queue type (enum hctx_type) onto a distinct set of hardware queues.h]hFirst hardware queue to map onto. Used by the PCIe NVMe driver to map each hardware queue type (enum hctx_type) onto a distinct set of hardware queues.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj ubeh}(h]h ]h"]h$]h&]uh1j[hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jhctx_type (C enum) c.hctx_typehNtauh1jhjhhhNhNubj)}(hhh](j)}(h hctx_typeh]j)}(henum hctx_typeh](j)}(hjh]henum}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hMubj)}(h hctx_typeh]j)}(hjh]h hctx_type}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhj hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhj hMubah}(h]jah ](j j eh"]h$]h&]jj)jhuh1jhj hMhjhhubj)}(hhh]h)}(hType of hardware queueh]hType of hardware queue}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj<hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hMubeh}(h]h ](j0enumeh"]h$]h&]j5j0j6jWj7jWj8j9j:uh1jhhhjhNhNubj<)}(h**Constants** ``HCTX_TYPE_DEFAULT`` All I/O not otherwise accounted for. ``HCTX_TYPE_READ`` Just for READ I/O. ``HCTX_TYPE_POLL`` Polled I/O of any kind. ``HCTX_MAX_TYPES`` Number of types of hctx.h](h)}(h **Constants**h]jF)}(hjah]h Constants}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj_ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj[ubj\)}(hhh](ja)}(h;``HCTX_TYPE_DEFAULT`` All I/O not otherwise accounted for. h](jg)}(h``HCTX_TYPE_DEFAULT``h]jM)}(hjh]hHCTX_TYPE_DEFAULT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj~ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjzubj)}(hhh]h)}(h$All I/O not otherwise accounted for.h]h$All I/O not otherwise accounted for.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjzubeh}(h]h ]h"]h$]h&]uh1j`hjhMhjwubja)}(h&``HCTX_TYPE_READ`` Just for READ I/O. h](jg)}(h``HCTX_TYPE_READ``h]jM)}(hjh]hHCTX_TYPE_READ}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hJust for READ I/O.h]hJust for READ I/O.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhjwubja)}(h+``HCTX_TYPE_POLL`` Polled I/O of any kind. h](jg)}(h``HCTX_TYPE_POLL``h]jM)}(hjh]hHCTX_TYPE_POLL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hPolled I/O of any kind.h]hPolled I/O of any kind.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhjwubja)}(h+``HCTX_MAX_TYPES`` Number of types of hctx.h](jg)}(h``HCTX_MAX_TYPES``h]jM)}(hj+h]hHCTX_MAX_TYPES}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj)ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj%ubj)}(hhh]h)}(hNumber of types of hctx.h]hNumber of types of hctx.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjAubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1j`hj@hMhjwubeh}(h]h ]h"]h$]h&]uh1j[hj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_mq_tag_set (C struct)c.blk_mq_tag_sethNtauh1jhjhhhNhNubj)}(hhh](j)}(hblk_mq_tag_seth]j)}(hstruct blk_mq_tag_seth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hblk_mq_tag_seth]j)}(hjh]hblk_mq_tag_set}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj}hhhjhMubah}(h]jxah ](j j eh"]h$]h&]jj)jhuh1jhjhMhjzhhubj)}(hhh]h)}(h1tag set that can be shared between request queuesh]h1tag set that can be shared between request queues}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhjzhhhjhMubeh}(h]h ](j0structeh"]h$]h&]j5j0j6jj7jj8j9j:uh1jhhhjhNhNubj<)}(hX **Definition**:: struct blk_mq_tag_set { const struct blk_mq_ops *ops; struct blk_mq_queue_map map[HCTX_MAX_TYPES]; unsigned int nr_maps; unsigned int nr_hw_queues; unsigned int queue_depth; unsigned int reserved_tags; unsigned int cmd_size; int numa_node; unsigned int timeout; unsigned int flags; void *driver_data; struct blk_mq_tags **tags; struct blk_mq_tags *shared_tags; struct mutex tag_list_lock; struct list_head tag_list; struct srcu_struct *srcu; struct srcu_struct tags_srcu; struct rw_semaphore update_nr_hwq_lock; }; **Members** ``ops`` Pointers to functions that implement block driver behavior. ``map`` One or more ctx -> hctx mappings. One map exists for each hardware queue type (enum hctx_type) that the driver wishes to support. There are no restrictions on maps being of the same size, and it's perfectly legal to share maps between types. ``nr_maps`` Number of elements in the **map** array. A number in the range [1, HCTX_MAX_TYPES]. ``nr_hw_queues`` Number of hardware queues supported by the block driver that owns this data structure. ``queue_depth`` Number of tags per hardware queue, reserved tags included. ``reserved_tags`` Number of tags to set aside for BLK_MQ_REQ_RESERVED tag allocations. ``cmd_size`` Number of additional bytes to allocate per request. The block driver owns these additional bytes. ``numa_node`` NUMA node the storage adapter has been connected to. ``timeout`` Request processing timeout in jiffies. ``flags`` Zero or more BLK_MQ_F_* flags. ``driver_data`` Pointer to data owned by the block driver that created this tag set. ``tags`` Tag sets. One tag set per hardware queue. Has **nr_hw_queues** elements. ``shared_tags`` Shared set of tags. Has **nr_hw_queues** elements. If set, shared by all **tags**. ``tag_list_lock`` Serializes tag_list accesses. ``tag_list`` List of the request queues that use this tag set. See also request_queue.tag_set_list. ``srcu`` Use as lock when type of the request queue is blocking (BLK_MQ_F_BLOCKING). ``tags_srcu`` SRCU used to defer freeing of tags page_list to prevent use-after-free when iterating tags. ``update_nr_hwq_lock`` Synchronize updating nr_hw_queues with add/del disk & switching elevator.h](h)}(h**Definition**::h](jF)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hXstruct blk_mq_tag_set { const struct blk_mq_ops *ops; struct blk_mq_queue_map map[HCTX_MAX_TYPES]; unsigned int nr_maps; unsigned int nr_hw_queues; unsigned int queue_depth; unsigned int reserved_tags; unsigned int cmd_size; int numa_node; unsigned int timeout; unsigned int flags; void *driver_data; struct blk_mq_tags **tags; struct blk_mq_tags *shared_tags; struct mutex tag_list_lock; struct list_head tag_list; struct srcu_struct *srcu; struct srcu_struct tags_srcu; struct rw_semaphore update_nr_hwq_lock; };h]hXstruct blk_mq_tag_set { const struct blk_mq_ops *ops; struct blk_mq_queue_map map[HCTX_MAX_TYPES]; unsigned int nr_maps; unsigned int nr_hw_queues; unsigned int queue_depth; unsigned int reserved_tags; unsigned int cmd_size; int numa_node; unsigned int timeout; unsigned int flags; void *driver_data; struct blk_mq_tags **tags; struct blk_mq_tags *shared_tags; struct mutex tag_list_lock; struct list_head tag_list; struct srcu_struct *srcu; struct srcu_struct tags_srcu; struct rw_semaphore update_nr_hwq_lock; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubh)}(h **Members**h]jF)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM hjubj\)}(hhh](ja)}(hD``ops`` Pointers to functions that implement block driver behavior. h](jg)}(h``ops``h]jM)}(hj4h]hops}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj2ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj.ubj)}(hhh]h)}(h;Pointers to functions that implement block driver behavior.h]h;Pointers to functions that implement block driver behavior.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhMhjJubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1j`hjIhMhj+ubja)}(h``map`` One or more ctx -> hctx mappings. One map exists for each hardware queue type (enum hctx_type) that the driver wishes to support. There are no restrictions on maps being of the same size, and it's perfectly legal to share maps between types. h](jg)}(h``map``h]jM)}(hjmh]hmap}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjkubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjgubj)}(hhh]h)}(hOne or more ctx -> hctx mappings. One map exists for each hardware queue type (enum hctx_type) that the driver wishes to support. There are no restrictions on maps being of the same size, and it's perfectly legal to share maps between types.h]hOne or more ctx -> hctx mappings. One map exists for each hardware queue type (enum hctx_type) that the driver wishes to support. There are no restrictions on maps being of the same size, and it’s perfectly legal to share maps between types.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjgubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj+ubja)}(h```nr_maps`` Number of elements in the **map** array. A number in the range [1, HCTX_MAX_TYPES]. h](jg)}(h ``nr_maps``h]jM)}(hjh]hnr_maps}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hSNumber of elements in the **map** array. A number in the range [1, HCTX_MAX_TYPES].h](hNumber of elements in the }(hjhhhNhNubjF)}(h**map**h]hmap}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh2 array. A number in the range [1, HCTX_MAX_TYPES].}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj+ubja)}(hh``nr_hw_queues`` Number of hardware queues supported by the block driver that owns this data structure. h](jg)}(h``nr_hw_queues``h]jM)}(hjh]h nr_hw_queues}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hVNumber of hardware queues supported by the block driver that owns this data structure.h]hVNumber of hardware queues supported by the block driver that owns this data structure.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj+ubja)}(hK``queue_depth`` Number of tags per hardware queue, reserved tags included. h](jg)}(h``queue_depth``h]jM)}(hj-h]h queue_depth}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj+ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj'ubj)}(hhh]h)}(h:Number of tags per hardware queue, reserved tags included.h]h:Number of tags per hardware queue, reserved tags included.}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhMhjCubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1j`hjBhMhj+ubja)}(hW``reserved_tags`` Number of tags to set aside for BLK_MQ_REQ_RESERVED tag allocations. h](jg)}(h``reserved_tags``h]jM)}(hjfh]h reserved_tags}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjdubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj`ubj)}(hhh]h)}(hDNumber of tags to set aside for BLK_MQ_REQ_RESERVED tag allocations.h]hDNumber of tags to set aside for BLK_MQ_REQ_RESERVED tag allocations.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj|ubah}(h]h ]h"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]uh1j`hj{hMhj+ubja)}(ho``cmd_size`` Number of additional bytes to allocate per request. The block driver owns these additional bytes. h](jg)}(h ``cmd_size``h]jM)}(hjh]hcmd_size}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(haNumber of additional bytes to allocate per request. The block driver owns these additional bytes.h]haNumber of additional bytes to allocate per request. The block driver owns these additional bytes.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj+ubja)}(hC``numa_node`` NUMA node the storage adapter has been connected to. h](jg)}(h ``numa_node``h]jM)}(hjh]h numa_node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(h4NUMA node the storage adapter has been connected to.h]h4NUMA node the storage adapter has been connected to.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj+ubja)}(h3``timeout`` Request processing timeout in jiffies. h](jg)}(h ``timeout``h]jM)}(hjh]htimeout}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj ubj)}(hhh]h)}(h&Request processing timeout in jiffies.h]h&Request processing timeout in jiffies.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj)ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj(hMhj+ubja)}(h)``flags`` Zero or more BLK_MQ_F_* flags. h](jg)}(h ``flags``h]jM)}(hjLh]hflags}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjJubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjFubj)}(hhh]h)}(hZero or more BLK_MQ_F_* flags.h]hZero or more BLK_MQ_F_* flags.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahMhjbubah}(h]h ]h"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]uh1j`hjahMhj+ubja)}(hU``driver_data`` Pointer to data owned by the block driver that created this tag set. h](jg)}(h``driver_data``h]jM)}(hjh]h driver_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hDPointer to data owned by the block driver that created this tag set.h]hDPointer to data owned by the block driver that created this tag set.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj+ubja)}(hR``tags`` Tag sets. One tag set per hardware queue. Has **nr_hw_queues** elements. h](jg)}(h``tags``h]jM)}(hjh]htags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hHTag sets. One tag set per hardware queue. Has **nr_hw_queues** elements.h](h.Tag sets. One tag set per hardware queue. Has }(hjhhhNhNubjF)}(h**nr_hw_queues**h]h nr_hw_queues}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubh elements.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj+ubja)}(hc``shared_tags`` Shared set of tags. Has **nr_hw_queues** elements. If set, shared by all **tags**. h](jg)}(h``shared_tags``h]jM)}(hj h]h shared_tags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM hjubj)}(hhh]h)}(hRShared set of tags. Has **nr_hw_queues** elements. If set, shared by all **tags**.h](hShared set of tags. Has }(hj$hhhNhNubjF)}(h**nr_hw_queues**h]h nr_hw_queues}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj$ubh! elements. If set, shared by all }(hj$hhhNhNubjF)}(h**tags**h]htags}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj$ubh.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM hj!ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hj hM hj+ubja)}(h0``tag_list_lock`` Serializes tag_list accesses. h](jg)}(h``tag_list_lock``h]jM)}(hjih]h tag_list_lock}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjgubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM hjcubj)}(hhh]h)}(hSerializes tag_list accesses.h]hSerializes tag_list accesses.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hM hjubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1j`hj~hM hj+ubja)}(hd``tag_list`` List of the request queues that use this tag set. See also request_queue.tag_set_list. h](jg)}(h ``tag_list``h]jM)}(hjh]htag_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hVList of the request queues that use this tag set. See also request_queue.tag_set_list.h]hVList of the request queues that use this tag set. See also request_queue.tag_set_list.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj+ubja)}(hU``srcu`` Use as lock when type of the request queue is blocking (BLK_MQ_F_BLOCKING). h](jg)}(h``srcu``h]jM)}(hjh]hsrcu}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hKUse as lock when type of the request queue is blocking (BLK_MQ_F_BLOCKING).h]hKUse as lock when type of the request queue is blocking (BLK_MQ_F_BLOCKING).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhj+ubja)}(hj``tags_srcu`` SRCU used to defer freeing of tags page_list to prevent use-after-free when iterating tags. h](jg)}(h ``tags_srcu``h]jM)}(hjh]h tags_srcu}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(h[SRCU used to defer freeing of tags page_list to prevent use-after-free when iterating tags.h]h[SRCU used to defer freeing of tags page_list to prevent use-after-free when iterating tags.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj,ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hj+hMhj+ubja)}(h```update_nr_hwq_lock`` Synchronize updating nr_hw_queues with add/del disk & switching elevator.h](jg)}(h``update_nr_hwq_lock``h]jM)}(hjPh]hupdate_nr_hwq_lock}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjNubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjJubj)}(hhh]h)}(hISynchronize updating nr_hw_queues with add/del disk & switching elevator.h]hISynchronize updating nr_hw_queues with add/del disk & switching elevator.}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1hhjehMhjfubah}(h]h ]h"]h$]h&]uh1jhjJubeh}(h]h ]h"]h$]h&]uh1j`hjehMhj+ubeh}(h]h ]h"]h$]h&]uh1j[hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_mq_queue_data (C struct)c.blk_mq_queue_datahNtauh1jhjhhhNhNubj)}(hhh](j)}(hblk_mq_queue_datah]j)}(hstruct blk_mq_queue_datah](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hblk_mq_queue_datah]j)}(hjh]hblk_mq_queue_data}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMubah}(h]jah ](j j eh"]h$]h&]jj)jhuh1jhjhMhjhhubj)}(hhh]h)}(h(Data about a request inserted in a queueh]h(Data about a request inserted in a queue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM0hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](j0structeh"]h$]h&]j5j0j6jj7jj8j9j:uh1jhhhjhNhNubj<)}(h**Definition**:: struct blk_mq_queue_data { struct request *rq; bool last; }; **Members** ``rq`` Request pointer. ``last`` If it is the last request in the queue.h](h)}(h**Definition**::h](jF)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM4hjubj)}(hDstruct blk_mq_queue_data { struct request *rq; bool last; };h]hDstruct blk_mq_queue_data { struct request *rq; bool last; };}hj(sbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM6hjubh)}(h **Members**h]jF)}(hj9h]hMembers}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj7ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM;hjubj\)}(hhh](ja)}(h``rq`` Request pointer. h](jg)}(h``rq``h]jM)}(hjXh]hrq}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjVubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM3hjRubj)}(hhh]h)}(hRequest pointer.h]hRequest pointer.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjmhM3hjnubah}(h]h ]h"]h$]h&]uh1jhjRubeh}(h]h ]h"]h$]h&]uh1j`hjmhM3hjOubja)}(h0``last`` If it is the last request in the queue.h](jg)}(h``last``h]jM)}(hjh]hlast}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM3hjubj)}(hhh]h)}(h'If it is the last request in the queue.h]h'If it is the last request in the queue.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM4hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhM3hjOubeh}(h]h ]h"]h$]h&]uh1j[hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_mq_ops (C struct) c.blk_mq_opshNtauh1jhjhhhNhNubj)}(hhh](j)}(h blk_mq_opsh]j)}(hstruct blk_mq_opsh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM:ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM:ubj)}(h blk_mq_opsh]j)}(hjh]h blk_mq_ops}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhM:ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhM:ubah}(h]jah ](j j eh"]h$]h&]jj)jhuh1jhjhM:hjhhubj)}(hhh]h)}(h:Callback functions that implements block driver behaviour.h]h:Callback functions that implements block driver behaviour.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM=hj*hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM:ubeh}(h]h ](j0structeh"]h$]h&]j5j0j6jEj7jEj8j9j:uh1jhhhjhNhNubj<)}(hX **Definition**:: struct blk_mq_ops { blk_status_t (*queue_rq)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *); void (*commit_rqs)(struct blk_mq_hw_ctx *); void (*queue_rqs)(struct rq_list *rqlist); int (*get_budget)(struct request_queue *); void (*put_budget)(struct request_queue *, int); void (*set_rq_budget_token)(struct request *, int); int (*get_rq_budget_token)(struct request *); enum blk_eh_timer_return (*timeout)(struct request *); int (*poll)(struct blk_mq_hw_ctx *, struct io_comp_batch *); void (*complete)(struct request *); int (*init_hctx)(struct blk_mq_hw_ctx *, void *, unsigned int); void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); int (*init_request)(struct blk_mq_tag_set *set, struct request *, unsigned int, unsigned int); void (*exit_request)(struct blk_mq_tag_set *set, struct request *, unsigned int); void (*cleanup_rq)(struct request *); bool (*busy)(struct request_queue *); void (*map_queues)(struct blk_mq_tag_set *set); #ifdef CONFIG_BLK_DEBUG_FS; void (*show_rq)(struct seq_file *m, struct request *rq); #endif; }; **Members** ``queue_rq`` Queue a new request from block IO. ``commit_rqs`` If a driver uses bd->last to judge when to submit requests to hardware, it must define this function. In case of errors that make us stop issuing further requests, this hook serves the purpose of kicking the hardware (which the last request otherwise would have done). ``queue_rqs`` Queue a list of new requests. Driver is guaranteed that each request belongs to the same queue. If the driver doesn't empty the **rqlist** completely, then the rest will be queued individually by the block layer upon return. ``get_budget`` Reserve budget before queue request, once .queue_rq is run, it is driver's responsibility to release the reserved budget. Also we have to handle failure case of .get_budget for avoiding I/O deadlock. ``put_budget`` Release the reserved budget. ``set_rq_budget_token`` store rq's budget token ``get_rq_budget_token`` retrieve rq's budget token ``timeout`` Called on request timeout. ``poll`` Called to poll for completion of a specific tag. ``complete`` Mark the request as complete. ``init_hctx`` Called when the block layer side of a hardware queue has been set up, allowing the driver to allocate/init matching structures. ``exit_hctx`` Ditto for exit/teardown. ``init_request`` Called for every command allocated by the block layer to allow the driver to set up driver specific data. Tag greater than or equal to queue_depth is for setting up flush request. ``exit_request`` Ditto for exit/teardown. ``cleanup_rq`` Called before freeing one request which isn't completed yet, and usually for freeing the driver private data. ``busy`` If set, returns whether or not this queue currently is busy. ``map_queues`` This allows drivers specify their own queue mapping by overriding the setup-time function that builds the mq_map. ``show_rq`` Used by the debugfs implementation to show driver-specific information about a request.h](h)}(h**Definition**::h](jF)}(h**Definition**h]h Definition}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjMubh:}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMAhjIubj)}(hXbstruct blk_mq_ops { blk_status_t (*queue_rq)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *); void (*commit_rqs)(struct blk_mq_hw_ctx *); void (*queue_rqs)(struct rq_list *rqlist); int (*get_budget)(struct request_queue *); void (*put_budget)(struct request_queue *, int); void (*set_rq_budget_token)(struct request *, int); int (*get_rq_budget_token)(struct request *); enum blk_eh_timer_return (*timeout)(struct request *); int (*poll)(struct blk_mq_hw_ctx *, struct io_comp_batch *); void (*complete)(struct request *); int (*init_hctx)(struct blk_mq_hw_ctx *, void *, unsigned int); void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); int (*init_request)(struct blk_mq_tag_set *set, struct request *, unsigned int, unsigned int); void (*exit_request)(struct blk_mq_tag_set *set, struct request *, unsigned int); void (*cleanup_rq)(struct request *); bool (*busy)(struct request_queue *); void (*map_queues)(struct blk_mq_tag_set *set); #ifdef CONFIG_BLK_DEBUG_FS; void (*show_rq)(struct seq_file *m, struct request *rq); #endif; };h]hXbstruct blk_mq_ops { blk_status_t (*queue_rq)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *); void (*commit_rqs)(struct blk_mq_hw_ctx *); void (*queue_rqs)(struct rq_list *rqlist); int (*get_budget)(struct request_queue *); void (*put_budget)(struct request_queue *, int); void (*set_rq_budget_token)(struct request *, int); int (*get_rq_budget_token)(struct request *); enum blk_eh_timer_return (*timeout)(struct request *); int (*poll)(struct blk_mq_hw_ctx *, struct io_comp_batch *); void (*complete)(struct request *); int (*init_hctx)(struct blk_mq_hw_ctx *, void *, unsigned int); void (*exit_hctx)(struct blk_mq_hw_ctx *, unsigned int); int (*init_request)(struct blk_mq_tag_set *set, struct request *, unsigned int, unsigned int); void (*exit_request)(struct blk_mq_tag_set *set, struct request *, unsigned int); void (*cleanup_rq)(struct request *); bool (*busy)(struct request_queue *); void (*map_queues)(struct blk_mq_tag_set *set); #ifdef CONFIG_BLK_DEBUG_FS; void (*show_rq)(struct seq_file *m, struct request *rq); #endif; };}hjjsbah}(h]h ]h"]h$]h&]hhuh1jhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMChjIubh)}(h **Members**h]jF)}(hj{h]hMembers}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjyubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMZhjIubj\)}(hhh](ja)}(h0``queue_rq`` Queue a new request from block IO. h](jg)}(h ``queue_rq``h]jM)}(hjh]hqueue_rq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMChjubj)}(hhh]h)}(h"Queue a new request from block IO.h]h"Queue a new request from block IO.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMChjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMChjubja)}(hX``commit_rqs`` If a driver uses bd->last to judge when to submit requests to hardware, it must define this function. In case of errors that make us stop issuing further requests, this hook serves the purpose of kicking the hardware (which the last request otherwise would have done). h](jg)}(h``commit_rqs``h]jM)}(hjh]h commit_rqs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMMhjubj)}(hhh]h)}(hX If a driver uses bd->last to judge when to submit requests to hardware, it must define this function. In case of errors that make us stop issuing further requests, this hook serves the purpose of kicking the hardware (which the last request otherwise would have done).h]hX If a driver uses bd->last to judge when to submit requests to hardware, it must define this function. In case of errors that make us stop issuing further requests, this hook serves the purpose of kicking the hardware (which the last request otherwise would have done).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMIhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMMhjubja)}(h``queue_rqs`` Queue a list of new requests. Driver is guaranteed that each request belongs to the same queue. If the driver doesn't empty the **rqlist** completely, then the rest will be queued individually by the block layer upon return. h](jg)}(h ``queue_rqs``h]jM)}(hj h]h queue_rqs}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMUhjubj)}(hhh]h)}(hQueue a list of new requests. Driver is guaranteed that each request belongs to the same queue. If the driver doesn't empty the **rqlist** completely, then the rest will be queued individually by the block layer upon return.h](hQueue a list of new requests. Driver is guaranteed that each request belongs to the same queue. If the driver doesn’t empty the }(hj&hhhNhNubjF)}(h **rqlist**h]hrqlist}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj&ubhV completely, then the rest will be queued individually by the block layer upon return.}(hj&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMRhj#ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hj"hMUhjubja)}(h``get_budget`` Reserve budget before queue request, once .queue_rq is run, it is driver's responsibility to release the reserved budget. Also we have to handle failure case of .get_budget for avoiding I/O deadlock. h](jg)}(h``get_budget``h]jM)}(hjYh]h get_budget}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjWubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM]hjSubj)}(hhh]h)}(hReserve budget before queue request, once .queue_rq is run, it is driver's responsibility to release the reserved budget. Also we have to handle failure case of .get_budget for avoiding I/O deadlock.h]hReserve budget before queue request, once .queue_rq is run, it is driver’s responsibility to release the reserved budget. Also we have to handle failure case of .get_budget for avoiding I/O deadlock.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMZhjoubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1j`hjnhM]hjubja)}(h,``put_budget`` Release the reserved budget. h](jg)}(h``put_budget``h]jM)}(hjh]h put_budget}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMbhjubj)}(hhh]h)}(hRelease the reserved budget.h]hRelease the reserved budget.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMbhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMbhjubja)}(h0``set_rq_budget_token`` store rq's budget token h](jg)}(h``set_rq_budget_token``h]jM)}(hjh]hset_rq_budget_token}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMghjubj)}(hhh]h)}(hstore rq's budget tokenh]hstore rq’s budget token}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMghjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMghjubja)}(h3``get_rq_budget_token`` retrieve rq's budget token h](jg)}(h``get_rq_budget_token``h]jM)}(hjh]hget_rq_budget_token}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMkhjubj)}(hhh]h)}(hretrieve rq's budget tokenh]hretrieve rq’s budget token}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMkhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMkhjubja)}(h'``timeout`` Called on request timeout. h](jg)}(h ``timeout``h]jM)}(hj>h]htimeout}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj<ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMphj8ubj)}(hhh]h)}(hCalled on request timeout.h]hCalled on request timeout.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMphjTubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1j`hjShMphjubja)}(h:``poll`` Called to poll for completion of a specific tag. h](jg)}(h``poll``h]jM)}(hjwh]hpoll}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjuubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMuhjqubj)}(hhh]h)}(h0Called to poll for completion of a specific tag.h]h0Called to poll for completion of a specific tag.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMuhjubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1j`hjhMuhjubja)}(h+``complete`` Mark the request as complete. h](jg)}(h ``complete``h]jM)}(hjh]hcomplete}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMzhjubj)}(hhh]h)}(hMark the request as complete.h]hMark the request as complete.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMzhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMzhjubja)}(h``init_hctx`` Called when the block layer side of a hardware queue has been set up, allowing the driver to allocate/init matching structures. h](jg)}(h ``init_hctx``h]jM)}(hjh]h init_hctx}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hCalled when the block layer side of a hardware queue has been set up, allowing the driver to allocate/init matching structures.h]hCalled when the block layer side of a hardware queue has been set up, allowing the driver to allocate/init matching structures.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhjubja)}(h'``exit_hctx`` Ditto for exit/teardown. h](jg)}(h ``exit_hctx``h]jM)}(hj#h]h exit_hctx}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj!ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hDitto for exit/teardown.h]hDitto for exit/teardown.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hMhj9ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hj8hMhjubja)}(h``init_request`` Called for every command allocated by the block layer to allow the driver to set up driver specific data. Tag greater than or equal to queue_depth is for setting up flush request. h](jg)}(h``init_request``h]jM)}(hj\h]h init_request}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjZubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjVubj)}(hhh](h)}(hiCalled for every command allocated by the block layer to allow the driver to set up driver specific data.h]hiCalled for every command allocated by the block layer to allow the driver to set up driver specific data.}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjrubh)}(hITag greater than or equal to queue_depth is for setting up flush request.h]hITag greater than or equal to queue_depth is for setting up flush request.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjrubeh}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1j`hjqhMhjubja)}(h*``exit_request`` Ditto for exit/teardown. h](jg)}(h``exit_request``h]jM)}(hjh]h exit_request}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hDitto for exit/teardown.h]hDitto for exit/teardown.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhjubja)}(h}``cleanup_rq`` Called before freeing one request which isn't completed yet, and usually for freeing the driver private data. h](jg)}(h``cleanup_rq``h]jM)}(hjh]h cleanup_rq}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hmCalled before freeing one request which isn't completed yet, and usually for freeing the driver private data.h]hoCalled before freeing one request which isn’t completed yet, and usually for freeing the driver private data.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMhjubja)}(hF``busy`` If set, returns whether or not this queue currently is busy. h](jg)}(h``busy``h]jM)}(hjh]hbusy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhjubj)}(hhh]h)}(hhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhM7ubhdesc_parameterlist)}(h(struct request *rq)h]hdesc_parameter)}(hstruct request *rqh](j)}(hjh]hstruct}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(h h]h }(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubh)}(hhh]j)}(hrequesth]hrequest}(hj{hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj}modnameN classnameNjj )}j#]j'c.blk_mq_rq_stateasbuh1hhjYubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjYubj)}(hrqh]hrq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjSubah}(h]h ]h"]h$]h&]hhuh1jQhjhhhjhM7ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhM7ubah}(h]jah ](j j eh"]h$]h&]jj)jhuh1jhjhM7hjhhubj)}(hhh]h)}(h+read the current MQ_RQ_* state of a requesth]h+read the current MQ_RQ_* state of a request}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM7hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM7ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6jj7jj8j9j:uh1jhhhjhNhNubj<)}(h8**Parameters** ``struct request *rq`` target request.h](h)}(h**Parameters**h]jF)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM;hjubj\)}(hhh]ja)}(h&``struct request *rq`` target request.h](jg)}(h``struct request *rq``h]jM)}(hj#h]hstruct request *rq}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj!ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM=hjubj)}(hhh]h)}(htarget request.h]htarget request.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM8hj9ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hj8hM=hjubah}(h]h ]h"]h$]h&]uh1j[hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_mq_add_to_batch (C function)c.blk_mq_add_to_batchhNtauh1jhjhhhNhNubj)}(hhh](j)}(hbool blk_mq_add_to_batch (struct request *req, struct io_comp_batch *iob, bool is_error, void (*complete)(struct io_comp_batch *))h]j)}(hbool blk_mq_add_to_batch(struct request *req, struct io_comp_batch *iob, bool is_error, void (*complete)(struct io_comp_batch*))h](hdesc_sig_keyword_type)}(hboolh]hbool}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1j}hjyhhhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMtubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyhhhjhMtubj)}(hblk_mq_add_to_batchh]j)}(hblk_mq_add_to_batchh]hblk_mq_add_to_batch}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjyhhhjhMtubjR)}(hh(struct request *req, struct io_comp_batch *iob, bool is_error, void (*complete)(struct io_comp_batch*))h](jX)}(hstruct request *reqh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hrequesth]hrequest}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjmodnameN classnameNjj )}j#]j&)}jjsbc.blk_mq_add_to_batchasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hreqh]hreq}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubjX)}(hstruct io_comp_batch *iobh](j)}(hjh]hstruct}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubh)}(hhh]j)}(h io_comp_batchh]h io_comp_batch}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjOmodnameN classnameNjj )}j#]jc.blk_mq_add_to_batchasbuh1hhj+ubj)}(h h]h }(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hiobh]hiob}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubjX)}(h bool is_errorh](j~)}(hjh]hbool}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(his_errorh]his_error}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubjX)}(h'void (*complete)(struct io_comp_batch*)h](j~)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h(h]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcompleteh]hcomplete}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h)h]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h(}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(h io_comp_batchh]h io_comp_batch}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjSmodnameN classnameNjj )}j#]jc.blk_mq_add_to_batchasbuh1hhjubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h)}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjubeh}(h]h ]h"]h$]h&]hhuh1jQhjyhhhjhMtubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjuhhhjhMtubah}(h]jpah ](j j eh"]h$]h&]jj)jhuh1jhjhMthjrhhubj)}(hhh]h)}(h%add a request to the completion batchh]h%add a request to the completion batch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMthjhhubah}(h]h ]h"]h$]h&]uh1jhjrhhhjhMtubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6jj7jj8j9j:uh1jhhhjhNhNubj<)}(hX**Parameters** ``struct request *req`` The request to add to batch ``struct io_comp_batch *iob`` The batch to add the request ``bool is_error`` Specify true if the request failed with an error ``void (*complete)(struct io_comp_batch *)`` The completaion handler for the request **Description** Batched completions only work when there is no I/O error and no special ->end_io handler. **Return** true when the request was added to the batch, otherwise falseh](h)}(h**Parameters**h]jF)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMxhjubj\)}(hhh](ja)}(h4``struct request *req`` The request to add to batch h](jg)}(h``struct request *req``h]jM)}(hjh]hstruct request *req}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMuhjubj)}(hhh]h)}(hThe request to add to batchh]hThe request to add to batch}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMuhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1j`hjhMuhjubja)}(h;``struct io_comp_batch *iob`` The batch to add the request h](jg)}(h``struct io_comp_batch *iob``h]jM)}(hj h]hstruct io_comp_batch *iob}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMvhj ubj)}(hhh]h)}(hThe batch to add the requesth]hThe batch to add the request}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4 hMvhj5 ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj4 hMvhjubja)}(hC``bool is_error`` Specify true if the request failed with an error h](jg)}(h``bool is_error``h]jM)}(hjX h]h bool is_error}(hjZ hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjV ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMwhjR ubj)}(hhh]h)}(h0Specify true if the request failed with an errorh]h0Specify true if the request failed with an error}(hjq hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjm hMwhjn ubah}(h]h ]h"]h$]h&]uh1jhjR ubeh}(h]h ]h"]h$]h&]uh1j`hjm hMwhjubja)}(hU``void (*complete)(struct io_comp_batch *)`` The completaion handler for the request h](jg)}(h,``void (*complete)(struct io_comp_batch *)``h]jM)}(hj h]h(void (*complete)(struct io_comp_batch *)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMxhj ubj)}(hhh]h)}(h'The completaion handler for the requesth]h'The completaion handler for the request}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMxhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1j`hj hMxhjubeh}(h]h ]h"]h$]h&]uh1j[hjubh)}(h**Description**h]jF)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMzhjubh)}(hYBatched completions only work when there is no I/O error and no special ->end_io handler.h]hYBatched completions only work when there is no I/O error and no special ->end_io handler.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMyhjubh)}(h **Return**h]jF)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM|hjubh)}(h=true when the request was added to the batch, otherwise falseh]h=true when the request was added to the batch, otherwise false}(hj !hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhM}hjubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_mq_rq_from_pdu (C function)c.blk_mq_rq_from_pduhNtauh1jhjhhhNhNubj)}(hhh](j)}(h/struct request * blk_mq_rq_from_pdu (void *pdu)h]j)}(h-struct request *blk_mq_rq_from_pdu(void *pdu)h](j)}(hjh]hstruct}(hj8!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4!hhhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMubj)}(h h]h }(hjF!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4!hhhjE!hMubh)}(hhh]j)}(hrequesth]hrequest}(hjW!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjT!ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjY!modnameN classnameNjj )}j#]j&)}jblk_mq_rq_from_pdusbc.blk_mq_rq_from_pduasbuh1hhj4!hhhjE!hMubj)}(h h]h }(hjx!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4!hhhjE!hMubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4!hhhjE!hMubj)}(hblk_mq_rq_from_pduh]j)}(hju!h]hblk_mq_rq_from_pdu}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj4!hhhjE!hMubjR)}(h (void *pdu)h]jX)}(h void *pduh](j~)}(hvoidh]hvoid}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj!ubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubj)}(hpduh]hpdu}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj!ubah}(h]h ]h"]h$]h&]hhuh1jQhj4!hhhjE!hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj0!hhhjE!hMubah}(h]j+!ah ](j j eh"]h$]h&]jj)jhuh1jhjE!hMhj-!hhubj)}(hhh]h)}(hcast a PDU to a requesth]hcast a PDU to a request}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj"hhubah}(h]h ]h"]h$]h&]uh1jhj-!hhhjE!hMubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j"j7j"j8j9j:uh1jhhhjhNhNubj<)}(h**Parameters** ``void *pdu`` the PDU (Protocol Data Unit) to be casted **Return** request **Description** Driver command data is immediately after the request. So subtract request size to get back to the original request.h](h)}(h**Parameters**h]jF)}(hj'"h]h Parameters}(hj)"hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj%"ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj!"ubj\)}(hhh]ja)}(h8``void *pdu`` the PDU (Protocol Data Unit) to be casted h](jg)}(h ``void *pdu``h]jM)}(hjF"h]h void *pdu}(hjH"hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjD"ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj@"ubj)}(hhh]h)}(h)the PDU (Protocol Data Unit) to be castedh]h)the PDU (Protocol Data Unit) to be casted}(hj_"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj["hMhj\"ubah}(h]h ]h"]h$]h&]uh1jhj@"ubeh}(h]h ]h"]h$]h&]uh1j`hj["hMhj="ubah}(h]h ]h"]h$]h&]uh1j[hj!"ubh)}(h **Return**h]jF)}(hj"h]hReturn}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj"ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj!"ubh)}(hrequesth]hrequest}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj!"ubh)}(h**Description**h]jF)}(hj"h]h Description}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj"ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj!"ubh)}(hsDriver command data is immediately after the request. So subtract request size to get back to the original request.h]hsDriver command data is immediately after the request. So subtract request size to get back to the original request.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj!"ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_mq_rq_to_pdu (C function)c.blk_mq_rq_to_pduhNtauh1jhjhhhNhNubj)}(hhh](j)}(h,void * blk_mq_rq_to_pdu (struct request *rq)h]j)}(h*void *blk_mq_rq_to_pdu(struct request *rq)h](j~)}(hvoidh]hvoid}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj"hhhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhj"hMubj)}(hjh]h*}(hj #hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhj"hMubj)}(hblk_mq_rq_to_pduh]j)}(hblk_mq_rq_to_pduh]hblk_mq_rq_to_pdu}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj"hhhj"hMubjR)}(h(struct request *rq)h]jX)}(hstruct request *rqh](j)}(hjh]hstruct}(hj7#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3#ubj)}(h h]h }(hjD#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3#ubh)}(hhh]j)}(hrequesth]hrequest}(hjU#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjR#ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjW#modnameN classnameNjj )}j#]j&)}jj#sbc.blk_mq_rq_to_pduasbuh1hhj3#ubj)}(h h]h }(hju#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3#ubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3#ubj)}(hrqh]hrq}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3#ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj/#ubah}(h]h ]h"]h$]h&]hhuh1jQhj"hhhj"hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj"hhhj"hMubah}(h]j"ah ](j j eh"]h$]h&]jj)jhuh1jhj"hMhj"hhubj)}(hhh]h)}(hcast a request to a PDUh]hcast a request to a PDU}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj#hhubah}(h]h ]h"]h$]h&]uh1jhj"hhhj"hMubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j#j7j#j8j9j:uh1jhhhjhNhNubj<)}(h**Parameters** ``struct request *rq`` the request to be casted **Return** pointer to the PDU **Description** Driver command data is immediately after the request. So add request to get the PDU.h](h)}(h**Parameters**h]jF)}(hj#h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj#ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj#ubj\)}(hhh]ja)}(h0``struct request *rq`` the request to be casted h](jg)}(h``struct request *rq``h]jM)}(hj#h]hstruct request *rq}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj#ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj#ubj)}(hhh]h)}(hthe request to be castedh]hthe request to be casted}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj$hMhj$ubah}(h]h ]h"]h$]h&]uh1jhj#ubeh}(h]h ]h"]h$]h&]uh1j`hj$hMhj#ubah}(h]h ]h"]h$]h&]uh1j[hj#ubh)}(h **Return**h]jF)}(hj6$h]hReturn}(hj8$hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj4$ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj#ubh)}(hpointer to the PDUh]hpointer to the PDU}(hjL$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj#ubh)}(h**Description**h]jF)}(hj]$h]h Description}(hj_$hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj[$ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj#ubh)}(hTDriver command data is immediately after the request. So add request to get the PDU.h]hTDriver command data is immediately after the request. So add request to get the PDU.}(hjs$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_rq_nr_bvec (C function)c.blk_rq_nr_bvechNtauh1jhjhhhNhNubj)}(hhh](j)}(h0unsigned int blk_rq_nr_bvec (struct request *rq)h]j)}(h/unsigned int blk_rq_nr_bvec(struct request *rq)h](j~)}(hunsignedh]hunsigned}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj$hhhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$hhhj$hMubj~)}(hinth]hint}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj$hhhj$hMubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$hhhj$hMubj)}(hblk_rq_nr_bvech]j)}(hblk_rq_nr_bvech]hblk_rq_nr_bvec}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj$hhhj$hMubjR)}(h(struct request *rq)h]jX)}(hstruct request *rqh](j)}(hjh]hstruct}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(h h]h }(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubh)}(hhh]j)}(hrequesth]hrequest}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj%modnameN classnameNjj )}j#]j&)}jj$sbc.blk_rq_nr_bvecasbuh1hhj$ubj)}(h h]h }(hj9%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hjh]h*}(hjG%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hrqh]hrq}(hjT%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj$ubah}(h]h ]h"]h$]h&]hhuh1jQhj$hhhj$hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj$hhhj$hMubah}(h]j$ah ](j j eh"]h$]h&]jj)jhuh1jhj$hMhj$hhubj)}(hhh]h)}(h#return number of bvecs in a requesth]h#return number of bvecs in a request}(hj~%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj{%hhubah}(h]h ]h"]h$]h&]uh1jhj$hhhj$hMubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j%j7j%j8j9j:uh1jhhhjhNhNubj<)}(hv**Parameters** ``struct request *rq`` request to calculate bvecs for **Description** Returns the number of bvecs.h](h)}(h**Parameters**h]jF)}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj%ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj%ubj\)}(hhh]ja)}(h6``struct request *rq`` request to calculate bvecs for h](jg)}(h``struct request *rq``h]jM)}(hj%h]hstruct request *rq}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj%ubah}(h]h ]h"]h$]h&]uh1jfhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj%ubj)}(hhh]h)}(hrequest to calculate bvecs forh]hrequest to calculate bvecs for}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1j`hj%hMhj%ubah}(h]h ]h"]h$]h&]uh1j[hj%ubh)}(h**Description**h]jF)}(hj%h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj%ubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj%ubh)}(hReturns the number of bvecs.h]hReturns the number of bvecs.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhT/var/lib/git/docbuild/linux/Documentation/block/blk-mq:151: ./include/linux/blk-mq.hhMhj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j%blk_mq_wait_quiesce_done (C function)c.blk_mq_wait_quiesce_donehNtauh1jhjhhhNhNubj)}(hhh](j)}(h:void blk_mq_wait_quiesce_done (struct blk_mq_tag_set *set)h]j)}(h9void blk_mq_wait_quiesce_done(struct blk_mq_tag_set *set)h](j~)}(hvoidh]hvoid}(hj?&hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj;&hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMubj)}(h h]h }(hjN&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;&hhhjM&hMubj)}(hblk_mq_wait_quiesce_doneh]j)}(hblk_mq_wait_quiesce_doneh]hblk_mq_wait_quiesce_done}(hj`&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\&ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj;&hhhjM&hMubjR)}(h(struct blk_mq_tag_set *set)h]jX)}(hstruct blk_mq_tag_set *seth](j)}(hjh]hstruct}(hj|&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx&ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx&ubh)}(hhh]j)}(hblk_mq_tag_seth]hblk_mq_tag_set}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj&modnameN classnameNjj )}j#]j&)}jjb&sbc.blk_mq_wait_quiesce_doneasbuh1hhjx&ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx&ubj)}(hjh]h*}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx&ubj)}(hseth]hset}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx&ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjt&ubah}(h]h ]h"]h$]h&]hhuh1jQhj;&hhhjM&hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj7&hhhjM&hMubah}(h]j2&ah ](j j eh"]h$]h&]jj)jhuh1jhjM&hMhj4&hhubj)}(hhh]h)}(h&wait until in-progress quiesce is doneh]h&wait until in-progress quiesce is done}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj&hhubah}(h]h ]h"]h$]h&]uh1jhj4&hhhjM&hMubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j'j7j'j8j9j:uh1jhhhjhNhNubj<)}(hXN**Parameters** ``struct blk_mq_tag_set *set`` tag_set to wait on **Note** it is driver's responsibility for making sure that quiesce has been started on or more of the request_queues of the tag_set. This function only waits for the quiesce on those request_queues that had the quiesce flag set using blk_mq_quiesce_queue_nowait.h](h)}(h**Parameters**h]jF)}(hj!'h]h Parameters}(hj#'hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj'ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj'ubj\)}(hhh]ja)}(h2``struct blk_mq_tag_set *set`` tag_set to wait on h](jg)}(h``struct blk_mq_tag_set *set``h]jM)}(hj@'h]hstruct blk_mq_tag_set *set}(hjB'hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj>'ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj:'ubj)}(hhh]h)}(htag_set to wait onh]htag_set to wait on}(hjY'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU'hMhjV'ubah}(h]h ]h"]h$]h&]uh1jhj:'ubeh}(h]h ]h"]h$]h&]uh1j`hjU'hMhj7'ubah}(h]h ]h"]h$]h&]uh1j[hj'ubh)}(h**Note**h]jF)}(hj{'h]hNote}(hj}'hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjy'ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj'ubh)}(hit is driver's responsibility for making sure that quiesce has been started on or more of the request_queues of the tag_set. This function only waits for the quiesce on those request_queues that had the quiesce flag set using blk_mq_quiesce_queue_nowait.h]hXit is driver’s responsibility for making sure that quiesce has been started on or more of the request_queues of the tag_set. This function only waits for the quiesce on those request_queues that had the quiesce flag set using blk_mq_quiesce_queue_nowait.}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!blk_mq_quiesce_queue (C function)c.blk_mq_quiesce_queuehNtauh1jhjhhhNhNubj)}(hhh](j)}(h3void blk_mq_quiesce_queue (struct request_queue *q)h]j)}(h2void blk_mq_quiesce_queue(struct request_queue *q)h](j~)}(hvoidh]hvoid}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj'hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM#ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hhhj'hM#ubj)}(hblk_mq_quiesce_queueh]j)}(hblk_mq_quiesce_queueh]hblk_mq_quiesce_queue}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj'hhhj'hM#ubjR)}(h(struct request_queue *q)h]jX)}(hstruct request_queue *qh](j)}(hjh]hstruct}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(h h]h }(hj (hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubh)}(hhh]j)}(h request_queueh]h request_queue}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj(modnameN classnameNjj )}j#]j&)}jj'sbc.blk_mq_quiesce_queueasbuh1hhj'ubj)}(h h]h }(hj;(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hjh]h*}(hjI(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hqh]hq}(hjV(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj'ubah}(h]h ]h"]h$]h&]hhuh1jQhj'hhhj'hM#ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj'hhhj'hM#ubah}(h]j'ah ](j j eh"]h$]h&]jj)jhuh1jhj'hM#hj'hhubj)}(hhh]h)}(h/wait until all ongoing dispatches have finishedh]h/wait until all ongoing dispatches have finished}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM#hj}(hhubah}(h]h ]h"]h$]h&]uh1jhj'hhhj'hM#ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j(j7j(j8j9j:uh1jhhhjhNhNubj<)}(hX%**Parameters** ``struct request_queue *q`` request queue. **Note** this function does not prevent that the struct request end_io() callback function is invoked. Once this function is returned, we make sure no dispatch can happen until the queue is unquiesced via blk_mq_unquiesce_queue().h](h)}(h**Parameters**h]jF)}(hj(h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj(ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM'hj(ubj\)}(hhh]ja)}(h+``struct request_queue *q`` request queue. h](jg)}(h``struct request_queue *q``h]jM)}(hj(h]hstruct request_queue *q}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj(ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM$hj(ubj)}(hhh]h)}(hrequest queue.h]hrequest queue.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hM$hj(ubah}(h]h ]h"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]uh1j`hj(hM$hj(ubah}(h]h ]h"]h$]h&]uh1j[hj(ubh)}(h**Note**h]jF)}(hj(h]hNote}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj(ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM&hj(ubh)}(hthis function does not prevent that the struct request end_io() callback function is invoked. Once this function is returned, we make sure no dispatch can happen until the queue is unquiesced via blk_mq_unquiesce_queue().h]hthis function does not prevent that the struct request end_io() callback function is invoked. Once this function is returned, we make sure no dispatch can happen until the queue is unquiesced via blk_mq_unquiesce_queue().}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM&hj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_update_request (C function)c.blk_update_requesthNtauh1jhjhhhNhNubj)}(hhh](j)}(hXbool blk_update_request (struct request *req, blk_status_t error, unsigned int nr_bytes)h]j)}(hWbool blk_update_request(struct request *req, blk_status_t error, unsigned int nr_bytes)h](j~)}(hjh]hbool}(hjA)hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj=)hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMubj)}(h h]h }(hjO)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=)hhhjN)hMubj)}(hblk_update_requesth]j)}(hblk_update_requesth]hblk_update_request}(hja)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj])ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj=)hhhjN)hMubjR)}(h@(struct request *req, blk_status_t error, unsigned int nr_bytes)h](jX)}(hstruct request *reqh](j)}(hjh]hstruct}(hj})hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy)ubh)}(hhh]j)}(hrequesth]hrequest}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj)modnameN classnameNjj )}j#]j&)}jjc)sbc.blk_update_requestasbuh1hhjy)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy)ubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy)ubj)}(hreqh]hreq}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy)ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhju)ubjX)}(hblk_status_t errorh](h)}(hhh]j)}(h blk_status_th]h blk_status_t}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj)modnameN classnameNjj )}j#]j)c.blk_update_requestasbuh1hhj)ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(herrorh]herror}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhju)ubjX)}(hunsigned int nr_bytesh](j~)}(hunsignedh]hunsigned}(hj7*hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj3*ubj)}(h h]h }(hjE*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3*ubj~)}(hinth]hint}(hjS*hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj3*ubj)}(h h]h }(hja*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3*ubj)}(hnr_bytesh]hnr_bytes}(hjo*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3*ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhju)ubeh}(h]h ]h"]h$]h&]hhuh1jQhj=)hhhjN)hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj9)hhhjN)hMubah}(h]j4)ah ](j j eh"]h$]h&]jj)jhuh1jhjN)hMhj6)hhubj)}(hhh]h)}(h6Complete multiple bytes without completing the requesth]h6Complete multiple bytes without completing the request}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj*hhubah}(h]h ]h"]h$]h&]uh1jhj6)hhhjN)hMubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j*j7j*j8j9j:uh1jhhhjhNhNubj<)}(hX **Parameters** ``struct request *req`` the request being processed ``blk_status_t error`` block status code ``unsigned int nr_bytes`` number of bytes to complete for **req** **Description** Ends I/O on a number of bytes attached to **req**, but doesn't complete the request structure even if **req** doesn't have leftover. If **req** has leftover, sets it up for the next range of segments. Passing the result of blk_rq_bytes() as **nr_bytes** guarantees ``false`` return from this function. **Note** The RQF_SPECIAL_PAYLOAD flag is ignored on purpose in this function except in the consistency check at the end of this function. **Return** ``false`` - this request doesn't have any more data ``true`` - this request has more datah](h)}(h**Parameters**h]jF)}(hj*h]h Parameters}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj*ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj*ubj\)}(hhh](ja)}(h4``struct request *req`` the request being processed h](jg)}(h``struct request *req``h]jM)}(hj*h]hstruct request *req}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj*ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj*ubj)}(hhh]h)}(hthe request being processedh]hthe request being processed}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMhj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1j`hj*hMhj*ubja)}(h)``blk_status_t error`` block status code h](jg)}(h``blk_status_t error``h]jM)}(hj+h]hblk_status_t error}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj+ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj +ubj)}(hhh]h)}(hblock status codeh]hblock status code}(hj,+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(+hMhj)+ubah}(h]h ]h"]h$]h&]uh1jhj +ubeh}(h]h ]h"]h$]h&]uh1j`hj(+hMhj*ubja)}(hB``unsigned int nr_bytes`` number of bytes to complete for **req** h](jg)}(h``unsigned int nr_bytes``h]jM)}(hjL+h]hunsigned int nr_bytes}(hjN+hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjJ+ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhjF+ubj)}(hhh]h)}(h'number of bytes to complete for **req**h](h number of bytes to complete for }(hje+hhhNhNubjF)}(h**req**h]hreq}(hjm+hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhje+ubeh}(h]h ]h"]h$]h&]uh1hhja+hMhjb+ubah}(h]h ]h"]h$]h&]uh1jhjF+ubeh}(h]h ]h"]h$]h&]uh1j`hja+hMhj*ubeh}(h]h ]h"]h$]h&]uh1j[hj*ubh)}(h**Description**h]jF)}(hj+h]h Description}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj+ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj*ubh block_quote)}(hX/Ends I/O on a number of bytes attached to **req**, but doesn't complete the request structure even if **req** doesn't have leftover. If **req** has leftover, sets it up for the next range of segments. Passing the result of blk_rq_bytes() as **nr_bytes** guarantees ``false`` return from this function. h](h)}(hEnds I/O on a number of bytes attached to **req**, but doesn't complete the request structure even if **req** doesn't have leftover. If **req** has leftover, sets it up for the next range of segments.h](h*Ends I/O on a number of bytes attached to }(hj+hhhNhNubjF)}(h**req**h]hreq}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj+ubh7, but doesn’t complete the request structure even if }(hj+hhhNhNubjF)}(h**req**h]hreq}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj+ubh doesn’t have leftover. If }(hj+hhhNhNubjF)}(h**req**h]hreq}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj+ubh9 has leftover, sets it up for the next range of segments.}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj+ubh)}(hdPassing the result of blk_rq_bytes() as **nr_bytes** guarantees ``false`` return from this function.h](h(Passing the result of blk_rq_bytes() as }(hj+hhhNhNubjF)}(h **nr_bytes**h]hnr_bytes}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj+ubh guarantees }(hj+hhhNhNubjM)}(h ``false``h]hfalse}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj+ubh return from this function.}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj+ubeh}(h]h ]h"]h$]h&]uh1j+hj+hMhj*ubh)}(h**Note**h]jF)}(hj1,h]hNote}(hj3,hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj/,ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj*ubj+)}(hThe RQF_SPECIAL_PAYLOAD flag is ignored on purpose in this function except in the consistency check at the end of this function. h]h)}(hThe RQF_SPECIAL_PAYLOAD flag is ignored on purpose in this function except in the consistency check at the end of this function.h]hThe RQF_SPECIAL_PAYLOAD flag is ignored on purpose in this function except in the consistency check at the end of this function.}(hjK,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhjG,ubah}(h]h ]h"]h$]h&]uh1j+hjY,hMhj*ubh)}(h **Return**h]jF)}(hjb,h]hReturn}(hjd,hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj`,ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj*ubh)}(hZ``false`` - this request doesn't have any more data ``true`` - this request has more datah](jM)}(h ``false``h]hfalse}(hj|,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjx,ubh- - this request doesn’t have any more data }(hjx,hhhNhNubjM)}(h``true``h]htrue}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjx,ubh - this request has more data}(hjx,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj*ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j$blk_mq_complete_request (C function)c.blk_mq_complete_requesthNtauh1jhjhhhNhNubj)}(hhh](j)}(h1void blk_mq_complete_request (struct request *rq)h]j)}(h0void blk_mq_complete_request(struct request *rq)h](j~)}(hvoidh]hvoid}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj,hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMCubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhhj,hMCubj)}(hblk_mq_complete_requesth]j)}(hblk_mq_complete_requesth]hblk_mq_complete_request}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj,hhhj,hMCubjR)}(h(struct request *rq)h]jX)}(hstruct request *rqh](j)}(hjh]hstruct}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubh)}(hhh]j)}(hrequesth]hrequest}(hj"-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj$-modnameN classnameNjj )}j#]j&)}jj,sbc.blk_mq_complete_requestasbuh1hhj-ubj)}(h h]h }(hjB-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hjh]h*}(hjP-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hrqh]hrq}(hj]-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj,ubah}(h]h ]h"]h$]h&]hhuh1jQhj,hhhj,hMCubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj,hhhj,hMCubah}(h]j,ah ](j j eh"]h$]h&]jj)jhuh1jhj,hMChj,hhubj)}(hhh]h)}(hend I/O on a requesth]hend I/O on a request}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMChj-hhubah}(h]h ]h"]h$]h&]uh1jhj,hhhj,hMCubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j-j7j-j8j9j:uh1jhhhjhNhNubj<)}(h**Parameters** ``struct request *rq`` the request being processed **Description** Complete a request by scheduling the ->complete_rq operation.h](h)}(h**Parameters**h]jF)}(hj-h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj-ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMGhj-ubj\)}(hhh]ja)}(h3``struct request *rq`` the request being processed h](jg)}(h``struct request *rq``h]jM)}(hj-h]hstruct request *rq}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj-ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMDhj-ubj)}(hhh]h)}(hthe request being processedh]hthe request being processed}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hMDhj-ubah}(h]h ]h"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]uh1j`hj-hMDhj-ubah}(h]h ]h"]h$]h&]uh1j[hj-ubh)}(h**Description**h]jF)}(hj.h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj.ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMFhj-ubj+)}(h=Complete a request by scheduling the ->complete_rq operation.h]h)}(hj.h]h=Complete a request by scheduling the ->complete_rq operation.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMFhj.ubah}(h]h ]h"]h$]h&]uh1j+hj*.hMFhj-ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!blk_mq_start_request (C function)c.blk_mq_start_requesthNtauh1jhjhhhNhNubj)}(hhh](j)}(h.void blk_mq_start_request (struct request *rq)h]j)}(h-void blk_mq_start_request(struct request *rq)h](j~)}(hvoidh]hvoid}(hjQ.hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hjM.hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMQubj)}(h h]h }(hj`.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjM.hhhj_.hMQubj)}(hblk_mq_start_requesth]j)}(hblk_mq_start_requesth]hblk_mq_start_request}(hjr.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn.ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjM.hhhj_.hMQubjR)}(h(struct request *rq)h]jX)}(hstruct request *rqh](j)}(hjh]hstruct}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubh)}(hhh]j)}(hrequesth]hrequest}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj.modnameN classnameNjj )}j#]j&)}jjt.sbc.blk_mq_start_requestasbuh1hhj.ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hrqh]hrq}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj.ubah}(h]h ]h"]h$]h&]hhuh1jQhjM.hhhj_.hMQubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjI.hhhj_.hMQubah}(h]jD.ah ](j j eh"]h$]h&]jj)jhuh1jhj_.hMQhjF.hhubj)}(hhh]h)}(hStart processing a requesth]hStart processing a request}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMQhj/hhubah}(h]h ]h"]h$]h&]uh1jhjF.hhhj_.hMQubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j)/j7j)/j8j9j:uh1jhhhjhNhNubj<)}(hX**Parameters** ``struct request *rq`` Pointer to request to be started **Description** Function used by device drivers to notify the block layer that a request is going to be processed now, so blk layer can do proper initializations such as starting the timeout timer.h](h)}(h**Parameters**h]jF)}(hj3/h]h Parameters}(hj5/hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj1/ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMUhj-/ubj\)}(hhh]ja)}(h8``struct request *rq`` Pointer to request to be started h](jg)}(h``struct request *rq``h]jM)}(hjR/h]hstruct request *rq}(hjT/hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjP/ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMRhjL/ubj)}(hhh]h)}(h Pointer to request to be startedh]h Pointer to request to be started}(hjk/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjg/hMRhjh/ubah}(h]h ]h"]h$]h&]uh1jhjL/ubeh}(h]h ]h"]h$]h&]uh1j`hjg/hMRhjI/ubah}(h]h ]h"]h$]h&]uh1j[hj-/ubh)}(h**Description**h]jF)}(hj/h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj/ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMThj-/ubh)}(hFunction used by device drivers to notify the block layer that a request is going to be processed now, so blk layer can do proper initializations such as starting the timeout timer.h]hFunction used by device drivers to notify the block layer that a request is going to be processed now, so blk layer can do proper initializations such as starting the timeout timer.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMShj-/ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"blk_execute_rq_nowait (C function)c.blk_execute_rq_nowaithNtauh1jhjhhhNhNubj)}(hhh](j)}(h=void blk_execute_rq_nowait (struct request *rq, bool at_head)h]j)}(h1ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj:1ubj)}(hhh]h)}(h'insert request at head or tail of queueh]h'insert request at head or tail of queue}(hjY1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjU1hMhjV1ubah}(h]h ]h"]h$]h&]uh1jhj:1ubeh}(h]h ]h"]h$]h&]uh1j`hjU1hMhj0ubeh}(h]h ]h"]h$]h&]uh1j[hj0ubh)}(h**Description**h]jF)}(hj{1h]h Description}(hj}1hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjy1ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj0ubj+)}(hrInsert a fully prepared request at the back of the I/O scheduler queue for execution. Don't wait for completion. h]h)}(hqInsert a fully prepared request at the back of the I/O scheduler queue for execution. Don't wait for completion.h]hsInsert a fully prepared request at the back of the I/O scheduler queue for execution. Don’t wait for completion.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj1ubah}(h]h ]h"]h$]h&]uh1j+hj1hMhj0ubh)}(h**Note**h]jF)}(hj1h]hNote}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj1ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj0ubj+)}(hAThis function will invoke **done** directly if the queue is dead.h]h)}(hj1h](hThis function will invoke }(hj1hhhNhNubjF)}(h**done**h]hdone}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj1ubh directly if the queue is dead.}(hj1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj1ubah}(h]h ]h"]h$]h&]uh1j+hj1hMhj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_execute_rq (C function)c.blk_execute_rqhNtauh1jhjhhhNhNubj)}(hhh](j)}(h>blk_status_t blk_execute_rq (struct request *rq, bool at_head)h]j)}(h=blk_status_t blk_execute_rq(struct request *rq, bool at_head)h](h)}(hhh]j)}(h blk_status_th]h blk_status_t}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 2ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj2modnameN classnameNjj )}j#]j&)}jblk_execute_rqsbc.blk_execute_rqasbuh1hhj2hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMubj)}(h h]h }(hj12hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2hhhj02hMubj)}(hblk_execute_rqh]j)}(hj-2h]hblk_execute_rq}(hjC2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?2ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj2hhhj02hMubjR)}(h"(struct request *rq, bool at_head)h](jX)}(hstruct request *rqh](j)}(hjh]hstruct}(hj^2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ2ubj)}(h h]h }(hjk2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ2ubh)}(hhh]j)}(hrequesth]hrequest}(hj|2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjy2ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj~2modnameN classnameNjj )}j#]j+2c.blk_execute_rqasbuh1hhjZ2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ2ubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ2ubj)}(hrqh]hrq}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZ2ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjV2ubjX)}(h bool at_headh](j~)}(hjh]hbool}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hat_headh]hat_head}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjV2ubeh}(h]h ]h"]h$]h&]hhuh1jQhj2hhhj02hMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj2hhhj02hMubah}(h]j1ah ](j j eh"]h$]h&]jj)jhuh1jhj02hMhj2hhubj)}(hhh]h)}(h)insert a request into queue for executionh]h)insert a request into queue for execution}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj3hhubah}(h]h ]h"]h$]h&]uh1jhj2hhhj02hMubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j+3j7j+3j8j9j:uh1jhhhjhNhNubj<)}(hXC**Parameters** ``struct request *rq`` request to insert ``bool 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().h](h)}(h**Parameters**h]jF)}(hj53h]h Parameters}(hj73hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj33ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj/3ubj\)}(hhh](ja)}(h)``struct request *rq`` request to insert h](jg)}(h``struct request *rq``h]jM)}(hjT3h]hstruct request *rq}(hjV3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjR3ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhjN3ubj)}(hhh]h)}(hrequest to inserth]hrequest to insert}(hjm3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhji3hMhjj3ubah}(h]h ]h"]h$]h&]uh1jhjN3ubeh}(h]h ]h"]h$]h&]uh1j`hji3hMhjK3ubja)}(h9``bool at_head`` insert request at head or tail of queue h](jg)}(h``bool at_head``h]jM)}(hj3h]h bool at_head}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj3ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj3ubj)}(hhh]h)}(h'insert request at head or tail of queueh]h'insert request at head or tail of queue}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj3hMhj3ubah}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ]h"]h$]h&]uh1j`hj3hMhjK3ubeh}(h]h ]h"]h$]h&]uh1j[hj/3ubh)}(h**Description**h]jF)}(hj3h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj3ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj/3ubj+)}(hnInsert a fully prepared request at the back of the I/O scheduler queue for execution and wait for completion. h]h)}(hmInsert a fully prepared request at the back of the I/O scheduler queue for execution and wait for completion.h]hmInsert a fully prepared request at the back of the I/O scheduler queue for execution and wait for completion.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj3ubah}(h]h ]h"]h$]h&]uh1j+hj3hMhj/3ubh)}(h **Return**h]jF)}(hj3h]hReturn}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj3ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj/3ubh)}(h9The blk_status_t result provided to blk_mq_end_request().h]h9The blk_status_t result provided to blk_mq_end_request().}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMhj/3ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&blk_mq_delay_run_hw_queue (C function)c.blk_mq_delay_run_hw_queuehNtauh1jhjhhhNhNubj)}(hhh](j)}(hPvoid blk_mq_delay_run_hw_queue (struct blk_mq_hw_ctx *hctx, unsigned long msecs)h]j)}(hOvoid blk_mq_delay_run_hw_queue(struct blk_mq_hw_ctx *hctx, unsigned long msecs)h](j~)}(hvoidh]hvoid}(hj>4hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj:4hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM ubj)}(h h]h }(hjM4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:4hhhjL4hM ubj)}(hblk_mq_delay_run_hw_queueh]j)}(hblk_mq_delay_run_hw_queueh]hblk_mq_delay_run_hw_queue}(hj_4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj[4ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj:4hhhjL4hM ubjR)}(h1(struct blk_mq_hw_ctx *hctx, unsigned long msecs)h](jX)}(hstruct blk_mq_hw_ctx *hctxh](j)}(hjh]hstruct}(hj{4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw4ubh)}(hhh]j)}(h blk_mq_hw_ctxh]h blk_mq_hw_ctx}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj4modnameN classnameNjj )}j#]j&)}jja4sbc.blk_mq_delay_run_hw_queueasbuh1hhjw4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw4ubj)}(hjh]h*}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw4ubj)}(hhctxh]hhctx}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw4ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjs4ubjX)}(hunsigned long msecsh](j~)}(hunsignedh]hunsigned}(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj4ubj)}(h h]h }(hj4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj~)}(hlongh]hlong}(hj 5hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj4ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(hmsecsh]hmsecs}(hj%5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjs4ubeh}(h]h ]h"]h$]h&]hhuh1jQhj:4hhhjL4hM ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj64hhhjL4hM ubah}(h]j14ah ](j j eh"]h$]h&]jj)jhuh1jhjL4hM hj34hhubj)}(hhh]h)}(h$Run a hardware queue asynchronously.h]h$Run a hardware queue asynchronously.}(hjO5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjL5hhubah}(h]h ]h"]h$]h&]uh1jhj34hhhjL4hM ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6jg5j7jg5j8j9j:uh1jhhhjhNhNubj<)}(h**Parameters** ``struct blk_mq_hw_ctx *hctx`` Pointer to the hardware queue to run. ``unsigned long msecs`` Milliseconds of delay to wait before running the queue. **Description** Run a hardware queue asynchronously with a delay of **msecs**.h](h)}(h**Parameters**h]jF)}(hjq5h]h Parameters}(hjs5hhhNhNubah}(h]h ]h" ]h$]h&]uh1jEhjo5ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjk5ubj\)}(hhh](ja)}(hE``struct blk_mq_hw_ctx *hctx`` Pointer to the hardware queue to run. h](jg)}(h``struct blk_mq_hw_ctx *hctx``h]jM)}(hj5h]hstruct blk_mq_hw_ctx *hctx}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj5ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj5ubj)}(hhh]h)}(h%Pointer to the hardware queue to run.h]h%Pointer to the hardware queue to run.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hM hj5ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1j`hj5hM hj5ubja)}(hP``unsigned long msecs`` Milliseconds of delay to wait before running the queue. h](jg)}(h``unsigned long msecs``h]jM)}(hj5h]hunsigned long msecs}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj5ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj5ubj)}(hhh]h)}(h7Milliseconds of delay to wait before running the queue.h]h7Milliseconds of delay to wait before running the queue.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hM hj5ubah}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]uh1j`hj5hM hj5ubeh}(h]h ]h"]h$]h&]uh1j[hjk5ubh)}(h**Description**h]jF)}(hj6h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj6ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjk5ubh)}(h>Run a hardware queue asynchronously with a delay of **msecs**.h](h4Run a hardware queue asynchronously with a delay of }(hj6hhhNhNubjF)}(h **msecs**h]hmsecs}(hj"6hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj6ubh.}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjk5ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_mq_run_hw_queue (C function)c.blk_mq_run_hw_queuehNtauh1jhjhhhNhNubj)}(hhh](j)}(hAvoid blk_mq_run_hw_queue (struct blk_mq_hw_ctx *hctx, bool async)h]j)}(h@void blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async)h](j~)}(hvoidh]hvoid}(hj[6hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hjW6hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM( ubj)}(h h]h }(hjj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjW6hhhji6hM( ubj)}(hblk_mq_run_hw_queueh]j)}(hblk_mq_run_hw_queueh]hblk_mq_run_hw_queue}(hj|6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx6ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjW6hhhji6hM( ubjR)}(h((struct blk_mq_hw_ctx *hctx, bool async)h](jX)}(hstruct blk_mq_hw_ctx *hctxh](j)}(hjh]hstruct}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubh)}(hhh]j)}(h blk_mq_hw_ctxh]h blk_mq_hw_ctx}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj6modnameN classnameNjj )}j#]j&)}jj~6sbc.blk_mq_run_hw_queueasbuh1hhj6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubj)}(hhctxh]hhctx}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj6ubjX)}(h bool asynch](j~)}(hjh]hbool}(hj 7hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj7ubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj)}(hasynch]hasync}(hj%7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj6ubeh}(h]h ]h"]h$]h&]hhuh1jQhjW6hhhji6hM( ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjS6hhhji6hM( ubah}(h]jN6ah ](j j eh"]h$]h&]jj)jhuh1jhji6hM( hjP6hhubj)}(hhh]h)}(hStart to run a hardware queue.h]hStart to run a hardware queue.}(hjO7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM( hjL7hhubah}(h]h ]h"]h$]h&]uh1jhjP6hhhji6hM( ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6jg7j7jg7j8j9j:uh1jhhhjhNhNubj<)}(hXG**Parameters** ``struct blk_mq_hw_ctx *hctx`` Pointer to the hardware queue to run. ``bool async`` If we want to run the queue asynchronously. **Description** Check if the request queue is not in a quiesced state and if there are pending requests to be sent. If this is true, run the queue to send requests to hardware.h](h)}(h**Parameters**h]jF)}(hjq7h]h Parameters}(hjs7hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjo7ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM, hjk7ubj\)}(hhh](ja)}(hE``struct blk_mq_hw_ctx *hctx`` Pointer to the hardware queue to run. h](jg)}(h``struct blk_mq_hw_ctx *hctx``h]jM)}(hj7h]hstruct blk_mq_hw_ctx *hctx}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj7ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM) hj7ubj)}(hhh]h)}(h%Pointer to the hardware queue to run.h]h%Pointer to the hardware queue to run.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hM) hj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1j`hj7hM) hj7ubja)}(h;``bool async`` If we want to run the queue asynchronously. h](jg)}(h``bool async``h]jM)}(hj7h]h bool async}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj7ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM* hj7ubj)}(hhh]h)}(h+If we want to run the queue asynchronously.h]h+If we want to run the queue asynchronously.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7hM* hj7ubah}(h]h ]h"]h$]h&]uh1jhj7ubeh}(h]h ]h"]h$]h&]uh1j`hj7hM* hj7ubeh}(h]h ]h"]h$]h&]uh1j[hjk7ubh)}(h**Description**h]jF)}(hj8h]h Description}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj8ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM, hjk7ubh)}(hCheck if the request queue is not in a quiesced state and if there are pending requests to be sent. If this is true, run the queue to send requests to hardware.h]hCheck if the request queue is not in a quiesced state and if there are pending requests to be sent. If this is true, run the queue to send requests to hardware.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM+ hjk7ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!blk_mq_run_hw_queues (C function)c.blk_mq_run_hw_queueshNtauh1jhjhhhNhNubj)}(hhh](j)}(h?void blk_mq_run_hw_queues (struct request_queue *q, bool async)h]j)}(h>void blk_mq_run_hw_queues(struct request_queue *q, bool async)h](j~)}(hvoidh]hvoid}(hjI8hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hjE8hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMm ubj)}(h h]h }(hjX8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE8hhhjW8hMm ubj)}(hblk_mq_run_hw_queuesh]j)}(hblk_mq_run_hw_queuesh]hblk_mq_run_hw_queues}(hjj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjf8ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjE8hhhjW8hMm ubjR)}(h%(struct request_queue *q, bool async)h](jX)}(hstruct request_queue *qh](j)}(hjh]hstruct}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubh)}(hhh]j)}(h request_queueh]h request_queue}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj8modnameN classnameNjj )}j#]j&)}jjl8sbc.blk_mq_run_hw_queuesasbuh1hhj8ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hjX(h]hq}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj~8ubjX)}(h bool asynch](j~)}(hjh]hbool}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj8ubj)}(h h]h }(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hasynch]hasync}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj~8ubeh}(h]h ]h"]h$]h&]hhuh1jQhjE8hhhjW8hMm ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjA8hhhjW8hMm ubah}(h]j<8ah ](j j eh"]h$]h&]jj)jhuh1jhjW8hMm hj>8hhubj)}(hhh]h)}(h+Run all hardware queues in a request queue.h]h+Run all hardware queues in a request queue.}(hj<9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMm hj99hhubah}(h]h ]h"]h$]h&]uh1jhj>8hhhjW8hMm ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6jT9j7jT9j8j9j:uh1jhhhjhNhNubj<)}(h**Parameters** ``struct request_queue *q`` Pointer to the request queue to run. ``bool async`` If we want to run the queue asynchronously.h](h)}(h**Parameters**h]jF)}(hj^9h]h Parameters}(hj`9hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj\9ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMq hjX9ubj\)}(hhh](ja)}(hA``struct request_queue *q`` Pointer to the request queue to run. h](jg)}(h``struct request_queue *q``h]jM)}(hj}9h]hstruct request_queue *q}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj{9ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMn hjw9ubj)}(hhh]h)}(h$Pointer to the request queue to run.h]h$Pointer to the request queue to run.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj9hMn hj9ubah}(h]h ]h"]h$]h&]uh1jhjw9ubeh}(h]h ]h"]h$]h&]uh1j`hj9hMn hjt9ubja)}(h:``bool async`` If we want to run the queue asynchronously.h](jg)}(h``bool async``h]jM)}(hj9h]h bool async}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj9ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMp hj9ubj)}(hhh]h)}(h+If we want to run the queue asynchronously.h]h+If we want to run the queue asynchronously.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMo hj9ubah}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ]h"]h$]h&]uh1j`hj9hMp hjt9ubeh}(h]h ]h"]h$]h&]uh1j[hjX9ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j'blk_mq_delay_run_hw_queues (C function)c.blk_mq_delay_run_hw_queueshNtauh1jhjhhhNhNubj)}(hhh](j)}(hNvoid blk_mq_delay_run_hw_queues (struct request_queue *q, unsigned long msecs)h]j)}(hMvoid blk_mq_delay_run_hw_queues(struct request_queue *q, unsigned long msecs)h](j~)}(hvoidh]hvoid}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj :hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj :hhhj:hM ubj)}(hblk_mq_delay_run_hw_queuesh]j)}(hblk_mq_delay_run_hw_queuesh]hblk_mq_delay_run_hw_queues}(hj1:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-:ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj :hhhj:hM ubjR)}(h.(struct request_queue *q, unsigned long msecs)h](jX)}(hstruct request_queue *qh](j)}(hjh]hstruct}(hjM:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI:ubj)}(h h]h }(hjZ:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI:ubh)}(hhh]j)}(h request_queueh]h request_queue}(hjk:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjh:ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjm:modnameN classnameNjj )}j#]j&)}jj3:sbc.blk_mq_delay_run_hw_queuesasbuh1hhjI:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI:ubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI:ubj)}(hjX(h]hq}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI:ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjE:ubjX)}(hunsigned long msecsh](j~)}(hunsignedh]hunsigned}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj~)}(hlongh]hlong}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hmsecsh]hmsecs}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjE:ubeh}(h]h ]h"]h$]h&]hhuh1jQhj :hhhj:hM ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj:hhhj:hM ubah}(h]j:ah ](j j eh"]h$]h&]jj)jhuh1jhj:hM hj:hhubj)}(hhh]h)}(h'Run all hardware queues asynchronously.h]h'Run all hardware queues asynchronously.}(hj ;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj;hhubah}(h]h ]h"]h$]h&]uh1jhj:hhhj:hM ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j8;j7j8;j8j9j:uh1jhhhjhNhNubj<)}(h**Parameters** ``struct request_queue *q`` Pointer to the request queue to run. ``unsigned long msecs`` Milliseconds of delay to wait before running the queues.h](h)}(h**Parameters**h]jF)}(hjB;h]h Parameters}(hjD;hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj@;ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj<;ubj\)}(hhh](ja)}(hA``struct request_queue *q`` Pointer to the request queue to run. h](jg)}(h``struct request_queue *q``h]jM)}(hja;h]hstruct request_queue *q}(hjc;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj_;ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj[;ubj)}(hhh]h)}(h$Pointer to the request queue to run.h]h$Pointer to the request queue to run.}(hjz;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjv;hM hjw;ubah}(h]h ]h"]h$]h&]uh1jhj[;ubeh}(h]h ]h"]h$]h&]uh1j`hjv;hM hjX;ubja)}(hP``unsigned long msecs`` Milliseconds of delay to wait before running the queues.h](jg)}(h``unsigned long msecs``h]jM)}(hj;h]hunsigned long msecs}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj;ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj;ubj)}(hhh]h)}(h8Milliseconds of delay to wait before running the queues.h]h8Milliseconds of delay to wait before running the queues.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj;ubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1j`hj;hM hjX;ubeh}(h]h ]h"]h$]h&]uh1j[hj<;ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j)blk_mq_request_bypass_insert (C function)c.blk_mq_request_bypass_inserthNtauh1jhjhhhNhNubj)}(hhh](j)}(hJvoid blk_mq_request_bypass_insert (struct request *rq, blk_insert_t flags)h]j)}(hIvoid blk_mq_request_bypass_insert(struct request *rq, blk_insert_t flags)h](j~)}(hvoidh]hvoid}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj;hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;hhhj<hM ubj)}(hblk_mq_request_bypass_inserth]j)}(hblk_mq_request_bypass_inserth]hblk_mq_request_bypass_insert}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj;hhhj<hM ubjR)}(h((struct request *rq, blk_insert_t flags)h](jX)}(hstruct request *rqh](j)}(hjh]hstruct}(hj1<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-<ubj)}(h h]h }(hj><hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-<ubh)}(hhh]j)}(hrequesth]hrequest}(hjO<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL<ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjQ<modnameN classnameNjj )}j#]j&)}jj<sbc.blk_mq_request_bypass_insertasbuh1hhj-<ubj)}(h h]h }(hjo<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-<ubj)}(hjh]h*}(hj}<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-<ubj)}(hrqh]hrq}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-<ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj)<ubjX)}(hblk_insert_t flagsh](h)}(hhh]j)}(h blk_insert_th]h blk_insert_t}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj<modnameN classnameNjj )}j#]jk<c.blk_mq_request_bypass_insertasbuh1hhj<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hflagsh]hflags}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj)<ubeh}(h]h ]h"]h$]h&]hhuh1jQhj;hhhj<hM ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj;hhhj<hM ubah}(h]j;ah ](j j eh"]h$]h&]jj)jhuh1jhj<hM hj;hhubj)}(hhh]h)}(h"Insert a request at dispatch list.h]h"Insert a request at dispatch list.}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj<hhubah}(h]h ]h"]h$]h&]uh1jhj;hhhj<hM ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j=j7j=j8j9j:uh1jhhhjhNhNubj<)}(h**Parameters** ``struct request *rq`` Pointer to request to be inserted. ``blk_insert_t flags`` BLK_MQ_INSERT_* **Description** Should only be used carefully, when the caller knows we want to bypass a potential IO scheduler on the target device.h](h)}(h**Parameters**h]jF)}(hj=h]h Parameters}(hj =hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj=ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj=ubj\)}(hhh](ja)}(h:``struct request *rq`` Pointer to request to be inserted. h](jg)}(h``struct request *rq``h]jM)}(hj==h]hstruct request *rq}(hj?=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj;=ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj7=ubj)}(hhh]h)}(h"Pointer to request to be inserted.h]h"Pointer to request to be inserted.}(hjV=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjR=hM hjS=ubah}(h]h ]h"]h$]h&]uh1jhj7=ubeh}(h]h ]h"]h$]h&]uh1j`hjR=hM hj4=ubja)}(h'``blk_insert_t flags`` BLK_MQ_INSERT_* h](jg)}(h``blk_insert_t flags``h]jM)}(hjv=h]hblk_insert_t flags}(hjx=hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjt=ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjp=ubj)}(hhh]h)}(hBLK_MQ_INSERT_*h]hBLK_MQ_INSERT_*}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj=hM hj=ubah}(h]h ]h"]h$]h&]uh1jhjp=ubeh}(h]h ]h"]h$]h&]uh1j`hj=hM hj4=ubeh}(h]h ]h"]h$]h&]uh1j[hj=ubh)}(h**Description**h]jF)}(hj=h]h Description}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj=ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj=ubh)}(huShould only be used carefully, when the caller knows we want to bypass a potential IO scheduler on the target device.h]huShould only be used carefully, when the caller knows we want to bypass a potential IO scheduler on the target device.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&blk_mq_try_issue_directly (C function)c.blk_mq_try_issue_directlyhNtauh1jhjhhhNhNubj)}(hhh](j)}(hOvoid blk_mq_try_issue_directly (struct blk_mq_hw_ctx *hctx, struct request *rq)h]j)}(hNvoid blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx, struct request *rq)h](j~)}(hvoidh]hvoid}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj=hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=hhhj>hM ubj)}(hblk_mq_try_issue_directlyh]j)}(hblk_mq_try_issue_directlyh]hblk_mq_try_issue_directly}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj=hhhj>hM ubjR)}(h0(struct blk_mq_hw_ctx *hctx, struct request *rq)h](jX)}(hstruct blk_mq_hw_ctx *hctxh](j)}(hjh]hstruct}(hj3>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/>ubj)}(h h]h }(hj@>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/>ubh)}(hhh]j)}(h blk_mq_hw_ctxh]h blk_mq_hw_ctx}(hjQ>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjN>ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjS>modnameN classnameNjj )}j#]j&)}jj>sbc.blk_mq_try_issue_directlyasbuh1hhj/>ubj)}(h h]h }(hjq>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/>ubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/>ubj)}(hhctxh]hhctx}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/>ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj+>ubjX)}(hstruct request *rqh](j)}(hjh]hstruct}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubh)}(hhh]j)}(hrequesth]hrequest}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj>modnameN classnameNjj )}j#]jm>c.blk_mq_try_issue_directlyasbuh1hhj>ubj)}(h h]h }(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hjh]h*}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubj)}(hrqh]hrq}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhj+>ubeh}(h]h ]h"]h$]h&]hhuh1jQhj=hhhj>hM ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj=hhhj>hM ubah}(h]j=ah ](j j eh"]h$]h&]jj)jhuh1jhj>hM hj=hhubj)}(hhh]h)}(h0Try to send a request directly to device driver.h]h0Try to send a request directly to device driver.}(hj&?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj#?hhubah}(h]h ]h"]h$]h&]uh1jhj=hhhj>hM ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j>?j7j>?j8j9j:uh1jhhhjhNhNubj<)}(hX**Parameters** ``struct blk_mq_hw_ctx *hctx`` Pointer of the associated hardware queue. ``struct request *rq`` Pointer to request to be sent. **Description** If the device has enough resources to accept a new request now, send the request directly to device driver. Else, insert at hctx->dispatch queue, so we can try send it another time in the future. Requests inserted at this queue have higher priority.h](h)}(h**Parameters**h]jF)}(hjH?h]h Parameters}(hjJ?hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjF?ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjB?ubj\)}(hhh](ja)}(hI``struct blk_mq_hw_ctx *hctx`` Pointer of the associated hardware queue. h](jg)}(h``struct blk_mq_hw_ctx *hctx``h]jM)}(hjg?h]hstruct blk_mq_hw_ctx *hctx}(hji?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhje?ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hja?ubj)}(hhh]h)}(h)Pointer of the associated hardware queue.h]h)Pointer of the associated hardware queue.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj|?hM hj}?ubah}(h]h ]h"]h$]h&]uh1jhja?ubeh}(h]h ]h"]h$]h&]uh1j`hj|?hM hj^?ubja)}(h6``struct request *rq`` Pointer to request to be sent. h](jg)}(h``struct request *rq``h]jM)}(hj?h]hstruct request *rq}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jLhj?ubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj?ubj)}(hhh]h)}(hPointer to request to be sent.h]hPointer to request to be sent.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj?hM hj?ubah}(h]h ]h"]h$]h&]uh1jhj?ubeh}(h]h ]h"]h$]h&]uh1j`hj?hM hj^?ubeh}(h]h ]h"]h$]h&]uh1j[hjB?ubh)}(h**Description**h]jF)}(hj?h]h Description}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj?ubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjB?ubh)}(hIf the device has enough resources to accept a new request now, send the request directly to device driver. Else, insert at hctx->dispatch queue, so we can try send it another time in the future. Requests inserted at this queue have higher priority.h]hIf the device has enough resources to accept a new request now, send the request directly to device driver. Else, insert at hctx->dispatch queue, so we can try send it another time in the future. Requests inserted at this queue have higher priority.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjB?ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_mq_submit_bio (C function)c.blk_mq_submit_biohNtauh1jhjhhhNhNubj)}(hhh](j)}(h(void blk_mq_submit_bio (struct bio *bio)h]j)}(h'void blk_mq_submit_bio(struct bio *bio)h](j~)}(hvoidh]hvoid}(hj @hhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj@hhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM9 ubj)}(h h]h }(hj/@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhj.@hM9 ubj)}(hblk_mq_submit_bioh]j)}(hblk_mq_submit_bioh]hblk_mq_submit_bio}(hjA@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=@ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj@hhhj.@hM9 ubjR)}(h(struct bio *bio)h]jX)}(hstruct bio *bioh](j)}(hjh]hstruct}(hj]@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY@ubj)}(h h]h }(hjj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY@ubh)}(hhh]j)}(hbioh]hbio}(hj{@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjx@ubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj}@modnameN classnameNjj )}j#]j&)}jjC@sbc.blk_mq_submit_bioasbuh1hhjY@ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY@ubj)}(hjh]h*}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY@ubj)}(hbioh]hbio}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY@ubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjU@ubah}(h]h ]h"]h$]h&]hhuh1jQhj@hhhj.@hM9 ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj@hhhj.@hM9 ubah}(h]j@ah ](j j eh"]h$]h&]jj)jhuh1jhj.@hM9 hj@hhubj)}(hhh]h)}(h*Create and send a request to block device.h]h*Create and send a request to block device.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM9 hj@hhubah}(h]h ]h"]h$]h&]uh1jhj@hhhj.@hM9 ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6j@j7j@j8j9j:uh1jhhhjhNhNubj<)}(hX**Parameters** ``struct bio *bio`` Bio pointer. **Description** Builds up a request structure from **q** and **bio** and send to the device. The request may not be queued directly to hardware if: * This request can be merged with another one * We want to place request at plug queue for possible future merging * There is an IO scheduler active at this queue It will not queue the request if there is an error with the bio, or at the request creation.h](h)}(h**Parameters**h]jF)}(hjAh]h Parameters}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjAubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM= hj@ubj\)}(hhh]ja)}(h!``struct bio *bio`` Bio pointer. h](jg)}(h``struct bio *bio``h]jM)}(hj!Ah]hstruct bio *bio}(hj#AhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjAubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM: hjAubj)}(hhh]h)}(h Bio pointer.h]h Bio pointer.}(hj:AhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6AhM: hj7Aubah}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ]h"]h$]h&]uh1j`hj6AhM: hjAubah}(h]h ]h"]h$]h&]uh1j[hj@ubh)}(h**Description**h]jF)}(hj\Ah]h Description}(hj^AhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjZAubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM< hj@ubh)}(hX&Builds up a request structure from **q** and **bio** and send to the device. The request may not be queued directly to hardware if: * This request can be merged with another one * We want to place request at plug queue for possible future merging * There is an IO scheduler active at this queueh](h#Builds up a request structure from }(hjrAhhhNhNubjF)}(h**q**h]hq}(hjzAhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjrAubh and }(hjrAhhhNhNubjF)}(h**bio**h]hbio}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjrAubh and send to the device. The request may not be queued directly to hardware if: * This request can be merged with another one * We want to place request at plug queue for possible future merging * There is an IO scheduler active at this queue}(hjrAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM; hj@ubh)}(h\It will not queue the request if there is an error with the bio, or at the request creation.h]h\It will not queue the request if there is an error with the bio, or at the request creation.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMA hj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j&blk_insert_cloned_request (C function)c.blk_insert_cloned_requesthNtauh1jhjhhhNhNubj)}(hhh](j)}(h;blk_status_t blk_insert_cloned_request (struct request *rq)h]j)}(h:blk_status_t blk_insert_cloned_request(struct request *rq)h](h)}(hhh]j)}(h blk_status_th]h blk_status_t}(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjAmodnameN classnameNjj )}j#]j&)}jblk_insert_cloned_requestsbc.blk_insert_cloned_requestasbuh1hhjAhhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM ubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAhhhjAhM ubj)}(hblk_insert_cloned_requesth]j)}(hjAh]hblk_insert_cloned_request}(hj BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjBubah}(h]h ](jjeh"]h$]h&]hhuh1jhjAhhhjAhM ubjR)}(h(struct request *rq)h]jX)}(hstruct request *rqh](j)}(hjh]hstruct}(hj&BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"Bubj)}(h h]h }(hj3BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"Bubh)}(hhh]j)}(hrequesth]hrequest}(hjDBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjABubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjFBmodnameN classnameNjj )}j#]jAc.blk_insert_cloned_requestasbuh1hhj"Bubj)}(h h]h }(hjbBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"Bubj)}(hjh]h*}(hjpBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"Bubj)}(hrqh]hrq}(hj}BhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"Bubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjBubah}(h]h ]h"]h$]h&]hhuh1jQhjAhhhjAhM ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjAhhhjAhM ubah}(h]jAah ](j j eh"]h$]h&]jj)jhuh1jhjAhM hjAhhubj)}(hhh]h)}(h/Helper for stacking drivers to submit a requesth]h/Helper for stacking drivers to submit a request}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjBhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjAhM ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6jBj7jBj8j9j:uh1jhhhjhNhNubj<)}(hA**Parameters** ``struct request *rq`` the request being queuedh](h)}(h**Parameters**h]jF)}(hjBh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjBubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjBubj\)}(hhh]ja)}(h/``struct request *rq`` the request being queuedh](jg)}(h``struct request *rq``h]jM)}(hjBh]hstruct request *rq}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjBubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjBubj)}(hhh]h)}(hthe request being queuedh]hthe request being queued}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjBubah}(h]h ]h"]h$]h&]uh1jhjBubeh}(h]h ]h"]h$]h&]uh1j`hjBhM hjBubah}(h]h ]h"]h$]h&]uh1j[hjBubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j blk_rq_unprep_clone (C function)c.blk_rq_unprep_clonehNtauh1jhjhhhNhNubj)}(hhh](j)}(h-void blk_rq_unprep_clone (struct request *rq)h]j)}(h,void blk_rq_unprep_clone(struct request *rq)h](j~)}(hvoidh]hvoid}(hjBChhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj>ChhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM ubj)}(h h]h }(hjQChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>ChhhjPChM ubj)}(hblk_rq_unprep_cloneh]j)}(hblk_rq_unprep_cloneh]hblk_rq_unprep_clone}(hjcChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_Cubah}(h]h ](jjeh"]h$]h&]hhuh1jhj>ChhhjPChM ubjR)}(h(struct request *rq)h]jX)}(hstruct request *rqh](j)}(hjh]hstruct}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{Cubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{Cubh)}(hhh]j)}(hrequesth]hrequest}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjCmodnameN classnameNjj )}j#]j&)}jjeCsbc.blk_rq_unprep_cloneasbuh1hhj{Cubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{Cubj)}(hjh]h*}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{Cubj)}(hrqh]hrq}(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{Cubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjwCubah}(h]h ]h"]h$]h&]hhuh1jQhj>ChhhjPChM ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj:ChhhjPChM ubah}(h]j5Cah ](j j eh"]h$]h&]jj)jhuh1jhjPChM hj7Chhubj)}(hhh]h)}(h4Helper function to free all bios in a cloned requesth]h4Helper function to free all bios in a cloned request}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjChhubah}(h]h ]h"]h$]h&]uh1jhj7ChhhjPChM ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6jDj7jDj8j9j:uh1jhhhjhNhNubj<)}(h**Parameters** ``struct request *rq`` the clone request to be cleaned up **Description** Free all bios in **rq** for a cloned request.h](h)}(h**Parameters**h]jF)}(hj$Dh]h Parameters}(hj&DhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj"Dubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjDubj\)}(hhh]ja)}(h:``struct request *rq`` the clone request to be cleaned up h](jg)}(h``struct request *rq``h]jM)}(hjCDh]hstruct request *rq}(hjEDhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjADubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj=Dubj)}(hhh]h)}(h"the clone request to be cleaned uph]h"the clone request to be cleaned up}(hj\DhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXDhM hjYDubah}(h]h ]h"]h$]h&]uh1jhj=Dubeh}(h]h ]h"]h$]h&]uh1j`hjXDhM hj:Dubah}(h]h ]h"]h$]h&]uh1j[hjDubh)}(h**Description**h]jF)}(hj~Dh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj|Dubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjDubj+)}(h-Free all bios in **rq** for a cloned request.h]h)}(hjDh](hFree all bios in }(hjDhhhNhNubjF)}(h**rq**h]hrq}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjDubh for a cloned request.}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjDubah}(h]h ]h"]h$]h&]uh1j+hjDhM hjDubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jblk_rq_prep_clone (C function)c.blk_rq_prep_clonehNtauh1jhjhhhNhNubj)}(hhh](j)}(hint blk_rq_prep_clone (struct request *rq, struct request *rq_src, struct bio_set *bs, gfp_t gfp_mask, int (*bio_ctr)(struct bio *, struct bio *, void *), void *data)h]j)}(hint blk_rq_prep_clone(struct request *rq, struct request *rq_src, struct bio_set *bs, gfp_t gfp_mask, int (*bio_ctr)(struct bio*, struct bio*, void*), void *data)h](j~)}(hinth]hint}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hjDhhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM ubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhjDhM ubj)}(hblk_rq_prep_cloneh]j)}(hblk_rq_prep_cloneh]hblk_rq_prep_clone}(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDubah}(h]h ](jjeh"]h$]h&]hhuh1jhjDhhhjDhM ubjR)}(h(struct request *rq, struct request *rq_src, struct bio_set *bs, gfp_t gfp_mask, int (*bio_ctr)(struct bio*, struct bio*, void*), void *data)h](jX)}(hstruct request *rqh](j)}(hjh]hstruct}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(h h]h }(hj(EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubh)}(hhh]j)}(hrequesth]hrequest}(hj9EhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6Eubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj;EmodnameN classnameNjj )}j#]j&)}jjEsbc.blk_rq_prep_cloneasbuh1hhjEubj)}(h h]h }(hjYEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hjh]h*}(hjgEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hrqh]hrq}(hjtEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjEubjX)}(hstruct request *rq_srch](j)}(hjh]hstruct}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubh)}(hhh]j)}(hrequesth]hrequest}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjEmodnameN classnameNjj )}j#]jUEc.blk_rq_prep_cloneasbuh1hhjEubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hjh]h*}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hrq_srch]hrq_src}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjEubjX)}(hstruct bio_set *bsh](j)}(hjh]hstruct}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(h h]h }(hj FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubh)}(hhh]j)}(hbio_seth]hbio_set}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjFmodnameN classnameNjj )}j#]jUEc.blk_rq_prep_cloneasbuh1hhjEubj)}(h h]h }(hj9FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hjh]h*}(hjGFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hbsh]hbs}(hjTFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjEubjX)}(hgfp_t gfp_maskh](h)}(hhh]j)}(hgfp_th]hgfp_t}(hjpFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmFubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjrFmodnameN classnameNjj )}j#]jUEc.blk_rq_prep_cloneasbuh1hhjiFubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiFubj)}(hgfp_maskh]hgfp_mask}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjiFubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjEubjX)}(h/int (*bio_ctr)(struct bio*, struct bio*, void*)h](j~)}(hinth]hint}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hjFubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hjh]h(}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hbio_ctrh]hbio_ctr}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hjh]h)}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hjh]h(}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hjh]hstruct}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(h h]h }(hj GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubh)}(hhh]j)}(hbioh]hbio}(hj1GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.Gubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetj3GmodnameN classnameNjj )}j#]jUEc.blk_rq_prep_cloneasbuh1hhjFubj)}(hjh]h*}(hjOGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(h,h]h,}(hj\GhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(h h]h }(hjjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hjh]hstruct}(hjxGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubh)}(hhh]j)}(hbioh]hbio}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjGmodnameN classnameNjj )}j#]jUEc.blk_rq_prep_cloneasbuh1hhjFubj)}(hjh]h*}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hj^Gh]h,}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj~)}(hvoidh]hvoid}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hjFubj)}(hjh]h*}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubj)}(hjh]h)}(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjEubjX)}(h void *datah](j~)}(hvoidh]hvoid}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hj Hubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Hubj)}(hjh]h*}(hj+HhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Hubj)}(hdatah]hdata}(hj8HhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj Hubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjEubeh}(h]h ]h"]h$]h&]hhuh1jQhjDhhhjDhM ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjDhhhjDhM ubah}(h]jDah ](j j eh"]h$]h&]jj)jhuh1jhjDhM hjDhhubj)}(hhh]h)}(h&Helper function to setup clone requesth]h&Helper function to setup clone request}(hjbHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj_Hhhubah}(h]h ]h"]h$]h&]uh1jhjDhhhjDhM ubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6jzHj7jzHj8j9j:uh1jhhhjhNhNubj<)}(hX1**Parameters** ``struct request *rq`` the request to be setup ``struct request *rq_src`` original request to be cloned ``struct bio_set *bs`` bio_set that bios for clone are allocated from ``gfp_t gfp_mask`` memory allocation mask for bio ``int (*bio_ctr)(struct bio *, struct bio *, void *)`` setup function to be called for each clone bio. Returns ``0`` for success, non ``0`` for failure. ``void *data`` private data to be passed to **bio_ctr** **Description** Clones bios in **rq_src** to **rq**, and copies attributes of **rq_src** to **rq**. Also, pages which the original bios are pointing to are not copied and the cloned bios just point same pages. So cloned bios must be completed before original bios, which means the caller must complete **rq** before **rq_src**.h](h)}(h**Parameters**h]jF)}(hjHh]h Parameters}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjHubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hj~Hubj\)}(hhh](ja)}(h/``struct request *rq`` the request to be setup h](jg)}(h``struct request *rq``h]jM)}(hjHh]hstruct request *rq}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjHubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjHubj)}(hhh]h)}(hthe request to be setuph]hthe request to be setup}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhM hjHubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1j`hjHhM hjHubja)}(h9``struct request *rq_src`` original request to be cloned h](jg)}(h``struct request *rq_src``h]jM)}(hjHh]hstruct request *rq_src}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjHubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjHubj)}(hhh]h)}(horiginal request to be clonedh]horiginal request to be cloned}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjHhM hjHubah}(h]h ]h"]h$]h&]uh1jhjHubeh}(h]h ]h"]h$]h&]uh1j`hjHhM hjHubja)}(hF``struct bio_set *bs`` bio_set that bios for clone are allocated from h](jg)}(h``struct bio_set *bs``h]jM)}(hjIh]hstruct bio_set *bs}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjIubj)}(hhh]h)}(h.bio_set that bios for clone are allocated fromh]h.bio_set that bios for clone are allocated from}(hj.IhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*IhM hj+Iubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1j`hj*IhM hjHubja)}(h2``gfp_t gfp_mask`` memory allocation mask for bio h](jg)}(h``gfp_t gfp_mask``h]jM)}(hjNIh]hgfp_t gfp_mask}(hjPIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjLIubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjHIubj)}(hhh]h)}(hmemory allocation mask for bioh]hmemory allocation mask for bio}(hjgIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjcIhM hjdIubah}(h]h ]h"]h$]h&]uh1jhjHIubeh}(h]h ]h"]h$]h&]uh1j`hjcIhM hjHubja)}(h``int (*bio_ctr)(struct bio *, struct bio *, void *)`` setup function to be called for each clone bio. Returns ``0`` for success, non ``0`` for failure. h](jg)}(h6``int (*bio_ctr)(struct bio *, struct bio *, void *)``h]jM)}(hjIh]h2int (*bio_ctr)(struct bio *, struct bio *, void *)}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjIubj)}(hhh]h)}(hasetup function to be called for each clone bio. Returns ``0`` for success, non ``0`` for failure.h](h8setup function to be called for each clone bio. Returns }(hjIhhhNhNubjM)}(h``0``h]h0}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIubh for success, non }(hjIhhhNhNubjM)}(h``0``h]h0}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIubh for failure.}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjIubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1j`hjIhM hjHubja)}(h8``void *data`` private data to be passed to **bio_ctr** h](jg)}(h``void *data``h]jM)}(hjIh]h void *data}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjIubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM hjIubj)}(hhh]h)}(h(private data to be passed to **bio_ctr**h](hprivate data to be passed to }(hjIhhhNhNubjF)}(h **bio_ctr**h]hbio_ctr}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjIubeh}(h]h ]h"]h$]h&]uh1hhjIhM hjIubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]uh1j`hjIhM hjHubeh}(h]h ]h"]h$]h&]uh1j[hj~Hubh)}(h**Description**h]jF)}(hj.Jh]h Description}(hj0JhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj,Jubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM! hj~Hubj+)}(hX7Clones bios in **rq_src** to **rq**, and copies attributes of **rq_src** to **rq**. Also, pages which the original bios are pointing to are not copied and the cloned bios just point same pages. So cloned bios must be completed before original bios, which means the caller must complete **rq** before **rq_src**.h]h)}(hX7Clones bios in **rq_src** to **rq**, and copies attributes of **rq_src** to **rq**. Also, pages which the original bios are pointing to are not copied and the cloned bios just point same pages. So cloned bios must be completed before original bios, which means the caller must complete **rq** before **rq_src**.h](hClones bios in }(hjHJhhhNhNubjF)}(h **rq_src**h]hrq_src}(hjPJhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjHJubh to }(hjHJhhhNhNubjF)}(h**rq**h]hrq}(hjbJhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjHJubh, and copies attributes of }(hjHJhhhNhNubjF)}(h **rq_src**h]hrq_src}(hjtJhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjHJubh to }hjHJsbjF)}(h**rq**h]hrq}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjHJubh. Also, pages which the original bios are pointing to are not copied and the cloned bios just point same pages. So cloned bios must be completed before original bios, which means the caller must complete }(hjHJhhhNhNubjF)}(h**rq**h]hrq}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjHJubh before }(hjHJhhhNhNubjF)}(h **rq_src**h]hrq_src}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjHJubh.}(hjHJhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chM! hjDJubah}(h]h ]h"]h$]h&]uh1j+hjJhM! hj~Hubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!blk_mq_destroy_queue (C function)c.blk_mq_destroy_queuehNtauh1jhjhhhNhNubj)}(hhh](j)}(h3void blk_mq_destroy_queue (struct request_queue *q)h]j)}(h2void blk_mq_destroy_queue(struct request_queue *q)h](j~)}(hvoidh]hvoid}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1j}hjJhhhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMpubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjJhhhjJhMpubj)}(hblk_mq_destroy_queueh]j)}(hblk_mq_destroy_queueh]hblk_mq_destroy_queue}(hj KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ](jjeh"]h$]h&]hhuh1jhjJhhhjJhMpubjR)}(h(struct request_queue *q)h]jX)}(hstruct request_queue *qh](j)}(hjh]hstruct}(hj&KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"Kubj)}(h h]h }(hj3KhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"Kubh)}(hhh]j)}(h request_queueh]h request_queue}(hjDKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAKubah}(h]h ]h"]h$]h&] refdomainj0reftypej reftargetjFKmodnameN classnameNjj )}j#]j&)}jj Ksbc.blk_mq_destroy_queueasbuh1hhj"Kubj)}(h h]h }(hjdKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"Kubj)}(hjh]h*}(hjrKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"Kubj)}(hjX(h]hq}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"Kubeh}(h]h ]h"]h$]h&]noemphhhuh1jWhjKubah}(h]h ]h"]h$]h&]hhuh1jQhjJhhhjJhMpubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjJhhhjJhMpubah}(h]jJah ](j j eh"]h$]h&]jj)jhuh1jhjJhMphjJhhubj)}(hhh]h)}(hshutdown a request queueh]hshutdown a request queue}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMphjKhhubah}(h]h ]h"]h$]h&]uh1jhjJhhhjJhMpubeh}(h]h ](j0functioneh"]h$]h&]j5j0j6jKj7jKj8j9j:uh1jhhhjhNhNubj<)}(hXP**Parameters** ``struct request_queue *q`` request queue to shutdown **Description** This shuts down a request queue allocated by blk_mq_alloc_queue(). All future requests will be failed with -ENODEV. The caller is responsible for dropping the reference from blk_mq_alloc_queue() by calling blk_put_queue(). **Context** can sleeph](h)}(h**Parameters**h]jF)}(hjKh]h Parameters}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjKubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMthjKubj\)}(hhh]ja)}(h6``struct request_queue *q`` request queue to shutdown h](jg)}(h``struct request_queue *q``h]jM)}(hjKh]hstruct request_queue *q}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jLhjKubah}(h]h ]h"]h$]h&]uh1jfhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMqhjKubj)}(hhh]h)}(hrequest queue to shutdownh]hrequest queue to shutdown}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjKhMqhjKubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1j`hjKhMqhjKubah}(h]h ]h"]h$]h&]uh1j[hjKubh)}(h**Description**h]jF)}(hj$Lh]h Description}(hj&LhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhj"Lubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMshjKubh)}(hThis shuts down a request queue allocated by blk_mq_alloc_queue(). All future requests will be failed with -ENODEV. The caller is responsible for dropping the reference from blk_mq_alloc_queue() by calling blk_put_queue().h]hThis shuts down a request queue allocated by blk_mq_alloc_queue(). All future requests will be failed with -ENODEV. The caller is responsible for dropping the reference from blk_mq_alloc_queue() by calling blk_put_queue().}(hj:LhhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMrhjKubh)}(h **Context**h]jF)}(hjKLh]hContext}(hjMLhhhNhNubah}(h]h ]h"]h$]h&]uh1jEhjILubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMvhjKubh)}(h can sleeph]h can sleep}(hjaLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhL/var/lib/git/docbuild/linux/Documentation/block/blk-mq:153: ./block/blk-mq.chMwhjKubeh}(h]h ] kernelindentah"]h$]h&]uh1j;hjhhhNhNubeh}(h]source-code-documentationah ]h"]source code documentationah$]h&]uh1hhhhhhhhKubeh}(h].multi-queue-block-io-queueing-mechanism-blk-mqah ]h"]0multi-queue block io queueing mechanism (blk-mq)ah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjLerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames} operation]j5asrefids}nameids}(jLjLjjjWjTjjFj"jjjjjjjjjjj}jjj2j/jcj`j|LjyLu nametypes}(jLjjWjj"jjjjjjj2jcj|Luh}(jLhjhjThjFjZjjjjjjjj%jjj}jjjj/j)j`jZjyLjjjjjj> jC jjjxj}jjjjjjjpjuj+!j0!j"j"j$j$j2&j7&j'j'j4)j9)j,j,jD.jI.j/j/j1j2j14j64jN6jS6j<8jA8j:j:j;j;j=j=j@j@jAjAj5Cj:CjDjDjJjJu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.