[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 6/7] scsi: Introduce scsi_req_cancel_async
From: |
Fam Zheng |
Subject: |
Re: [Qemu-devel] [PATCH v3 6/7] scsi: Introduce scsi_req_cancel_async |
Date: |
Sun, 28 Sep 2014 09:44:12 +0800 |
User-agent: |
Mutt/1.5.23 (2014-03-12) |
On Thu, 09/25 10:51, Paolo Bonzini wrote:
> Il 25/09/2014 04:20, Fam Zheng ha scritto:
> > Devices will call this function to start an asynchronous cancellation. The
> > bus->info->cancel will be called after the request is canceled.
> >
> > Devices will probably need to track a separate TMF request that triggers
> > this
> > cancellation, and wait until the cancellation is done before completing it.
> > So
> > we store a notifier list in SCSIRequest and in scsi_req_cancel_complete we
> > notify them.
> >
> > Signed-off-by: Fam Zheng <address@hidden>
> > ---
> > hw/scsi/scsi-bus.c | 23 +++++++++++++++++++++++
> > include/hw/scsi/scsi.h | 3 +++
> > 2 files changed, 26 insertions(+)
> >
> > diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
> > index c91db63..df7585a 100644
> > --- a/hw/scsi/scsi-bus.c
> > +++ b/hw/scsi/scsi-bus.c
> > @@ -566,6 +566,7 @@ SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops,
> > SCSIDevice *d,
> > req->ops = reqops;
> > object_ref(OBJECT(d));
> > object_ref(OBJECT(qbus->parent));
> > + notifier_list_init(&req->cancel_notifiers);
> > trace_scsi_req_alloc(req->dev->id, req->lun, req->tag);
> > return req;
> > }
> > @@ -1725,9 +1726,31 @@ void scsi_req_cancel_complete(SCSIRequest *req)
> > if (req->bus->info->cancel) {
> > req->bus->info->cancel(req);
> > }
> > + notifier_list_notify(&req->cancel_notifiers, req);
>
> I think you also have to call notifier_list_notify from
> scsi_req_complete, because a cancelled request might end up being
> completed instead of cancelled.
Yes, will update the series.
>
> In fact, the next obvious step (enabled by your bdrv_aio_cancel cleanup)
> would be to _not_ call scsi_req_cancel_complete if we can report
> completion or if there was an I/O error. This can happen for
> scsi-generic, scsi_dma_complete_noio, etc. Basically, moving the
> io_canceled check from the beginning of the completion routine to just
> before bdrv_aio_* or dma_aio_* are called.
Okay.
Thanks,
Fam
- [Qemu-devel] [PATCH v3 0/7] virtio-scsi: Asynchronous cancellation, Fam Zheng, 2014/09/24
- [Qemu-devel] [PATCH v3 2/7] scsi-generic: Handle canceled request in scsi_command_complete, Fam Zheng, 2014/09/24
- [Qemu-devel] [PATCH v3 1/7] scsi: Drop scsi_req_abort, Fam Zheng, 2014/09/24
- [Qemu-devel] [PATCH v3 3/7] scsi-bus: Unify request unref in scsi_req_cancel, Fam Zheng, 2014/09/24
- [Qemu-devel] [PATCH v3 5/7] scsi: Introduce scsi_req_cancel_complete, Fam Zheng, 2014/09/24
- [Qemu-devel] [PATCH v3 4/7] scsi: Drop SCSIReqOps.cancel_io, Fam Zheng, 2014/09/24
- [Qemu-devel] [PATCH v3 6/7] scsi: Introduce scsi_req_cancel_async, Fam Zheng, 2014/09/24
- [Qemu-devel] [PATCH v3 7/7] virtio-scsi: Handle TMF request cancellation asynchronously, Fam Zheng, 2014/09/24