virtio-scsi-dataplane: Add op blocker
We need this to protect dataplane thread from race conditions with block jobs until the latter is made dataplane-safe. Signed-off-by: Fam Zheng <famz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									e40830afa1
								
							
						
					
					
						commit
						3e2b2a9c49
					
				| 
						 | 
				
			
			@ -155,6 +155,8 @@ void virtio_scsi_dataplane_start(VirtIOSCSI *s)
 | 
			
		|||
 | 
			
		||||
    s->dataplane_starting = true;
 | 
			
		||||
 | 
			
		||||
    assert(!s->blocker);
 | 
			
		||||
    error_setg(&s->blocker, "block device is in use by data plane");
 | 
			
		||||
    /* Set up guest notifier (irq) */
 | 
			
		||||
    rc = k->set_guest_notifiers(qbus->parent, vs->conf.num_queues + 2, true);
 | 
			
		||||
    if (rc != 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -195,6 +197,8 @@ void virtio_scsi_dataplane_stop(VirtIOSCSI *s)
 | 
			
		|||
    if (!s->dataplane_started || s->dataplane_stopping) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    error_free(s->blocker);
 | 
			
		||||
    s->blocker = NULL;
 | 
			
		||||
    s->dataplane_stopping = true;
 | 
			
		||||
    assert(s->ctx == iothread_get_aio_context(vs->conf.iothread));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -742,9 +742,18 @@ static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
 | 
			
		|||
                                Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
 | 
			
		||||
    VirtIOSCSI *s = VIRTIO_SCSI(vdev);
 | 
			
		||||
    SCSIDevice *sd = SCSI_DEVICE(dev);
 | 
			
		||||
 | 
			
		||||
    if (s->ctx && !s->dataplane_disabled) {
 | 
			
		||||
        if (blk_op_is_blocked(sd->conf.blk, BLOCK_OP_TYPE_DATAPLANE, errp)) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        blk_op_block_all(sd->conf.blk, s->blocker);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((vdev->guest_features >> VIRTIO_SCSI_F_HOTPLUG) & 1) {
 | 
			
		||||
        virtio_scsi_push_event(VIRTIO_SCSI(hotplug_dev), SCSI_DEVICE(dev),
 | 
			
		||||
        virtio_scsi_push_event(s, sd,
 | 
			
		||||
                               VIRTIO_SCSI_T_TRANSPORT_RESET,
 | 
			
		||||
                               VIRTIO_SCSI_EVT_RESET_RESCAN);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -754,12 +763,18 @@ static void virtio_scsi_hotunplug(HotplugHandler *hotplug_dev, DeviceState *dev,
 | 
			
		|||
                                  Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
 | 
			
		||||
    VirtIOSCSI *s = VIRTIO_SCSI(vdev);
 | 
			
		||||
    SCSIDevice *sd = SCSI_DEVICE(dev);
 | 
			
		||||
 | 
			
		||||
    if ((vdev->guest_features >> VIRTIO_SCSI_F_HOTPLUG) & 1) {
 | 
			
		||||
        virtio_scsi_push_event(VIRTIO_SCSI(hotplug_dev), SCSI_DEVICE(dev),
 | 
			
		||||
        virtio_scsi_push_event(s, sd,
 | 
			
		||||
                               VIRTIO_SCSI_T_TRANSPORT_RESET,
 | 
			
		||||
                               VIRTIO_SCSI_EVT_RESET_REMOVED);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (s->ctx) {
 | 
			
		||||
        blk_op_unblock_all(sd->conf.blk, s->blocker);
 | 
			
		||||
    }
 | 
			
		||||
    qdev_simple_device_unplug_cb(hotplug_dev, dev, errp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -195,6 +195,7 @@ typedef struct VirtIOSCSI {
 | 
			
		|||
    bool dataplane_starting;
 | 
			
		||||
    bool dataplane_stopping;
 | 
			
		||||
    bool dataplane_disabled;
 | 
			
		||||
    Error *blocker;
 | 
			
		||||
    Notifier migration_state_notifier;
 | 
			
		||||
} VirtIOSCSI;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue