|
@@ -948,7 +948,10 @@ static void virtio_scsi_reset(VirtIODevice *vdev)
|
|
|
|
|
|
vs->sense_size = VIRTIO_SCSI_SENSE_DEFAULT_SIZE;
|
|
|
vs->cdb_size = VIRTIO_SCSI_CDB_DEFAULT_SIZE;
|
|
|
- s->events_dropped = false;
|
|
|
+
|
|
|
+ WITH_QEMU_LOCK_GUARD(&s->event_lock) {
|
|
|
+ s->events_dropped = false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
typedef struct {
|
|
@@ -978,14 +981,16 @@ static void virtio_scsi_push_event(VirtIOSCSI *s,
|
|
|
}
|
|
|
|
|
|
req = virtio_scsi_pop_req(s, vs->event_vq, &s->event_lock);
|
|
|
- if (!req) {
|
|
|
- s->events_dropped = true;
|
|
|
- return;
|
|
|
- }
|
|
|
+ WITH_QEMU_LOCK_GUARD(&s->event_lock) {
|
|
|
+ if (!req) {
|
|
|
+ s->events_dropped = true;
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (s->events_dropped) {
|
|
|
- event |= VIRTIO_SCSI_T_EVENTS_MISSED;
|
|
|
- s->events_dropped = false;
|
|
|
+ if (s->events_dropped) {
|
|
|
+ event |= VIRTIO_SCSI_T_EVENTS_MISSED;
|
|
|
+ s->events_dropped = false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (virtio_scsi_parse_req(req, 0, sizeof(VirtIOSCSIEvent))) {
|
|
@@ -1014,7 +1019,13 @@ static void virtio_scsi_push_event(VirtIOSCSI *s,
|
|
|
|
|
|
static void virtio_scsi_handle_event_vq(VirtIOSCSI *s, VirtQueue *vq)
|
|
|
{
|
|
|
- if (s->events_dropped) {
|
|
|
+ bool events_dropped;
|
|
|
+
|
|
|
+ WITH_QEMU_LOCK_GUARD(&s->event_lock) {
|
|
|
+ events_dropped = s->events_dropped;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (events_dropped) {
|
|
|
VirtIOSCSIEventInfo info = {
|
|
|
.event = VIRTIO_SCSI_T_NO_EVENT,
|
|
|
};
|