@@ -3413,7 +3413,6 @@ static void blk_mq_clear_rq_mapping(struct blk_mq_tags *drv_tags,
34133413 struct blk_mq_tags * tags )
34143414{
34153415 struct page * page ;
3416- unsigned long flags ;
34173416
34183417 /*
34193418 * There is no need to clear mapping if driver tags is not initialized
@@ -3437,22 +3436,12 @@ static void blk_mq_clear_rq_mapping(struct blk_mq_tags *drv_tags,
34373436 }
34383437 }
34393438 }
3440-
3441- /*
3442- * Wait until all pending iteration is done.
3443- *
3444- * Request reference is cleared and it is guaranteed to be observed
3445- * after the ->lock is released.
3446- */
3447- spin_lock_irqsave (& drv_tags -> lock , flags );
3448- spin_unlock_irqrestore (& drv_tags -> lock , flags );
34493439}
34503440
34513441void blk_mq_free_rqs (struct blk_mq_tag_set * set , struct blk_mq_tags * tags ,
34523442 unsigned int hctx_idx )
34533443{
34543444 struct blk_mq_tags * drv_tags ;
3455- struct page * page ;
34563445
34573446 if (list_empty (& tags -> page_list ))
34583447 return ;
@@ -3476,27 +3465,20 @@ void blk_mq_free_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
34763465 }
34773466
34783467 blk_mq_clear_rq_mapping (drv_tags , tags );
3479-
3480- while (!list_empty (& tags -> page_list )) {
3481- page = list_first_entry (& tags -> page_list , struct page , lru );
3482- list_del_init (& page -> lru );
3483- /*
3484- * Remove kmemleak object previously allocated in
3485- * blk_mq_alloc_rqs().
3486- */
3487- kmemleak_free (page_address (page ));
3488- __free_pages (page , page -> private );
3489- }
3468+ /*
3469+ * Free request pages in SRCU callback, which is called from
3470+ * blk_mq_free_tags().
3471+ */
34903472}
34913473
3492- void blk_mq_free_rq_map (struct blk_mq_tags * tags )
3474+ void blk_mq_free_rq_map (struct blk_mq_tag_set * set , struct blk_mq_tags * tags )
34933475{
34943476 kfree (tags -> rqs );
34953477 tags -> rqs = NULL ;
34963478 kfree (tags -> static_rqs );
34973479 tags -> static_rqs = NULL ;
34983480
3499- blk_mq_free_tags (tags );
3481+ blk_mq_free_tags (set , tags );
35003482}
35013483
35023484static enum hctx_type hctx_idx_to_type (struct blk_mq_tag_set * set ,
@@ -3558,7 +3540,7 @@ static struct blk_mq_tags *blk_mq_alloc_rq_map(struct blk_mq_tag_set *set,
35583540err_free_rqs :
35593541 kfree (tags -> rqs );
35603542err_free_tags :
3561- blk_mq_free_tags (tags );
3543+ blk_mq_free_tags (set , tags );
35623544 return NULL ;
35633545}
35643546
@@ -3588,8 +3570,6 @@ static int blk_mq_alloc_rqs(struct blk_mq_tag_set *set,
35883570 if (node == NUMA_NO_NODE )
35893571 node = set -> numa_node ;
35903572
3591- INIT_LIST_HEAD (& tags -> page_list );
3592-
35933573 /*
35943574 * rq_size is the size of the request plus driver payload, rounded
35953575 * to the cacheline size
@@ -3676,8 +3656,12 @@ static bool blk_mq_hctx_has_requests(struct blk_mq_hw_ctx *hctx)
36763656 struct rq_iter_data data = {
36773657 .hctx = hctx ,
36783658 };
3659+ int srcu_idx ;
36793660
3661+ srcu_idx = srcu_read_lock (& hctx -> queue -> tag_set -> tags_srcu );
36803662 blk_mq_all_tag_iter (tags , blk_mq_has_request , & data );
3663+ srcu_read_unlock (& hctx -> queue -> tag_set -> tags_srcu , srcu_idx );
3664+
36813665 return data .has_rq ;
36823666}
36833667
@@ -3897,7 +3881,6 @@ static void blk_mq_clear_flush_rq_mapping(struct blk_mq_tags *tags,
38973881 unsigned int queue_depth , struct request * flush_rq )
38983882{
38993883 int i ;
3900- unsigned long flags ;
39013884
39023885 /* The hw queue may not be mapped yet */
39033886 if (!tags )
@@ -3907,15 +3890,14 @@ static void blk_mq_clear_flush_rq_mapping(struct blk_mq_tags *tags,
39073890
39083891 for (i = 0 ; i < queue_depth ; i ++ )
39093892 cmpxchg (& tags -> rqs [i ], flush_rq , NULL );
3893+ }
39103894
3911- /*
3912- * Wait until all pending iteration is done.
3913- *
3914- * Request reference is cleared and it is guaranteed to be observed
3915- * after the ->lock is released.
3916- */
3917- spin_lock_irqsave (& tags -> lock , flags );
3918- spin_unlock_irqrestore (& tags -> lock , flags );
3895+ static void blk_free_flush_queue_callback (struct rcu_head * head )
3896+ {
3897+ struct blk_flush_queue * fq =
3898+ container_of (head , struct blk_flush_queue , rcu_head );
3899+
3900+ blk_free_flush_queue (fq );
39193901}
39203902
39213903/* hctx->ctxs will be freed in queue's release handler */
@@ -3937,6 +3919,10 @@ static void blk_mq_exit_hctx(struct request_queue *q,
39373919 if (set -> ops -> exit_hctx )
39383920 set -> ops -> exit_hctx (hctx , hctx_idx );
39393921
3922+ call_srcu (& set -> tags_srcu , & hctx -> fq -> rcu_head ,
3923+ blk_free_flush_queue_callback );
3924+ hctx -> fq = NULL ;
3925+
39403926 xa_erase (& q -> hctx_table , hctx_idx );
39413927
39423928 spin_lock (& q -> unused_hctx_lock );
@@ -3962,13 +3948,19 @@ static int blk_mq_init_hctx(struct request_queue *q,
39623948 struct blk_mq_tag_set * set ,
39633949 struct blk_mq_hw_ctx * hctx , unsigned hctx_idx )
39643950{
3951+ gfp_t gfp = GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY ;
3952+
3953+ hctx -> fq = blk_alloc_flush_queue (hctx -> numa_node , set -> cmd_size , gfp );
3954+ if (!hctx -> fq )
3955+ goto fail ;
3956+
39653957 hctx -> queue_num = hctx_idx ;
39663958
39673959 hctx -> tags = set -> tags [hctx_idx ];
39683960
39693961 if (set -> ops -> init_hctx &&
39703962 set -> ops -> init_hctx (hctx , set -> driver_data , hctx_idx ))
3971- goto fail ;
3963+ goto fail_free_fq ;
39723964
39733965 if (blk_mq_init_request (set , hctx -> fq -> flush_rq , hctx_idx ,
39743966 hctx -> numa_node ))
@@ -3985,6 +3977,9 @@ static int blk_mq_init_hctx(struct request_queue *q,
39853977 exit_hctx :
39863978 if (set -> ops -> exit_hctx )
39873979 set -> ops -> exit_hctx (hctx , hctx_idx );
3980+ fail_free_fq :
3981+ blk_free_flush_queue (hctx -> fq );
3982+ hctx -> fq = NULL ;
39883983 fail :
39893984 return -1 ;
39903985}
@@ -4036,16 +4031,10 @@ blk_mq_alloc_hctx(struct request_queue *q, struct blk_mq_tag_set *set,
40364031 init_waitqueue_func_entry (& hctx -> dispatch_wait , blk_mq_dispatch_wake );
40374032 INIT_LIST_HEAD (& hctx -> dispatch_wait .entry );
40384033
4039- hctx -> fq = blk_alloc_flush_queue (hctx -> numa_node , set -> cmd_size , gfp );
4040- if (!hctx -> fq )
4041- goto free_bitmap ;
4042-
40434034 blk_mq_hctx_kobj_init (hctx );
40444035
40454036 return hctx ;
40464037
4047- free_bitmap :
4048- sbitmap_free (& hctx -> ctx_map );
40494038 free_ctxs :
40504039 kfree (hctx -> ctxs );
40514040 free_cpumask :
@@ -4099,7 +4088,7 @@ struct blk_mq_tags *blk_mq_alloc_map_and_rqs(struct blk_mq_tag_set *set,
40994088
41004089 ret = blk_mq_alloc_rqs (set , tags , hctx_idx , depth );
41014090 if (ret ) {
4102- blk_mq_free_rq_map (tags );
4091+ blk_mq_free_rq_map (set , tags );
41034092 return NULL ;
41044093 }
41054094
@@ -4127,7 +4116,7 @@ void blk_mq_free_map_and_rqs(struct blk_mq_tag_set *set,
41274116{
41284117 if (tags ) {
41294118 blk_mq_free_rqs (set , tags , hctx_idx );
4130- blk_mq_free_rq_map (tags );
4119+ blk_mq_free_rq_map (set , tags );
41314120 }
41324121}
41334122
@@ -4826,6 +4815,9 @@ int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set)
48264815 if (ret )
48274816 goto out_free_srcu ;
48284817 }
4818+ ret = init_srcu_struct (& set -> tags_srcu );
4819+ if (ret )
4820+ goto out_cleanup_srcu ;
48294821
48304822 init_rwsem (& set -> update_nr_hwq_lock );
48314823
@@ -4834,7 +4826,7 @@ int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set)
48344826 sizeof (struct blk_mq_tags * ), GFP_KERNEL ,
48354827 set -> numa_node );
48364828 if (!set -> tags )
4837- goto out_cleanup_srcu ;
4829+ goto out_cleanup_tags_srcu ;
48384830
48394831 for (i = 0 ; i < set -> nr_maps ; i ++ ) {
48404832 set -> map [i ].mq_map = kcalloc_node (nr_cpu_ids ,
@@ -4863,6 +4855,8 @@ int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set)
48634855 }
48644856 kfree (set -> tags );
48654857 set -> tags = NULL ;
4858+ out_cleanup_tags_srcu :
4859+ cleanup_srcu_struct (& set -> tags_srcu );
48664860out_cleanup_srcu :
48674861 if (set -> flags & BLK_MQ_F_BLOCKING )
48684862 cleanup_srcu_struct (set -> srcu );
@@ -4908,6 +4902,9 @@ void blk_mq_free_tag_set(struct blk_mq_tag_set *set)
49084902
49094903 kfree (set -> tags );
49104904 set -> tags = NULL ;
4905+
4906+ srcu_barrier (& set -> tags_srcu );
4907+ cleanup_srcu_struct (& set -> tags_srcu );
49114908 if (set -> flags & BLK_MQ_F_BLOCKING ) {
49124909 cleanup_srcu_struct (set -> srcu );
49134910 kfree (set -> srcu );
0 commit comments