@@ -348,63 +348,33 @@ static inline void virtblk_request_done(struct request *req)
348348 blk_mq_end_request (req , status );
349349}
350350
351- static void virtblk_complete_batch (struct io_comp_batch * iob )
352- {
353- struct request * req ;
354-
355- rq_list_for_each (& iob -> req_list , req ) {
356- virtblk_unmap_data (req , blk_mq_rq_to_pdu (req ));
357- virtblk_cleanup_cmd (req );
358- }
359- blk_mq_end_request_batch (iob );
360- }
361-
362- static int virtblk_handle_req (struct virtio_blk_vq * vq ,
363- struct io_comp_batch * iob )
364- {
365- struct virtblk_req * vbr ;
366- int req_done = 0 ;
367- unsigned int len ;
368-
369- while ((vbr = virtqueue_get_buf (vq -> vq , & len )) != NULL ) {
370- struct request * req = blk_mq_rq_from_pdu (vbr );
371-
372- if (likely (!blk_should_fake_timeout (req -> q )) &&
373- !blk_mq_complete_request_remote (req ) &&
374- !blk_mq_add_to_batch (req , iob , virtblk_vbr_status (vbr ),
375- virtblk_complete_batch ))
376- virtblk_request_done (req );
377- req_done ++ ;
378- }
379-
380- return req_done ;
381- }
382-
383351static void virtblk_done (struct virtqueue * vq )
384352{
385353 struct virtio_blk * vblk = vq -> vdev -> priv ;
386- struct virtio_blk_vq * vblk_vq = & vblk -> vqs [vq -> index ];
387- int req_done = 0 ;
354+ bool req_done = false;
355+ int qid = vq -> index ;
356+ struct virtblk_req * vbr ;
388357 unsigned long flags ;
389- DEFINE_IO_COMP_BATCH ( iob ) ;
358+ unsigned int len ;
390359
391- spin_lock_irqsave (& vblk_vq -> lock , flags );
360+ spin_lock_irqsave (& vblk -> vqs [ qid ]. lock , flags );
392361 do {
393362 virtqueue_disable_cb (vq );
394- req_done += virtblk_handle_req (vblk_vq , & iob );
363+ while ((vbr = virtqueue_get_buf (vblk -> vqs [qid ].vq , & len )) != NULL ) {
364+ struct request * req = blk_mq_rq_from_pdu (vbr );
395365
366+ if (likely (!blk_should_fake_timeout (req -> q )))
367+ blk_mq_complete_request (req );
368+ req_done = true;
369+ }
396370 if (unlikely (virtqueue_is_broken (vq )))
397371 break ;
398372 } while (!virtqueue_enable_cb (vq ));
399373
400- if (req_done ) {
401- if (!rq_list_empty (iob .req_list ))
402- iob .complete (& iob );
403-
404- /* In case queue is stopped waiting for more buffers. */
374+ /* In case queue is stopped waiting for more buffers. */
375+ if (req_done )
405376 blk_mq_start_stopped_hw_queues (vblk -> disk -> queue , true);
406- }
407- spin_unlock_irqrestore (& vblk_vq -> lock , flags );
377+ spin_unlock_irqrestore (& vblk -> vqs [qid ].lock , flags );
408378}
409379
410380static void virtio_commit_rqs (struct blk_mq_hw_ctx * hctx )
@@ -1283,15 +1253,37 @@ static void virtblk_map_queues(struct blk_mq_tag_set *set)
12831253 }
12841254}
12851255
1256+ static void virtblk_complete_batch (struct io_comp_batch * iob )
1257+ {
1258+ struct request * req ;
1259+
1260+ rq_list_for_each (& iob -> req_list , req ) {
1261+ virtblk_unmap_data (req , blk_mq_rq_to_pdu (req ));
1262+ virtblk_cleanup_cmd (req );
1263+ }
1264+ blk_mq_end_request_batch (iob );
1265+ }
1266+
12861267static int virtblk_poll (struct blk_mq_hw_ctx * hctx , struct io_comp_batch * iob )
12871268{
12881269 struct virtio_blk * vblk = hctx -> queue -> queuedata ;
12891270 struct virtio_blk_vq * vq = get_virtio_blk_vq (hctx );
1271+ struct virtblk_req * vbr ;
12901272 unsigned long flags ;
1273+ unsigned int len ;
12911274 int found = 0 ;
12921275
12931276 spin_lock_irqsave (& vq -> lock , flags );
1294- found = virtblk_handle_req (vq , iob );
1277+
1278+ while ((vbr = virtqueue_get_buf (vq -> vq , & len )) != NULL ) {
1279+ struct request * req = blk_mq_rq_from_pdu (vbr );
1280+
1281+ found ++ ;
1282+ if (!blk_mq_complete_request_remote (req ) &&
1283+ !blk_mq_add_to_batch (req , iob , virtblk_vbr_status (vbr ),
1284+ virtblk_complete_batch ))
1285+ virtblk_request_done (req );
1286+ }
12951287
12961288 if (found )
12971289 blk_mq_start_stopped_hw_queues (vblk -> disk -> queue , true);
0 commit comments