@@ -348,63 +348,33 @@ static inline void virtblk_request_done(struct request *req)
348
348
blk_mq_end_request (req , status );
349
349
}
350
350
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
-
383
351
static void virtblk_done (struct virtqueue * vq )
384
352
{
385
353
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 ;
388
357
unsigned long flags ;
389
- DEFINE_IO_COMP_BATCH ( iob ) ;
358
+ unsigned int len ;
390
359
391
- spin_lock_irqsave (& vblk_vq -> lock , flags );
360
+ spin_lock_irqsave (& vblk -> vqs [ qid ]. lock , flags );
392
361
do {
393
362
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 );
395
365
366
+ if (likely (!blk_should_fake_timeout (req -> q )))
367
+ blk_mq_complete_request (req );
368
+ req_done = true;
369
+ }
396
370
if (unlikely (virtqueue_is_broken (vq )))
397
371
break ;
398
372
} while (!virtqueue_enable_cb (vq ));
399
373
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 )
405
376
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 );
408
378
}
409
379
410
380
static 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)
1283
1253
}
1284
1254
}
1285
1255
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
+
1286
1267
static int virtblk_poll (struct blk_mq_hw_ctx * hctx , struct io_comp_batch * iob )
1287
1268
{
1288
1269
struct virtio_blk * vblk = hctx -> queue -> queuedata ;
1289
1270
struct virtio_blk_vq * vq = get_virtio_blk_vq (hctx );
1271
+ struct virtblk_req * vbr ;
1290
1272
unsigned long flags ;
1273
+ unsigned int len ;
1291
1274
int found = 0 ;
1292
1275
1293
1276
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
+ }
1295
1287
1296
1288
if (found )
1297
1289
blk_mq_start_stopped_hw_queues (vblk -> disk -> queue , true);
0 commit comments