drm/etnaviv: add MC perf domain
[linux-2.6-block.git] / block / blk-mq-tag.c
index d0be72ccb0914c74fd9140ed112228832752ee6d..6714507aa6c75b716d34a53c708952bf5d0ae619 100644 (file)
@@ -214,7 +214,11 @@ static bool bt_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
                bitnr += tags->nr_reserved_tags;
        rq = tags->rqs[bitnr];
 
-       if (rq->q == hctx->queue)
+       /*
+        * We can hit rq == NULL here, because the tagging functions
+        * test and set the bit before assining ->rqs[].
+        */
+       if (rq && rq->q == hctx->queue)
                iter_data->fn(hctx, rq, iter_data->data, reserved);
        return true;
 }
@@ -248,9 +252,15 @@ static bool bt_tags_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data)
 
        if (!reserved)
                bitnr += tags->nr_reserved_tags;
+
+       /*
+        * We can hit rq == NULL here, because the tagging functions
+        * test and set the bit before assining ->rqs[].
+        */
        rq = tags->rqs[bitnr];
+       if (rq)
+               iter_data->fn(rq, iter_data->data, reserved);
 
-       iter_data->fn(rq, iter_data->data, reserved);
        return true;
 }
 
@@ -288,11 +298,12 @@ void blk_mq_tagset_busy_iter(struct blk_mq_tag_set *tagset,
 }
 EXPORT_SYMBOL(blk_mq_tagset_busy_iter);
 
-int blk_mq_reinit_tagset(struct blk_mq_tag_set *set)
+int blk_mq_reinit_tagset(struct blk_mq_tag_set *set,
+                        int (reinit_request)(void *, struct request *))
 {
        int i, j, ret = 0;
 
-       if (!set->ops->reinit_request)
+       if (WARN_ON_ONCE(!reinit_request))
                goto out;
 
        for (i = 0; i < set->nr_hw_queues; i++) {
@@ -305,8 +316,8 @@ int blk_mq_reinit_tagset(struct blk_mq_tag_set *set)
                        if (!tags->static_rqs[j])
                                continue;
 
-                       ret = set->ops->reinit_request(set->driver_data,
-                                               tags->static_rqs[j]);
+                       ret = reinit_request(set->driver_data,
+                                            tags->static_rqs[j]);
                        if (ret)
                                goto out;
                }