@@ -817,12 +817,28 @@ static void ublk_submit_cmd(struct ublk_queue *ubq, const struct request *rq)
817
817
}
818
818
}
819
819
820
+ static void ublk_queue_cmd (struct ublk_queue * ubq , struct request * rq ,
821
+ bool last )
822
+ {
823
+ struct ublk_rq_data * data = blk_mq_rq_to_pdu (rq );
824
+
825
+ if (ublk_can_use_task_work (ubq )) {
826
+ enum task_work_notify_mode notify_mode = last ?
827
+ TWA_SIGNAL_NO_IPI : TWA_NONE ;
828
+
829
+ if (task_work_add (ubq -> ubq_daemon , & data -> work , notify_mode ))
830
+ __ublk_abort_rq (ubq , rq );
831
+ } else {
832
+ if (llist_add (& data -> node , & ubq -> io_cmds ))
833
+ ublk_submit_cmd (ubq , rq );
834
+ }
835
+ }
836
+
820
837
static blk_status_t ublk_queue_rq (struct blk_mq_hw_ctx * hctx ,
821
838
const struct blk_mq_queue_data * bd )
822
839
{
823
840
struct ublk_queue * ubq = hctx -> driver_data ;
824
841
struct request * rq = bd -> rq ;
825
- struct ublk_rq_data * data = blk_mq_rq_to_pdu (rq );
826
842
blk_status_t res ;
827
843
828
844
/* fill iod to slot in io cmd buffer */
@@ -845,21 +861,12 @@ static blk_status_t ublk_queue_rq(struct blk_mq_hw_ctx *hctx,
845
861
blk_mq_start_request (bd -> rq );
846
862
847
863
if (unlikely (ubq_daemon_is_dying (ubq ))) {
848
- fail :
849
864
__ublk_abort_rq (ubq , rq );
850
865
return BLK_STS_OK ;
851
866
}
852
867
853
- if (ublk_can_use_task_work (ubq )) {
854
- enum task_work_notify_mode notify_mode = bd -> last ?
855
- TWA_SIGNAL_NO_IPI : TWA_NONE ;
868
+ ublk_queue_cmd (ubq , rq , bd -> last );
856
869
857
- if (task_work_add (ubq -> ubq_daemon , & data -> work , notify_mode ))
858
- goto fail ;
859
- } else {
860
- if (llist_add (& data -> node , & ubq -> io_cmds ))
861
- ublk_submit_cmd (ubq , rq );
862
- }
863
870
return BLK_STS_OK ;
864
871
}
865
872
@@ -1185,24 +1192,12 @@ static void ublk_mark_io_ready(struct ublk_device *ub, struct ublk_queue *ubq)
1185
1192
}
1186
1193
1187
1194
static void ublk_handle_need_get_data (struct ublk_device * ub , int q_id ,
1188
- int tag , struct io_uring_cmd * cmd )
1195
+ int tag )
1189
1196
{
1190
1197
struct ublk_queue * ubq = ublk_get_queue (ub , q_id );
1191
1198
struct request * req = blk_mq_tag_to_rq (ub -> tag_set .tags [q_id ], tag );
1192
- struct ublk_rq_data * data = blk_mq_rq_to_pdu (req );
1193
1199
1194
- if (ublk_can_use_task_work (ubq )) {
1195
- /* should not fail since we call it just in ubq->ubq_daemon */
1196
- task_work_add (ubq -> ubq_daemon , & data -> work , TWA_SIGNAL_NO_IPI );
1197
- } else {
1198
- struct ublk_uring_cmd_pdu * pdu = ublk_get_uring_cmd_pdu (cmd );
1199
-
1200
- if (llist_add (& data -> node , & ubq -> io_cmds )) {
1201
- pdu -> ubq = ubq ;
1202
- io_uring_cmd_complete_in_task (cmd ,
1203
- ublk_rq_task_work_cb );
1204
- }
1205
- }
1200
+ ublk_queue_cmd (ubq , req , true);
1206
1201
}
1207
1202
1208
1203
static int ublk_ch_uring_cmd (struct io_uring_cmd * cmd , unsigned int issue_flags )
@@ -1290,7 +1285,7 @@ static int ublk_ch_uring_cmd(struct io_uring_cmd *cmd, unsigned int issue_flags)
1290
1285
io -> addr = ub_cmd -> addr ;
1291
1286
io -> cmd = cmd ;
1292
1287
io -> flags |= UBLK_IO_FLAG_ACTIVE ;
1293
- ublk_handle_need_get_data (ub , ub_cmd -> q_id , ub_cmd -> tag , cmd );
1288
+ ublk_handle_need_get_data (ub , ub_cmd -> q_id , ub_cmd -> tag );
1294
1289
break ;
1295
1290
default :
1296
1291
goto out ;
0 commit comments