LCOV - code coverage report
Current view: top level - include/linux - blk-mq.h (source / functions) Hit Total Coverage
Test: Real Lines: 4 5 80.0 %
Date: 2020-10-17 15:46:16 Functions: 0 0 -
Legend: Neither, QEMU, Real, Both Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0 */
       2                 :            : #ifndef BLK_MQ_H
       3                 :            : #define BLK_MQ_H
       4                 :            : 
       5                 :            : #include <linux/blkdev.h>
       6                 :            : #include <linux/sbitmap.h>
       7                 :            : #include <linux/srcu.h>
       8                 :            : 
       9                 :            : struct blk_mq_tags;
      10                 :            : struct blk_flush_queue;
      11                 :            : 
      12                 :            : /**
      13                 :            :  * struct blk_mq_hw_ctx - State for a hardware queue facing the hardware block device
      14                 :            :  */
      15                 :            : struct blk_mq_hw_ctx {
      16                 :            :         struct {
      17                 :            :                 spinlock_t              lock;
      18                 :            :                 struct list_head        dispatch;
      19                 :            :                 unsigned long           state;          /* BLK_MQ_S_* flags */
      20                 :            :         } ____cacheline_aligned_in_smp;
      21                 :            : 
      22                 :            :         struct delayed_work     run_work;
      23                 :            :         cpumask_var_t           cpumask;
      24                 :            :         int                     next_cpu;
      25                 :            :         int                     next_cpu_batch;
      26                 :            : 
      27                 :            :         unsigned long           flags;          /* BLK_MQ_F_* flags */
      28                 :            : 
      29                 :            :         void                    *sched_data;
      30                 :            :         struct request_queue    *queue;
      31                 :            :         struct blk_flush_queue  *fq;
      32                 :            : 
      33                 :            :         void                    *driver_data;
      34                 :            : 
      35                 :            :         struct sbitmap          ctx_map;
      36                 :            : 
      37                 :            :         struct blk_mq_ctx       *dispatch_from;
      38                 :            :         unsigned int            dispatch_busy;
      39                 :            : 
      40                 :            :         unsigned short          type;
      41                 :            :         unsigned short          nr_ctx;
      42                 :            :         struct blk_mq_ctx       **ctxs;
      43                 :            : 
      44                 :            :         spinlock_t              dispatch_wait_lock;
      45                 :            :         wait_queue_entry_t      dispatch_wait;
      46                 :            :         atomic_t                wait_index;
      47                 :            : 
      48                 :            :         struct blk_mq_tags      *tags;
      49                 :            :         struct blk_mq_tags      *sched_tags;
      50                 :            : 
      51                 :            :         unsigned long           queued;
      52                 :            :         unsigned long           run;
      53                 :            : #define BLK_MQ_MAX_DISPATCH_ORDER       7
      54                 :            :         unsigned long           dispatched[BLK_MQ_MAX_DISPATCH_ORDER];
      55                 :            : 
      56                 :            :         unsigned int            numa_node;
      57                 :            :         unsigned int            queue_num;
      58                 :            : 
      59                 :            :         atomic_t                nr_active;
      60                 :            : 
      61                 :            :         struct hlist_node       cpuhp_dead;
      62                 :            :         struct kobject          kobj;
      63                 :            : 
      64                 :            :         unsigned long           poll_considered;
      65                 :            :         unsigned long           poll_invoked;
      66                 :            :         unsigned long           poll_success;
      67                 :            : 
      68                 :            : #ifdef CONFIG_BLK_DEBUG_FS
      69                 :            :         struct dentry           *debugfs_dir;
      70                 :            :         struct dentry           *sched_debugfs_dir;
      71                 :            : #endif
      72                 :            : 
      73                 :            :         struct list_head        hctx_list;
      74                 :            : 
      75                 :            :         /* Must be the last member - see also blk_mq_hw_ctx_size(). */
      76                 :            :         struct srcu_struct      srcu[0];
      77                 :            : };
      78                 :            : 
      79                 :            : struct blk_mq_queue_map {
      80                 :            :         unsigned int *mq_map;
      81                 :            :         unsigned int nr_queues;
      82                 :            :         unsigned int queue_offset;
      83                 :            : };
      84                 :            : 
      85                 :            : enum hctx_type {
      86                 :            :         HCTX_TYPE_DEFAULT,      /* all I/O not otherwise accounted for */
      87                 :            :         HCTX_TYPE_READ,         /* just for READ I/O */
      88                 :            :         HCTX_TYPE_POLL,         /* polled I/O of any kind */
      89                 :            : 
      90                 :            :         HCTX_MAX_TYPES,
      91                 :            : };
      92                 :            : 
      93                 :            : struct blk_mq_tag_set {
      94                 :            :         /*
      95                 :            :          * map[] holds ctx -> hctx mappings, one map exists for each type
      96                 :            :          * that the driver wishes to support. There are no restrictions
      97                 :            :          * on maps being of the same size, and it's perfectly legal to
      98                 :            :          * share maps between types.
      99                 :            :          */
     100                 :            :         struct blk_mq_queue_map map[HCTX_MAX_TYPES];
     101                 :            :         unsigned int            nr_maps;        /* nr entries in map[] */
     102                 :            :         const struct blk_mq_ops *ops;
     103                 :            :         unsigned int            nr_hw_queues;   /* nr hw queues across maps */
     104                 :            :         unsigned int            queue_depth;    /* max hw supported */
     105                 :            :         unsigned int            reserved_tags;
     106                 :            :         unsigned int            cmd_size;       /* per-request extra data */
     107                 :            :         int                     numa_node;
     108                 :            :         unsigned int            timeout;
     109                 :            :         unsigned int            flags;          /* BLK_MQ_F_* */
     110                 :            :         void                    *driver_data;
     111                 :            : 
     112                 :            :         struct blk_mq_tags      **tags;
     113                 :            : 
     114                 :            :         struct mutex            tag_list_lock;
     115                 :            :         struct list_head        tag_list;
     116                 :            : };
     117                 :            : 
     118                 :            : struct blk_mq_queue_data {
     119                 :            :         struct request *rq;
     120                 :            :         bool last;
     121                 :            : };
     122                 :            : 
     123                 :            : typedef blk_status_t (queue_rq_fn)(struct blk_mq_hw_ctx *,
     124                 :            :                 const struct blk_mq_queue_data *);
     125                 :            : typedef void (commit_rqs_fn)(struct blk_mq_hw_ctx *);
     126                 :            : typedef bool (get_budget_fn)(struct blk_mq_hw_ctx *);
     127                 :            : typedef void (put_budget_fn)(struct blk_mq_hw_ctx *);
     128                 :            : typedef enum blk_eh_timer_return (timeout_fn)(struct request *, bool);
     129                 :            : typedef int (init_hctx_fn)(struct blk_mq_hw_ctx *, void *, unsigned int);
     130                 :            : typedef void (exit_hctx_fn)(struct blk_mq_hw_ctx *, unsigned int);
     131                 :            : typedef int (init_request_fn)(struct blk_mq_tag_set *set, struct request *,
     132                 :            :                 unsigned int, unsigned int);
     133                 :            : typedef void (exit_request_fn)(struct blk_mq_tag_set *set, struct request *,
     134                 :            :                 unsigned int);
     135                 :            : 
     136                 :            : typedef bool (busy_iter_fn)(struct blk_mq_hw_ctx *, struct request *, void *,
     137                 :            :                 bool);
     138                 :            : typedef bool (busy_tag_iter_fn)(struct request *, void *, bool);
     139                 :            : typedef int (poll_fn)(struct blk_mq_hw_ctx *);
     140                 :            : typedef int (map_queues_fn)(struct blk_mq_tag_set *set);
     141                 :            : typedef bool (busy_fn)(struct request_queue *);
     142                 :            : typedef void (complete_fn)(struct request *);
     143                 :            : typedef void (cleanup_rq_fn)(struct request *);
     144                 :            : 
     145                 :            : 
     146                 :            : struct blk_mq_ops {
     147                 :            :         /*
     148                 :            :          * Queue request
     149                 :            :          */
     150                 :            :         queue_rq_fn             *queue_rq;
     151                 :            : 
     152                 :            :         /*
     153                 :            :          * If a driver uses bd->last to judge when to submit requests to
     154                 :            :          * hardware, it must define this function. In case of errors that
     155                 :            :          * make us stop issuing further requests, this hook serves the
     156                 :            :          * purpose of kicking the hardware (which the last request otherwise
     157                 :            :          * would have done).
     158                 :            :          */
     159                 :            :         commit_rqs_fn           *commit_rqs;
     160                 :            : 
     161                 :            :         /*
     162                 :            :          * Reserve budget before queue request, once .queue_rq is
     163                 :            :          * run, it is driver's responsibility to release the
     164                 :            :          * reserved budget. Also we have to handle failure case
     165                 :            :          * of .get_budget for avoiding I/O deadlock.
     166                 :            :          */
     167                 :            :         get_budget_fn           *get_budget;
     168                 :            :         put_budget_fn           *put_budget;
     169                 :            : 
     170                 :            :         /*
     171                 :            :          * Called on request timeout
     172                 :            :          */
     173                 :            :         timeout_fn              *timeout;
     174                 :            : 
     175                 :            :         /*
     176                 :            :          * Called to poll for completion of a specific tag.
     177                 :            :          */
     178                 :            :         poll_fn                 *poll;
     179                 :            : 
     180                 :            :         complete_fn             *complete;
     181                 :            : 
     182                 :            :         /*
     183                 :            :          * Called when the block layer side of a hardware queue has been
     184                 :            :          * set up, allowing the driver to allocate/init matching structures.
     185                 :            :          * Ditto for exit/teardown.
     186                 :            :          */
     187                 :            :         init_hctx_fn            *init_hctx;
     188                 :            :         exit_hctx_fn            *exit_hctx;
     189                 :            : 
     190                 :            :         /*
     191                 :            :          * Called for every command allocated by the block layer to allow
     192                 :            :          * the driver to set up driver specific data.
     193                 :            :          *
     194                 :            :          * Tag greater than or equal to queue_depth is for setting up
     195                 :            :          * flush request.
     196                 :            :          *
     197                 :            :          * Ditto for exit/teardown.
     198                 :            :          */
     199                 :            :         init_request_fn         *init_request;
     200                 :            :         exit_request_fn         *exit_request;
     201                 :            :         /* Called from inside blk_get_request() */
     202                 :            :         void (*initialize_rq_fn)(struct request *rq);
     203                 :            : 
     204                 :            :         /*
     205                 :            :          * Called before freeing one request which isn't completed yet,
     206                 :            :          * and usually for freeing the driver private data
     207                 :            :          */
     208                 :            :         cleanup_rq_fn           *cleanup_rq;
     209                 :            : 
     210                 :            :         /*
     211                 :            :          * If set, returns whether or not this queue currently is busy
     212                 :            :          */
     213                 :            :         busy_fn                 *busy;
     214                 :            : 
     215                 :            :         map_queues_fn           *map_queues;
     216                 :            : 
     217                 :            : #ifdef CONFIG_BLK_DEBUG_FS
     218                 :            :         /*
     219                 :            :          * Used by the debugfs implementation to show driver-specific
     220                 :            :          * information about a request.
     221                 :            :          */
     222                 :            :         void (*show_rq)(struct seq_file *m, struct request *rq);
     223                 :            : #endif
     224                 :            : };
     225                 :            : 
     226                 :            : enum {
     227                 :            :         BLK_MQ_F_SHOULD_MERGE   = 1 << 0,
     228                 :            :         BLK_MQ_F_TAG_SHARED     = 1 << 1,
     229                 :            :         BLK_MQ_F_BLOCKING       = 1 << 5,
     230                 :            :         BLK_MQ_F_NO_SCHED       = 1 << 6,
     231                 :            :         BLK_MQ_F_ALLOC_POLICY_START_BIT = 8,
     232                 :            :         BLK_MQ_F_ALLOC_POLICY_BITS = 1,
     233                 :            : 
     234                 :            :         BLK_MQ_S_STOPPED        = 0,
     235                 :            :         BLK_MQ_S_TAG_ACTIVE     = 1,
     236                 :            :         BLK_MQ_S_SCHED_RESTART  = 2,
     237                 :            : 
     238                 :            :         BLK_MQ_MAX_DEPTH        = 10240,
     239                 :            : 
     240                 :            :         BLK_MQ_CPU_WORK_BATCH   = 8,
     241                 :            : };
     242                 :            : #define BLK_MQ_FLAG_TO_ALLOC_POLICY(flags) \
     243                 :            :         ((flags >> BLK_MQ_F_ALLOC_POLICY_START_BIT) & \
     244                 :            :                 ((1 << BLK_MQ_F_ALLOC_POLICY_BITS) - 1))
     245                 :            : #define BLK_ALLOC_POLICY_TO_MQ_FLAG(policy) \
     246                 :            :         ((policy & ((1 << BLK_MQ_F_ALLOC_POLICY_BITS) - 1)) \
     247                 :            :                 << BLK_MQ_F_ALLOC_POLICY_START_BIT)
     248                 :            : 
     249                 :            : struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *);
     250                 :            : struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
     251                 :            :                                                   struct request_queue *q,
     252                 :            :                                                   bool elevator_init);
     253                 :            : struct request_queue *blk_mq_init_sq_queue(struct blk_mq_tag_set *set,
     254                 :            :                                                 const struct blk_mq_ops *ops,
     255                 :            :                                                 unsigned int queue_depth,
     256                 :            :                                                 unsigned int set_flags);
     257                 :            : void blk_mq_unregister_dev(struct device *, struct request_queue *);
     258                 :            : 
     259                 :            : int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set);
     260                 :            : void blk_mq_free_tag_set(struct blk_mq_tag_set *set);
     261                 :            : 
     262                 :            : void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule);
     263                 :            : 
     264                 :            : void blk_mq_free_request(struct request *rq);
     265                 :            : bool blk_mq_can_queue(struct blk_mq_hw_ctx *);
     266                 :            : 
     267                 :            : bool blk_mq_queue_inflight(struct request_queue *q);
     268                 :            : 
     269                 :            : enum {
     270                 :            :         /* return when out of requests */
     271                 :            :         BLK_MQ_REQ_NOWAIT       = (__force blk_mq_req_flags_t)(1 << 0),
     272                 :            :         /* allocate from reserved pool */
     273                 :            :         BLK_MQ_REQ_RESERVED     = (__force blk_mq_req_flags_t)(1 << 1),
     274                 :            :         /* allocate internal/sched tag */
     275                 :            :         BLK_MQ_REQ_INTERNAL     = (__force blk_mq_req_flags_t)(1 << 2),
     276                 :            :         /* set RQF_PREEMPT */
     277                 :            :         BLK_MQ_REQ_PREEMPT      = (__force blk_mq_req_flags_t)(1 << 3),
     278                 :            : };
     279                 :            : 
     280                 :            : struct request *blk_mq_alloc_request(struct request_queue *q, unsigned int op,
     281                 :            :                 blk_mq_req_flags_t flags);
     282                 :            : struct request *blk_mq_alloc_request_hctx(struct request_queue *q,
     283                 :            :                 unsigned int op, blk_mq_req_flags_t flags,
     284                 :            :                 unsigned int hctx_idx);
     285                 :            : struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag);
     286                 :            : 
     287                 :            : enum {
     288                 :            :         BLK_MQ_UNIQUE_TAG_BITS = 16,
     289                 :            :         BLK_MQ_UNIQUE_TAG_MASK = (1 << BLK_MQ_UNIQUE_TAG_BITS) - 1,
     290                 :            : };
     291                 :            : 
     292                 :            : u32 blk_mq_unique_tag(struct request *rq);
     293                 :            : 
     294                 :            : static inline u16 blk_mq_unique_tag_to_hwq(u32 unique_tag)
     295                 :            : {
     296                 :            :         return unique_tag >> BLK_MQ_UNIQUE_TAG_BITS;
     297                 :            : }
     298                 :            : 
     299                 :            : static inline u16 blk_mq_unique_tag_to_tag(u32 unique_tag)
     300                 :            : {
     301                 :            :         return unique_tag & BLK_MQ_UNIQUE_TAG_MASK;
     302                 :            : }
     303                 :            : 
     304                 :            : 
     305                 :            : int blk_mq_request_started(struct request *rq);
     306                 :            : int blk_mq_request_completed(struct request *rq);
     307                 :            : void blk_mq_start_request(struct request *rq);
     308                 :            : void blk_mq_end_request(struct request *rq, blk_status_t error);
     309                 :            : void __blk_mq_end_request(struct request *rq, blk_status_t error);
     310                 :            : 
     311                 :            : void blk_mq_requeue_request(struct request *rq, bool kick_requeue_list);
     312                 :            : void blk_mq_kick_requeue_list(struct request_queue *q);
     313                 :            : void blk_mq_delay_kick_requeue_list(struct request_queue *q, unsigned long msecs);
     314                 :            : bool blk_mq_complete_request(struct request *rq);
     315                 :            : bool blk_mq_bio_list_merge(struct request_queue *q, struct list_head *list,
     316                 :            :                            struct bio *bio, unsigned int nr_segs);
     317                 :            : bool blk_mq_queue_stopped(struct request_queue *q);
     318                 :            : void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx);
     319                 :            : void blk_mq_start_hw_queue(struct blk_mq_hw_ctx *hctx);
     320                 :            : void blk_mq_stop_hw_queues(struct request_queue *q);
     321                 :            : void blk_mq_start_hw_queues(struct request_queue *q);
     322                 :            : void blk_mq_start_stopped_hw_queue(struct blk_mq_hw_ctx *hctx, bool async);
     323                 :            : void blk_mq_start_stopped_hw_queues(struct request_queue *q, bool async);
     324                 :            : void blk_mq_quiesce_queue(struct request_queue *q);
     325                 :            : void blk_mq_unquiesce_queue(struct request_queue *q);
     326                 :            : void blk_mq_delay_run_hw_queue(struct blk_mq_hw_ctx *hctx, unsigned long msecs);
     327                 :            : bool blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async);
     328                 :            : void blk_mq_run_hw_queues(struct request_queue *q, bool async);
     329                 :            : void blk_mq_tagset_busy_iter(struct blk_mq_tag_set *tagset,
     330                 :            :                 busy_tag_iter_fn *fn, void *priv);
     331                 :            : void blk_mq_tagset_wait_completed_request(struct blk_mq_tag_set *tagset);
     332                 :            : void blk_mq_freeze_queue(struct request_queue *q);
     333                 :            : void blk_mq_unfreeze_queue(struct request_queue *q);
     334                 :            : void blk_freeze_queue_start(struct request_queue *q);
     335                 :            : void blk_mq_freeze_queue_wait(struct request_queue *q);
     336                 :            : int blk_mq_freeze_queue_wait_timeout(struct request_queue *q,
     337                 :            :                                      unsigned long timeout);
     338                 :            : 
     339                 :            : int blk_mq_map_queues(struct blk_mq_queue_map *qmap);
     340                 :            : void blk_mq_update_nr_hw_queues(struct blk_mq_tag_set *set, int nr_hw_queues);
     341                 :            : 
     342                 :            : void blk_mq_quiesce_queue_nowait(struct request_queue *q);
     343                 :            : 
     344                 :            : unsigned int blk_mq_rq_cpu(struct request *rq);
     345                 :            : 
     346                 :            : /*
     347                 :            :  * Driver command data is immediately after the request. So subtract request
     348                 :            :  * size to get back to the original request, add request size to get the PDU.
     349                 :            :  */
     350                 :            : static inline struct request *blk_mq_rq_from_pdu(void *pdu)
     351                 :            : {
     352                 :          3 :         return pdu - sizeof(struct request);
     353                 :            : }
     354                 :            : static inline void *blk_mq_rq_to_pdu(struct request *rq)
     355                 :            : {
     356                 :          3 :         return rq + 1;
     357                 :            : }
     358                 :            : 
     359                 :            : #define queue_for_each_hw_ctx(q, hctx, i)                               \
     360                 :            :         for ((i) = 0; (i) < (q)->nr_hw_queues &&                  \
     361                 :            :              ({ hctx = (q)->queue_hw_ctx[i]; 1; }); (i)++)
     362                 :            : 
     363                 :            : #define hctx_for_each_ctx(hctx, ctx, i)                                 \
     364                 :            :         for ((i) = 0; (i) < (hctx)->nr_ctx &&                             \
     365                 :            :              ({ ctx = (hctx)->ctxs[(i)]; 1; }); (i)++)
     366                 :            : 
     367                 :            : static inline blk_qc_t request_to_qc_t(struct blk_mq_hw_ctx *hctx,
     368                 :            :                 struct request *rq)
     369                 :            : {
     370                 :          3 :         if (rq->tag != -1)
     371                 :          0 :                 return rq->tag | (hctx->queue_num << BLK_QC_T_SHIFT);
     372                 :            : 
     373                 :          3 :         return rq->internal_tag | (hctx->queue_num << BLK_QC_T_SHIFT) |
     374                 :            :                         BLK_QC_T_INTERNAL;
     375                 :            : }
     376                 :            : 
     377                 :            : static inline void blk_mq_cleanup_rq(struct request *rq)
     378                 :            : {
     379                 :            :         if (rq->q->mq_ops->cleanup_rq)
     380                 :            :                 rq->q->mq_ops->cleanup_rq(rq);
     381                 :            : }
     382                 :            : 
     383                 :            : #endif
    

Generated by: LCOV version 1.14