Merge branch 'for-4.9/block-irq' of git://git.kernel.dk/linux-block
[cascardo/linux.git] / block / blk-mq-tag.h
index 5569641..d166273 100644 (file)
@@ -3,31 +3,6 @@
 
 #include "blk-mq.h"
 
 
 #include "blk-mq.h"
 
-enum {
-       BT_WAIT_QUEUES  = 8,
-       BT_WAIT_BATCH   = 8,
-};
-
-struct bt_wait_state {
-       atomic_t wait_cnt;
-       wait_queue_head_t wait;
-} ____cacheline_aligned_in_smp;
-
-#define TAG_TO_INDEX(bt, tag)  ((tag) >> (bt)->bits_per_word)
-#define TAG_TO_BIT(bt, tag)    ((tag) & ((1 << (bt)->bits_per_word) - 1))
-
-struct blk_mq_bitmap_tags {
-       unsigned int depth;
-       unsigned int wake_cnt;
-       unsigned int bits_per_word;
-
-       unsigned int map_nr;
-       struct blk_align_bitmap *map;
-
-       atomic_t wake_index;
-       struct bt_wait_state *bs;
-};
-
 /*
  * Tag address space map.
  */
 /*
  * Tag address space map.
  */
@@ -37,13 +12,11 @@ struct blk_mq_tags {
 
        atomic_t active_queues;
 
 
        atomic_t active_queues;
 
-       struct blk_mq_bitmap_tags bitmap_tags;
-       struct blk_mq_bitmap_tags breserved_tags;
+       struct sbitmap_queue bitmap_tags;
+       struct sbitmap_queue breserved_tags;
 
        struct request **rqs;
        struct list_head page_list;
 
        struct request **rqs;
        struct list_head page_list;
-
-       int alloc_policy;
 };
 
 
 };
 
 
@@ -51,15 +24,23 @@ extern struct blk_mq_tags *blk_mq_init_tags(unsigned int nr_tags, unsigned int r
 extern void blk_mq_free_tags(struct blk_mq_tags *tags);
 
 extern unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data);
 extern void blk_mq_free_tags(struct blk_mq_tags *tags);
 
 extern unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data);
-extern void blk_mq_put_tag(struct blk_mq_hw_ctx *hctx, unsigned int tag, unsigned int *last_tag);
+extern void blk_mq_put_tag(struct blk_mq_hw_ctx *hctx, struct blk_mq_ctx *ctx,
+                          unsigned int tag);
 extern bool blk_mq_has_free_tags(struct blk_mq_tags *tags);
 extern ssize_t blk_mq_tag_sysfs_show(struct blk_mq_tags *tags, char *page);
 extern bool blk_mq_has_free_tags(struct blk_mq_tags *tags);
 extern ssize_t blk_mq_tag_sysfs_show(struct blk_mq_tags *tags, char *page);
-extern void blk_mq_tag_init_last_tag(struct blk_mq_tags *tags, unsigned int *last_tag);
 extern int blk_mq_tag_update_depth(struct blk_mq_tags *tags, unsigned int depth);
 extern void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags, bool);
 void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_iter_fn *fn,
                void *priv);
 
 extern int blk_mq_tag_update_depth(struct blk_mq_tags *tags, unsigned int depth);
 extern void blk_mq_tag_wakeup_all(struct blk_mq_tags *tags, bool);
 void blk_mq_queue_tag_busy_iter(struct request_queue *q, busy_iter_fn *fn,
                void *priv);
 
+static inline struct sbq_wait_state *bt_wait_ptr(struct sbitmap_queue *bt,
+                                                struct blk_mq_hw_ctx *hctx)
+{
+       if (!hctx)
+               return &bt->ws[0];
+       return sbq_wait_ptr(bt, &hctx->wait_index);
+}
+
 enum {
        BLK_MQ_TAG_CACHE_MIN    = 1,
        BLK_MQ_TAG_CACHE_MAX    = 64,
 enum {
        BLK_MQ_TAG_CACHE_MIN    = 1,
        BLK_MQ_TAG_CACHE_MAX    = 64,