mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
virtio-scsi: implement BlockDevOps->drained_begin()
The virtio-scsi Host Bus Adapter provides access to devices on a SCSI bus. Those SCSI devices typically have a BlockBackend. When the BlockBackend enters a drained section, the SCSI device must temporarily stop submitting new I/O requests. Implement this behavior by temporarily stopping virtio-scsi virtqueue processing when one of the SCSI devices enters a drained section. The new scsi_device_drained_begin() API allows scsi-disk to message the virtio-scsi HBA. scsi_device_drained_begin() uses a drain counter so that multiple SCSI devices can have overlapping drained sections. The HBA only sees one pair of .drained_begin/end() calls. After this commit, virtio-scsi no longer depends on hw/virtio's ioeventfd aio_set_event_notifier(is_external=true). This commit is a step towards removing the aio_disable_external() API. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Message-Id: <20230516190238.8401-19-stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
1665d9326f
commit
766aa2de0f
6 changed files with 127 additions and 12 deletions
|
@ -133,6 +133,16 @@ struct SCSIBusInfo {
|
|||
void (*save_request)(QEMUFile *f, SCSIRequest *req);
|
||||
void *(*load_request)(QEMUFile *f, SCSIRequest *req);
|
||||
void (*free_request)(SCSIBus *bus, void *priv);
|
||||
|
||||
/*
|
||||
* Temporarily stop submitting new requests between drained_begin() and
|
||||
* drained_end(). Called from the main loop thread with the BQL held.
|
||||
*
|
||||
* Implement these callbacks if request processing is triggered by a file
|
||||
* descriptor like an EventNotifier. Otherwise set them to NULL.
|
||||
*/
|
||||
void (*drained_begin)(SCSIBus *bus);
|
||||
void (*drained_end)(SCSIBus *bus);
|
||||
};
|
||||
|
||||
#define TYPE_SCSI_BUS "SCSI"
|
||||
|
@ -144,6 +154,8 @@ struct SCSIBus {
|
|||
|
||||
SCSISense unit_attention;
|
||||
const SCSIBusInfo *info;
|
||||
|
||||
int drain_count; /* protected by BQL */
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -213,6 +225,8 @@ void scsi_req_cancel_complete(SCSIRequest *req);
|
|||
void scsi_req_cancel(SCSIRequest *req);
|
||||
void scsi_req_cancel_async(SCSIRequest *req, Notifier *notifier);
|
||||
void scsi_req_retry(SCSIRequest *req);
|
||||
void scsi_device_drained_begin(SCSIDevice *sdev);
|
||||
void scsi_device_drained_end(SCSIDevice *sdev);
|
||||
void scsi_device_purge_requests(SCSIDevice *sdev, SCSISense sense);
|
||||
void scsi_device_set_ua(SCSIDevice *sdev, SCSISense sense);
|
||||
void scsi_device_report_change(SCSIDevice *dev, SCSISense sense);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue