lib / string_helpers: move documentation to c-file
[sfrench/cifs-2.6.git] / block / blk-mq.c
index df8e1e09dd172d9ab67dbd0a91e519c5c01919ef..38f4a165640dd0aba321bb3196d8b1d1996635c1 100644 (file)
@@ -119,16 +119,7 @@ void blk_mq_freeze_queue(struct request_queue *q)
        spin_unlock_irq(q->queue_lock);
 
        if (freeze) {
-               /*
-                * XXX: Temporary kludge to work around SCSI blk-mq stall.
-                * SCSI synchronously creates and destroys many queues
-                * back-to-back during probe leading to lengthy stalls.
-                * This will be fixed by keeping ->mq_usage_counter in
-                * atomic mode until genhd registration, but, for now,
-                * let's work around using expedited synchronization.
-                */
-               __percpu_ref_kill_expedited(&q->mq_usage_counter);
-
+               percpu_ref_kill(&q->mq_usage_counter);
                blk_mq_run_queues(q, false);
        }
        wait_event(q->mq_freeze_wq, percpu_ref_is_zero(&q->mq_usage_counter));
@@ -1804,7 +1795,12 @@ struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *set)
        if (!q)
                goto err_hctxs;
 
-       if (percpu_ref_init(&q->mq_usage_counter, blk_mq_usage_counter_release))
+       /*
+        * Init percpu_ref in atomic mode so that it's faster to shutdown.
+        * See blk_register_queue() for details.
+        */
+       if (percpu_ref_init(&q->mq_usage_counter, blk_mq_usage_counter_release,
+                           PERCPU_REF_INIT_ATOMIC, GFP_KERNEL))
                goto err_map;
 
        setup_timer(&q->timeout, blk_mq_rq_timer, (unsigned long) q);