qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] scsi: Switch to bus_cold_reset() and device_cold_reset()
@ 2022-10-13 16:06 Peter Maydell
  2022-10-13 16:06 ` [PATCH 1/2] scsi: Use device_cold_reset() and bus_cold_reset() Peter Maydell
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Peter Maydell @ 2022-10-13 16:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Fam Zheng, Hannes Reinecke, Cédric Le Goater,
	Daniel Henrique Barboza, Greg Kurz, Michael S. Tsirkin,
	Dmitry Fleytman, qemu-block, qemu-ppc

Back in 2020 we introduced a new set of reset APIs (the "3-phase
reset" system, as documented in docs/devel/reset.rst), but we left a
lot of the existing uses of older reset functions alone.

This patchset converts the SCSI subsystem to use the newer
device_cold_reset() and bus_cold_reset() instead of the old and
now-deprecated qdev_reset_all() and qbus_reset_all().

The semantics of qdev_reset_all() are that it recursively resets all
the devices on the qbus tree starting from the device you pass in,
resetting the child buses first and the device itself last. 
qbus_reset_all() is similar, except it starts with a qbus rather than
a qdev.  In both cases, the bus is reset by calling the
BusClass::reset method, and the device by calling DeviceClass::reset.

device_cold_reset() and bus_cold_reset() have identical "recursive
reset, children first" semantics, except that they are
three-phase-reset aware (and can handle both a newer device that
implements the 3 phases, and also older devices that only implement
the DeviceState::reset method).

I think we should be able to change to these new functions
mechanically across the whole codebase without any change in
behaviour, but my experience with reset is that it's not uncommon for
there to be lurking unforeseen consequences.  So I've opted to start
by just changing the SCSI subsystem, which has about half of the uses
of these deprecated functions.  Assuming this works out OK I'll
proceed to the rest of the tree.

Patch 1 does the qdev_reset_all() -> device_cold_reset() and
qbus_reset_all() -> bus_cold_reset() change (mechanically
generated using sed).

Patch 2 tidies up a loose end where one SCSI controller was using
device_legacy_reset() to do the "reset a device" action (harmlessly,
as no SCSI devices have further child buses, so the behaviour
was the same as qdev_reset_all() and device_cold_reset().

NB: tested only with 'make check' and 'make check-avocado'.

thanks
-- PMM

Peter Maydell (2):
  scsi: Use device_cold_reset() and bus_cold_reset()
  hw/scsi/vmw_pvscsi.c: Use device_cold_reset() to reset SCSI devices

 hw/scsi/esp.c         | 2 +-
 hw/scsi/lsi53c895a.c  | 4 ++--
 hw/scsi/megasas.c     | 2 +-
 hw/scsi/mptsas.c      | 8 ++++----
 hw/scsi/spapr_vscsi.c | 2 +-
 hw/scsi/virtio-scsi.c | 6 +++---
 hw/scsi/vmw_pvscsi.c  | 6 +++---
 7 files changed, 15 insertions(+), 15 deletions(-)

-- 
2.25.1



^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] scsi: Use device_cold_reset() and bus_cold_reset()
  2022-10-13 16:06 [PATCH 0/2] scsi: Switch to bus_cold_reset() and device_cold_reset() Peter Maydell
@ 2022-10-13 16:06 ` Peter Maydell
  2022-10-13 16:06 ` [PATCH 2/2] hw/scsi/vmw_pvscsi.c: Use device_cold_reset() to reset SCSI devices Peter Maydell
  2022-10-13 20:36 ` [PATCH 0/2] scsi: Switch to bus_cold_reset() and device_cold_reset() Paolo Bonzini
  2 siblings, 0 replies; 4+ messages in thread
From: Peter Maydell @ 2022-10-13 16:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Fam Zheng, Hannes Reinecke, Cédric Le Goater,
	Daniel Henrique Barboza, Greg Kurz, Michael S. Tsirkin,
	Dmitry Fleytman, qemu-block, qemu-ppc

In the SCSI subsystem we currently use the legacy functions
qdev_reset_all() and qbus_reset_all().  These perform a recursive
reset, starting from either a qbus or a qdev.  However they do not
permit any of the devices in the tree to use three-phase reset,
because device reset goes through the device_legacy_reset() function
that only calls the single DeviceClass::reset method.

Switch to using the device_cold_reset() and bus_cold_reset()
functions.  These also perform a recursive reset, where first the
children are reset and then finally the parent, but they use the new
(...in 2020...) Resettable mechanism, which supports both the old
style single-reset method and also the new 3-phase reset handling.

Since no devices attached to SCSI buses currently try to use 3-phase
reset, this should be a no-behaviour-change commit which just reduces
the use of a deprecated API.

Commit created with:
  sed -i -e 's/qdev_reset_all/device_cold_reset/g;s/qbus_reset_all/bus_cold_reset/g' hw/scsi/*.c

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 hw/scsi/esp.c         | 2 +-
 hw/scsi/lsi53c895a.c  | 4 ++--
 hw/scsi/megasas.c     | 2 +-
 hw/scsi/mptsas.c      | 8 ++++----
 hw/scsi/spapr_vscsi.c | 2 +-
 hw/scsi/virtio-scsi.c | 6 +++---
 hw/scsi/vmw_pvscsi.c  | 4 ++--
 7 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
index 2ff18ce5008..e5b281e836a 100644
--- a/hw/scsi/esp.c
+++ b/hw/scsi/esp.c
@@ -941,7 +941,7 @@ static void esp_soft_reset(ESPState *s)
 
 static void esp_bus_reset(ESPState *s)
 {
-    qbus_reset_all(BUS(&s->bus));
+    bus_cold_reset(BUS(&s->bus));
 }
 
 static void parent_esp_reset(ESPState *s, int irq, int level)
diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c
index 05a43ec8071..50979640c32 100644
--- a/hw/scsi/lsi53c895a.c
+++ b/hw/scsi/lsi53c895a.c
@@ -1868,7 +1868,7 @@ static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val)
         }
         if (val & LSI_SCNTL1_RST) {
             if (!(s->sstat0 & LSI_SSTAT0_RST)) {
-                qbus_reset_all(BUS(&s->bus));
+                bus_cold_reset(BUS(&s->bus));
                 s->sstat0 |= LSI_SSTAT0_RST;
                 lsi_script_scsi_interrupt(s, LSI_SIST0_RST, 0);
             }
@@ -1926,7 +1926,7 @@ static void lsi_reg_writeb(LSIState *s, int offset, uint8_t val)
             lsi_execute_script(s);
         }
         if (val & LSI_ISTAT0_SRST) {
-            qdev_reset_all(DEVICE(s));
+            device_cold_reset(DEVICE(s));
         }
         break;
     case 0x16: /* MBOX0 */
diff --git a/hw/scsi/megasas.c b/hw/scsi/megasas.c
index 7082456d653..9cbbb16121d 100644
--- a/hw/scsi/megasas.c
+++ b/hw/scsi/megasas.c
@@ -1484,7 +1484,7 @@ static int megasas_cluster_reset_ld(MegasasState *s, MegasasCmd *cmd)
         MegasasCmd *tmp_cmd = &s->frames[i];
         if (tmp_cmd->req && tmp_cmd->req->dev->id == target_id) {
             SCSIDevice *d = tmp_cmd->req->dev;
-            qdev_reset_all(&d->qdev);
+            device_cold_reset(&d->qdev);
         }
     }
     return MFI_STAT_OK;
diff --git a/hw/scsi/mptsas.c b/hw/scsi/mptsas.c
index a90c2546f10..c485da792c9 100644
--- a/hw/scsi/mptsas.c
+++ b/hw/scsi/mptsas.c
@@ -522,7 +522,7 @@ reply_maybe_async:
             reply.ResponseCode = MPI_SCSITASKMGMT_RSP_TM_INVALID_LUN;
             goto out;
         }
-        qdev_reset_all(&sdev->qdev);
+        device_cold_reset(&sdev->qdev);
         break;
 
     case MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET:
@@ -538,13 +538,13 @@ reply_maybe_async:
         QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
             sdev = SCSI_DEVICE(kid->child);
             if (sdev->channel == 0 && sdev->id == req->TargetID) {
-                qdev_reset_all(kid->child);
+                device_cold_reset(kid->child);
             }
         }
         break;
 
     case MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS:
-        qbus_reset_all(BUS(&s->bus));
+        bus_cold_reset(BUS(&s->bus));
         break;
 
     default:
@@ -807,7 +807,7 @@ static void mptsas_soft_reset(MPTSASState *s)
     s->intr_mask = MPI_HIM_DIM | MPI_HIM_RIM;
     mptsas_update_interrupt(s);
 
-    qbus_reset_all(BUS(&s->bus));
+    bus_cold_reset(BUS(&s->bus));
     s->intr_status = 0;
     s->intr_mask = save_mask;
 
diff --git a/hw/scsi/spapr_vscsi.c b/hw/scsi/spapr_vscsi.c
index 0a8cbf5a4b5..5bbbef64ef3 100644
--- a/hw/scsi/spapr_vscsi.c
+++ b/hw/scsi/spapr_vscsi.c
@@ -865,7 +865,7 @@ static int vscsi_process_tsk_mgmt(VSCSIState *s, vscsi_req *req)
                 break;
             }
 
-            qdev_reset_all(&d->qdev);
+            device_cold_reset(&d->qdev);
             break;
 
         case SRP_TSK_ABORT_TASK_SET:
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index 41f2a563017..2dd40dcf90b 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -365,7 +365,7 @@ static int virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq *req)
             goto incorrect_lun;
         }
         s->resetting++;
-        qdev_reset_all(&d->qdev);
+        device_cold_reset(&d->qdev);
         s->resetting--;
         break;
 
@@ -417,7 +417,7 @@ static int virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq *req)
         QTAILQ_FOREACH_RCU(kid, &s->bus.qbus.children, sibling) {
             SCSIDevice *d1 = SCSI_DEVICE(kid->child);
             if (d1->channel == 0 && d1->id == target) {
-                qdev_reset_all(&d1->qdev);
+                device_cold_reset(&d1->qdev);
             }
         }
         rcu_read_unlock();
@@ -831,7 +831,7 @@ static void virtio_scsi_reset(VirtIODevice *vdev)
 
     assert(!s->dataplane_started);
     s->resetting++;
-    qbus_reset_all(BUS(&s->bus));
+    bus_cold_reset(BUS(&s->bus));
     s->resetting--;
 
     vs->sense_size = VIRTIO_SCSI_SENSE_DEFAULT_SIZE;
diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c
index 91e2f858aba..3ea2c8c9f23 100644
--- a/hw/scsi/vmw_pvscsi.c
+++ b/hw/scsi/vmw_pvscsi.c
@@ -445,7 +445,7 @@ static void
 pvscsi_reset_adapter(PVSCSIState *s)
 {
     s->resetting++;
-    qbus_reset_all(BUS(&s->bus));
+    bus_cold_reset(BUS(&s->bus));
     s->resetting--;
     pvscsi_process_completion_queue(s);
     assert(QTAILQ_EMPTY(&s->pending_queue));
@@ -894,7 +894,7 @@ pvscsi_on_cmd_reset_bus(PVSCSIState *s)
     trace_pvscsi_on_cmd_arrived("PVSCSI_CMD_RESET_BUS");
 
     s->resetting++;
-    qbus_reset_all(BUS(&s->bus));
+    bus_cold_reset(BUS(&s->bus));
     s->resetting--;
     return PVSCSI_COMMAND_PROCESSING_SUCCEEDED;
 }
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] hw/scsi/vmw_pvscsi.c: Use device_cold_reset() to reset SCSI devices
  2022-10-13 16:06 [PATCH 0/2] scsi: Switch to bus_cold_reset() and device_cold_reset() Peter Maydell
  2022-10-13 16:06 ` [PATCH 1/2] scsi: Use device_cold_reset() and bus_cold_reset() Peter Maydell
@ 2022-10-13 16:06 ` Peter Maydell
  2022-10-13 20:36 ` [PATCH 0/2] scsi: Switch to bus_cold_reset() and device_cold_reset() Paolo Bonzini
  2 siblings, 0 replies; 4+ messages in thread
From: Peter Maydell @ 2022-10-13 16:06 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Fam Zheng, Hannes Reinecke, Cédric Le Goater,
	Daniel Henrique Barboza, Greg Kurz, Michael S. Tsirkin,
	Dmitry Fleytman, qemu-block, qemu-ppc

Currently the vwm_pvscsi controller resets individual SCSI devices
with the device_legacy_reset() function.  The only difference between
this and device_cold_reset() is that device_legacy_reset() resets the
device but not any child qbuses it might have.

In this case, no SCSI device has a child qbus, so the functions have
the same behaviour.  Switch to device_cold_reset() to move away from
using the deprecated function, and bring this SCSI controller in to
line with what all the others do.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 hw/scsi/vmw_pvscsi.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c
index 3ea2c8c9f23..fa766968550 100644
--- a/hw/scsi/vmw_pvscsi.c
+++ b/hw/scsi/vmw_pvscsi.c
@@ -880,7 +880,7 @@ pvscsi_on_cmd_reset_device(PVSCSIState *s)
 
     if (sdev != NULL) {
         s->resetting++;
-        device_legacy_reset(&sdev->qdev);
+        device_cold_reset(&sdev->qdev);
         s->resetting--;
         return PVSCSI_COMMAND_PROCESSING_SUCCEEDED;
     }
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 0/2] scsi: Switch to bus_cold_reset() and device_cold_reset()
  2022-10-13 16:06 [PATCH 0/2] scsi: Switch to bus_cold_reset() and device_cold_reset() Peter Maydell
  2022-10-13 16:06 ` [PATCH 1/2] scsi: Use device_cold_reset() and bus_cold_reset() Peter Maydell
  2022-10-13 16:06 ` [PATCH 2/2] hw/scsi/vmw_pvscsi.c: Use device_cold_reset() to reset SCSI devices Peter Maydell
@ 2022-10-13 20:36 ` Paolo Bonzini
  2 siblings, 0 replies; 4+ messages in thread
From: Paolo Bonzini @ 2022-10-13 20:36 UTC (permalink / raw)
  To: Peter Maydell
  Cc: qemu-devel, Fam Zheng, Hannes Reinecke, Cédric Le Goater,
	Daniel Henrique Barboza, Greg Kurz, Michael S . Tsirkin,
	Dmitry Fleytman, qemu-block, qemu-ppc

Queued, thanks.

Paolo



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-10-13 20:40 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-13 16:06 [PATCH 0/2] scsi: Switch to bus_cold_reset() and device_cold_reset() Peter Maydell
2022-10-13 16:06 ` [PATCH 1/2] scsi: Use device_cold_reset() and bus_cold_reset() Peter Maydell
2022-10-13 16:06 ` [PATCH 2/2] hw/scsi/vmw_pvscsi.c: Use device_cold_reset() to reset SCSI devices Peter Maydell
2022-10-13 20:36 ` [PATCH 0/2] scsi: Switch to bus_cold_reset() and device_cold_reset() Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).