@@ -223,14 +223,15 @@ struct request *__blk_mq_alloc_request(struct blk_mq_alloc_data *data,
223
223
224
224
tag = blk_mq_get_tag (data );
225
225
if (tag != BLK_MQ_TAG_FAIL ) {
226
- rq = data -> hctx -> tags -> rqs [tag ];
226
+ rq = data -> hctx -> tags -> static_rqs [tag ];
227
227
228
228
if (blk_mq_tag_busy (data -> hctx )) {
229
229
rq -> rq_flags = RQF_MQ_INFLIGHT ;
230
230
atomic_inc (& data -> hctx -> nr_active );
231
231
}
232
232
233
233
rq -> tag = tag ;
234
+ data -> hctx -> tags -> rqs [tag ] = rq ;
234
235
blk_mq_rq_ctx_init (data -> q , data -> ctx , rq , op );
235
236
return rq ;
236
237
}
@@ -1567,11 +1568,13 @@ void blk_mq_free_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
1567
1568
int i ;
1568
1569
1569
1570
for (i = 0 ; i < tags -> nr_tags ; i ++ ) {
1570
- if (!tags -> rqs [i ])
1571
+ struct request * rq = tags -> static_rqs [i ];
1572
+
1573
+ if (!rq )
1571
1574
continue ;
1572
- set -> ops -> exit_request (set -> driver_data , tags -> rqs [ i ] ,
1575
+ set -> ops -> exit_request (set -> driver_data , rq ,
1573
1576
hctx_idx , i );
1574
- tags -> rqs [i ] = NULL ;
1577
+ tags -> static_rqs [i ] = NULL ;
1575
1578
}
1576
1579
}
1577
1580
@@ -1591,6 +1594,8 @@ void blk_mq_free_rq_map(struct blk_mq_tags *tags)
1591
1594
{
1592
1595
kfree (tags -> rqs );
1593
1596
tags -> rqs = NULL ;
1597
+ kfree (tags -> static_rqs );
1598
+ tags -> static_rqs = NULL ;
1594
1599
1595
1600
blk_mq_free_tags (tags );
1596
1601
}
@@ -1616,6 +1621,15 @@ struct blk_mq_tags *blk_mq_alloc_rq_map(struct blk_mq_tag_set *set,
1616
1621
return NULL ;
1617
1622
}
1618
1623
1624
+ tags -> static_rqs = kzalloc_node (nr_tags * sizeof (struct request * ),
1625
+ GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY ,
1626
+ set -> numa_node );
1627
+ if (!tags -> static_rqs ) {
1628
+ kfree (tags -> rqs );
1629
+ blk_mq_free_tags (tags );
1630
+ return NULL ;
1631
+ }
1632
+
1619
1633
return tags ;
1620
1634
}
1621
1635
@@ -1677,12 +1691,14 @@ int blk_mq_alloc_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
1677
1691
to_do = min (entries_per_page , depth - i );
1678
1692
left -= to_do * rq_size ;
1679
1693
for (j = 0 ; j < to_do ; j ++ ) {
1680
- tags -> rqs [i ] = p ;
1694
+ struct request * rq = p ;
1695
+
1696
+ tags -> static_rqs [i ] = rq ;
1681
1697
if (set -> ops -> init_request ) {
1682
1698
if (set -> ops -> init_request (set -> driver_data ,
1683
- tags -> rqs [ i ] , hctx_idx , i ,
1699
+ rq , hctx_idx , i ,
1684
1700
set -> numa_node )) {
1685
- tags -> rqs [i ] = NULL ;
1701
+ tags -> static_rqs [i ] = NULL ;
1686
1702
goto fail ;
1687
1703
}
1688
1704
}
0 commit comments