Merge branch 'for-4.9/block-smp' of git://git.kernel.dk/linux-block
[cascardo/linux.git] / include / linux / blk-mq.h
index e43bbff..535ab2e 100644 (file)
@@ -2,31 +2,19 @@
 #define BLK_MQ_H
 
 #include <linux/blkdev.h>
+#include <linux/sbitmap.h>
 
 struct blk_mq_tags;
 struct blk_flush_queue;
 
-struct blk_mq_cpu_notifier {
-       struct list_head list;
-       void *data;
-       int (*notify)(void *data, unsigned long action, unsigned int cpu);
-};
-
-struct blk_mq_ctxmap {
-       unsigned int size;
-       unsigned int bits_per_word;
-       struct blk_align_bitmap *map;
-};
-
 struct blk_mq_hw_ctx {
        struct {
                spinlock_t              lock;
                struct list_head        dispatch;
+               unsigned long           state;          /* BLK_MQ_S_* flags */
        } ____cacheline_aligned_in_smp;
 
-       unsigned long           state;          /* BLK_MQ_S_* flags */
-       struct delayed_work     run_work;
-       struct delayed_work     delay_work;
+       struct work_struct      run_work;
        cpumask_var_t           cpumask;
        int                     next_cpu;
        int                     next_cpu_batch;
@@ -38,10 +26,10 @@ struct blk_mq_hw_ctx {
 
        void                    *driver_data;
 
-       struct blk_mq_ctxmap    ctx_map;
+       struct sbitmap          ctx_map;
 
-       unsigned int            nr_ctx;
        struct blk_mq_ctx       **ctxs;
+       unsigned int            nr_ctx;
 
        atomic_t                wait_index;
 
@@ -49,7 +37,7 @@ struct blk_mq_hw_ctx {
 
        unsigned long           queued;
        unsigned long           run;
-#define BLK_MQ_MAX_DISPATCH_ORDER      10
+#define BLK_MQ_MAX_DISPATCH_ORDER      7
        unsigned long           dispatched[BLK_MQ_MAX_DISPATCH_ORDER];
 
        unsigned int            numa_node;
@@ -57,14 +45,18 @@ struct blk_mq_hw_ctx {
 
        atomic_t                nr_active;
 
-       struct blk_mq_cpu_notifier      cpu_notifier;
+       struct delayed_work     delay_work;
+
+       struct hlist_node       cpuhp_dead;
        struct kobject          kobj;
 
+       unsigned long           poll_considered;
        unsigned long           poll_invoked;
        unsigned long           poll_success;
 };
 
 struct blk_mq_tag_set {
+       unsigned int            *mq_map;
        struct blk_mq_ops       *ops;
        unsigned int            nr_hw_queues;
        unsigned int            queue_depth;    /* max hw supported */
@@ -88,7 +80,6 @@ struct blk_mq_queue_data {
 };
 
 typedef int (queue_rq_fn)(struct blk_mq_hw_ctx *, const struct blk_mq_queue_data *);
-typedef struct blk_mq_hw_ctx *(map_queue_fn)(struct request_queue *, const int);
 typedef enum blk_eh_timer_return (timeout_fn)(struct request *, bool);
 typedef int (init_hctx_fn)(struct blk_mq_hw_ctx *, void *, unsigned int);
 typedef void (exit_hctx_fn)(struct blk_mq_hw_ctx *, unsigned int);
@@ -102,6 +93,7 @@ typedef void (busy_iter_fn)(struct blk_mq_hw_ctx *, struct request *, void *,
                bool);
 typedef void (busy_tag_iter_fn)(struct request *, void *, bool);
 typedef int (poll_fn)(struct blk_mq_hw_ctx *, unsigned int);
+typedef int (map_queues_fn)(struct blk_mq_tag_set *set);
 
 
 struct blk_mq_ops {
@@ -110,11 +102,6 @@ struct blk_mq_ops {
         */
        queue_rq_fn             *queue_rq;
 
-       /*
-        * Map to specific hardware queue
-        */
-       map_queue_fn            *map_queue;
-
        /*
         * Called on request timeout
         */
@@ -147,6 +134,8 @@ struct blk_mq_ops {
        init_request_fn         *init_request;
        exit_request_fn         *exit_request;
        reinit_request_fn       *reinit_request;
+
+       map_queues_fn           *map_queues;
 };
 
 enum {
@@ -158,6 +147,7 @@ enum {
        BLK_MQ_F_TAG_SHARED     = 1 << 1,
        BLK_MQ_F_SG_MERGE       = 1 << 2,
        BLK_MQ_F_DEFER_ISSUE    = 1 << 4,
+       BLK_MQ_F_BLOCKING       = 1 << 5,
        BLK_MQ_F_ALLOC_POLICY_START_BIT = 8,
        BLK_MQ_F_ALLOC_POLICY_BITS = 1,
 
@@ -178,8 +168,8 @@ enum {
 struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *);
 struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
                                                  struct request_queue *q);
-int blk_mq_register_disk(struct gendisk *);
-void blk_mq_unregister_disk(struct gendisk *);
+int blk_mq_register_dev(struct device *, struct request_queue *);
+void blk_mq_unregister_dev(struct device *, struct request_queue *);
 
 int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set);
 void blk_mq_free_tag_set(struct blk_mq_tag_set *set);
@@ -201,7 +191,6 @@ struct request *blk_mq_alloc_request(struct request_queue *q, int rw,
 struct request *blk_mq_alloc_request_hctx(struct request_queue *q, int op,
                unsigned int flags, unsigned int hctx_idx);
 struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag);
-struct cpumask *blk_mq_tags_cpumask(struct blk_mq_tags *tags);
 
 enum {
        BLK_MQ_UNIQUE_TAG_BITS = 16,
@@ -220,8 +209,6 @@ static inline u16 blk_mq_unique_tag_to_tag(u32 unique_tag)
        return unique_tag & BLK_MQ_UNIQUE_TAG_MASK;
 }
 
-struct blk_mq_hw_ctx *blk_mq_map_queue(struct request_queue *, const int ctx_index);
-struct blk_mq_hw_ctx *blk_mq_alloc_single_hw_queue(struct blk_mq_tag_set *, unsigned int, int);
 
 int blk_mq_request_started(struct request *rq);
 void blk_mq_start_request(struct request *rq);
@@ -232,6 +219,7 @@ void blk_mq_requeue_request(struct request *rq);
 void blk_mq_add_to_requeue_list(struct request *rq, bool at_head);
 void blk_mq_cancel_requeue_work(struct request_queue *q);
 void blk_mq_kick_requeue_list(struct request_queue *q);
+void blk_mq_delay_kick_requeue_list(struct request_queue *q, unsigned long msecs);
 void blk_mq_abort_requeue_list(struct request_queue *q);
 void blk_mq_complete_request(struct request *rq, int error);