diff mbox

[v6,6/8] virtio-scsi: use virtio wrappers to access headers

Message ID 20140328105756.21018.57522.stgit@bahia.local
State New
Headers show

Commit Message

Greg Kurz March 28, 2014, 10:57 a.m. UTC
From: Rusty Russell <rusty@rustcorp.com.au>

Note that st*_raw and ld*_raw are effectively replaced by st*_p and ld*_p.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
[ use per-device needs_byteswap flag,
  fix missing tswap32 in virtio_scsi_push_event(),
  Greg Kurz <gkurz@linux.vnet.ibm.com> ]
Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
---
 hw/scsi/virtio-scsi.c |   38 ++++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)

Comments

Greg Kurz March 28, 2014, 5:13 p.m. UTC | #1
On Fri, 28 Mar 2014 11:57:56 +0100
Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:

> From: Rusty Russell <rusty@rustcorp.com.au>
> 
> Note that st*_raw and ld*_raw are effectively replaced by st*_p and ld*_p.
> 
> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
> Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
> [ use per-device needs_byteswap flag,
>   fix missing tswap32 in virtio_scsi_push_event(),
>   Greg Kurz <gkurz@linux.vnet.ibm.com> ]
> Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
> ---
>  hw/scsi/virtio-scsi.c |   38 ++++++++++++++++++++------------------
>  1 file changed, 20 insertions(+), 18 deletions(-)
> 
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index b0d7517..20d326e 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -18,6 +18,7 @@
>  #include <hw/scsi/scsi.h>
>  #include <block/scsi.h>
>  #include <hw/virtio/virtio-bus.h>
> +#include "hw/virtio/virtio-access.h"
> 
>  typedef struct VirtIOSCSIReq {
>      VirtIOSCSI *dev;
> @@ -315,12 +316,12 @@ static void virtio_scsi_command_complete(SCSIRequest *r, uint32_t status,
>      req->resp.cmd->response = VIRTIO_SCSI_S_OK;
>      req->resp.cmd->status = status;
>      if (req->resp.cmd->status == GOOD) {
> -        req->resp.cmd->resid = tswap32(resid);
> +        req->resp.cmd->resid = virtio_tswap32(resid, VIRTIO_DEVICE(s));
>      } else {
>          req->resp.cmd->resid = 0;
>          sense_len = scsi_req_get_sense(r, req->resp.cmd->sense,
>                                         vs->sense_size);
> -        req->resp.cmd->sense_len = tswap32(sense_len);
> +        req->resp.cmd->sense_len = virtio_tswap32(sense_len, VIRTIO_DEVICE(s));
>      }
>      virtio_scsi_complete_req(req);
>  }
> @@ -416,16 +417,16 @@ static void virtio_scsi_get_config(VirtIODevice *vdev,
>      VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config;
>      VirtIOSCSICommon *s = VIRTIO_SCSI_COMMON(vdev);
> 
> -    stl_raw(&scsiconf->num_queues, s->conf.num_queues);
> -    stl_raw(&scsiconf->seg_max, 128 - 2);
> -    stl_raw(&scsiconf->max_sectors, s->conf.max_sectors);
> -    stl_raw(&scsiconf->cmd_per_lun, s->conf.cmd_per_lun);
> -    stl_raw(&scsiconf->event_info_size, sizeof(VirtIOSCSIEvent));
> -    stl_raw(&scsiconf->sense_size, s->sense_size);
> -    stl_raw(&scsiconf->cdb_size, s->cdb_size);
> -    stw_raw(&scsiconf->max_channel, VIRTIO_SCSI_MAX_CHANNEL);
> -    stw_raw(&scsiconf->max_target, VIRTIO_SCSI_MAX_TARGET);
> -    stl_raw(&scsiconf->max_lun, VIRTIO_SCSI_MAX_LUN);
> +    virtio_stl_p(&scsiconf->num_queues, s->conf.num_queues, vdev);
> +    virtio_stl_p(&scsiconf->seg_max, 128 - 2, vdev);
> +    virtio_stl_p(&scsiconf->max_sectors, s->conf.max_sectors, vdev);
> +    virtio_stl_p(&scsiconf->cmd_per_lun, s->conf.cmd_per_lun, vdev);
> +    virtio_stl_p(&scsiconf->event_info_size, sizeof(VirtIOSCSIEvent), vdev);
> +    virtio_stl_p(&scsiconf->sense_size, s->sense_size, vdev);
> +    virtio_stl_p(&scsiconf->cdb_size, s->cdb_size, vdev);
> +    virtio_stw_p(&scsiconf->max_channel, VIRTIO_SCSI_MAX_CHANNEL, vdev);
> +    virtio_stw_p(&scsiconf->max_target, VIRTIO_SCSI_MAX_TARGET, vdev);
> +    virtio_stl_p(&scsiconf->max_lun, VIRTIO_SCSI_MAX_LUN, vdev);
>  }
> 
>  static void virtio_scsi_set_config(VirtIODevice *vdev,
> @@ -434,14 +435,15 @@ static void virtio_scsi_set_config(VirtIODevice *vdev,
>      VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config;
>      VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev);
> 
> -    if ((uint32_t) ldl_raw(&scsiconf->sense_size) >= 65536 ||
> -        (uint32_t) ldl_raw(&scsiconf->cdb_size) >= 256) {
> +    if ((uint32_t) virtio_ldl_p(&scsiconf->sense_size,
> +                                vdev) >= 65536 ||
> +        (uint32_t) virtio_ldl_p(&scsiconf->cdb_size, vdev) >= 256) {
>          error_report("bad data written to virtio-scsi configuration space");
>          exit(1);
>      }
> 
> -    vs->sense_size = ldl_raw(&scsiconf->sense_size);
> -    vs->cdb_size = ldl_raw(&scsiconf->cdb_size);
> +    vs->sense_size = virtio_ldl_p(&scsiconf->sense_size, vdev);
> +    vs->cdb_size = virtio_ldl_p(&scsiconf->cdb_size, vdev);
>  }
> 
>  static uint32_t virtio_scsi_get_features(VirtIODevice *vdev,
> @@ -519,8 +521,8 @@ static void virtio_scsi_push_event(VirtIOSCSI *s, SCSIDevice *dev,
> 
>      evt = req->resp.event;
>      memset(evt, 0, sizeof(VirtIOSCSIEvent));
> -    evt->event = event;
> -    evt->reason = reason;
> +    evt->event = virtio_tswap32(event);
> +    evt->reason = virtio_tswap32(reason);

My bad again, it should be:

 +    evt->event = virtio_tswap32(event, vdev);
 +    evt->reason = virtio_tswap32(reason, vdev);

>      if (!dev) {
>          assert(event == VIRTIO_SCSI_T_EVENTS_MISSED);
>      } else {
> 
>
Andreas Färber March 28, 2014, 5:21 p.m. UTC | #2
Am 28.03.2014 18:13, schrieb Greg Kurz:
> On Fri, 28 Mar 2014 11:57:56 +0100
> Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:
>> @@ -519,8 +521,8 @@ static void virtio_scsi_push_event(VirtIOSCSI *s, SCSIDevice *dev,
>>
>>      evt = req->resp.event;
>>      memset(evt, 0, sizeof(VirtIOSCSIEvent));
>> -    evt->event = event;
>> -    evt->reason = reason;
>> +    evt->event = virtio_tswap32(event);
>> +    evt->reason = virtio_tswap32(reason);
> 
> My bad again, it should be:
> 
>  +    evt->event = virtio_tswap32(event, vdev);
>  +    evt->reason = virtio_tswap32(reason, vdev);

Pure bikeshedding, but wouldn't it make sense to have the vdev as first
argument?

Regards,
Andreas
Greg Kurz March 28, 2014, 5:37 p.m. UTC | #3
On Fri, 28 Mar 2014 18:21:43 +0100
Andreas Färber <afaerber@suse.de> wrote:

> Am 28.03.2014 18:13, schrieb Greg Kurz:
> > On Fri, 28 Mar 2014 11:57:56 +0100
> > Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:
> >> @@ -519,8 +521,8 @@ static void virtio_scsi_push_event(VirtIOSCSI *s, SCSIDevice *dev,
> >>
> >>      evt = req->resp.event;
> >>      memset(evt, 0, sizeof(VirtIOSCSIEvent));
> >> -    evt->event = event;
> >> -    evt->reason = reason;
> >> +    evt->event = virtio_tswap32(event);
> >> +    evt->reason = virtio_tswap32(reason);
> > 
> > My bad again, it should be:
> > 
> >  +    evt->event = virtio_tswap32(event, vdev);
> >  +    evt->reason = virtio_tswap32(reason, vdev);
> 
> Pure bikeshedding, but wouldn't it make sense to have the vdev as first
> argument?
> 

I have thought about it also... it would make sense to do the same with
all the other helpers in virtio-access.h then.

And while we are at it, since we pass &address_space_memory to all occurences
of virtio_*_phys() and I don't see why we would change that, maybe we
can also move that into the helpers. Thoughts ?

> Regards,
> Andreas
> 

Thanks.
Peter Maydell March 28, 2014, 5:43 p.m. UTC | #4
On 28 March 2014 17:37, Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:
> And while we are at it, since we pass &address_space_memory to all
> occurences of virtio_*_phys() and I don't see why we would change
> that, maybe we can also move that into the helpers. Thoughts ?

In the longer term I'm hoping that references to
&address_space_memory go away -- we should be modelling
separate address spaces per CPU and per every other
thing that can act as a DMA master (ie issue memory
transactions). I'm not sure exactly how virtio ought to
work since these accesses directly to memory are a total
hack, but probably we will end up setting the virtio
device up and handing it an AddressSpace* that it should use.

thanks
-- PMM
Greg Kurz March 28, 2014, 6:04 p.m. UTC | #5
On Fri, 28 Mar 2014 17:43:07 +0000
Peter Maydell <peter.maydell@linaro.org> wrote:

> On 28 March 2014 17:37, Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:
> > And while we are at it, since we pass &address_space_memory to all
> > occurences of virtio_*_phys() and I don't see why we would change
> > that, maybe we can also move that into the helpers. Thoughts ?
> 
> In the longer term I'm hoping that references to
> &address_space_memory go away -- we should be modelling
> separate address spaces per CPU and per every other
> thing that can act as a DMA master (ie issue memory
> transactions). I'm not sure exactly how virtio ought to
> work since these accesses directly to memory are a total
> hack, but probably we will end up setting the virtio
> device up and handing it an AddressSpace* that it should use.
> 

Ok, I am now convinced. Let's make struct VirtIODevice* be the
first argument for all helpers and kill the AddressSpace* one.
Unless you envision we could end up with different address spaces
accross multiple virtio devices, I would then do as proposed
above... Even if we add an AddressSpace* to devices, the API
will remain the same.

> thanks
> -- PMM
> 

Cheers.
Peter Maydell March 28, 2014, 6:14 p.m. UTC | #6
On 28 March 2014 18:04, Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:
> Ok, I am now convinced. Let's make struct VirtIODevice* be the
> first argument for all helpers and kill the AddressSpace* one.
> Unless you envision we could end up with different address spaces
> accross multiple virtio devices

Well, any one virtio device would always use the same AddressSpace,
but consider a system model with two separate models of different
PCs in it, each of which has  its own self-contained memory, PCI
bus and virtio devices...

thanks
-- PMM
Greg Kurz March 28, 2014, 6:58 p.m. UTC | #7
On Fri, 28 Mar 2014 18:14:55 +0000
Peter Maydell <peter.maydell@linaro.org> wrote:

> On 28 March 2014 18:04, Greg Kurz <gkurz@linux.vnet.ibm.com> wrote:
> > Ok, I am now convinced. Let's make struct VirtIODevice* be the
> > first argument for all helpers and kill the AddressSpace* one.
> > Unless you envision we could end up with different address spaces
> > accross multiple virtio devices
> 
> Well, any one virtio device would always use the same AddressSpace,
> but consider a system model with two separate models of different
> PCs in it, each of which has  its own self-contained memory, PCI
> bus and virtio devices...
> 

A per-device AddressSpace* property would be more appropriate then. Correct ?

> thanks
> -- PMM
>
Alexander Graf March 31, 2014, 4:34 p.m. UTC | #8
On 03/28/2014 11:57 AM, Greg Kurz wrote:
> From: Rusty Russell <rusty@rustcorp.com.au>
>
> Note that st*_raw and ld*_raw are effectively replaced by st*_p and ld*_p.
>
> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
> Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>
> [ use per-device needs_byteswap flag,
>    fix missing tswap32 in virtio_scsi_push_event(),
>    Greg Kurz <gkurz@linux.vnet.ibm.com> ]
> Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com>
> ---
>   hw/scsi/virtio-scsi.c |   38 ++++++++++++++++++++------------------
>   1 file changed, 20 insertions(+), 18 deletions(-)
>
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index b0d7517..20d326e 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -18,6 +18,7 @@
>   #include <hw/scsi/scsi.h>
>   #include <block/scsi.h>
>   #include <hw/virtio/virtio-bus.h>
> +#include "hw/virtio/virtio-access.h"

Just a small nit, but I spot some inconsitency in < and " usage here :)


Alex
diff mbox

Patch

diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index b0d7517..20d326e 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -18,6 +18,7 @@ 
 #include <hw/scsi/scsi.h>
 #include <block/scsi.h>
 #include <hw/virtio/virtio-bus.h>
+#include "hw/virtio/virtio-access.h"
 
 typedef struct VirtIOSCSIReq {
     VirtIOSCSI *dev;
@@ -315,12 +316,12 @@  static void virtio_scsi_command_complete(SCSIRequest *r, uint32_t status,
     req->resp.cmd->response = VIRTIO_SCSI_S_OK;
     req->resp.cmd->status = status;
     if (req->resp.cmd->status == GOOD) {
-        req->resp.cmd->resid = tswap32(resid);
+        req->resp.cmd->resid = virtio_tswap32(resid, VIRTIO_DEVICE(s));
     } else {
         req->resp.cmd->resid = 0;
         sense_len = scsi_req_get_sense(r, req->resp.cmd->sense,
                                        vs->sense_size);
-        req->resp.cmd->sense_len = tswap32(sense_len);
+        req->resp.cmd->sense_len = virtio_tswap32(sense_len, VIRTIO_DEVICE(s));
     }
     virtio_scsi_complete_req(req);
 }
@@ -416,16 +417,16 @@  static void virtio_scsi_get_config(VirtIODevice *vdev,
     VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config;
     VirtIOSCSICommon *s = VIRTIO_SCSI_COMMON(vdev);
 
-    stl_raw(&scsiconf->num_queues, s->conf.num_queues);
-    stl_raw(&scsiconf->seg_max, 128 - 2);
-    stl_raw(&scsiconf->max_sectors, s->conf.max_sectors);
-    stl_raw(&scsiconf->cmd_per_lun, s->conf.cmd_per_lun);
-    stl_raw(&scsiconf->event_info_size, sizeof(VirtIOSCSIEvent));
-    stl_raw(&scsiconf->sense_size, s->sense_size);
-    stl_raw(&scsiconf->cdb_size, s->cdb_size);
-    stw_raw(&scsiconf->max_channel, VIRTIO_SCSI_MAX_CHANNEL);
-    stw_raw(&scsiconf->max_target, VIRTIO_SCSI_MAX_TARGET);
-    stl_raw(&scsiconf->max_lun, VIRTIO_SCSI_MAX_LUN);
+    virtio_stl_p(&scsiconf->num_queues, s->conf.num_queues, vdev);
+    virtio_stl_p(&scsiconf->seg_max, 128 - 2, vdev);
+    virtio_stl_p(&scsiconf->max_sectors, s->conf.max_sectors, vdev);
+    virtio_stl_p(&scsiconf->cmd_per_lun, s->conf.cmd_per_lun, vdev);
+    virtio_stl_p(&scsiconf->event_info_size, sizeof(VirtIOSCSIEvent), vdev);
+    virtio_stl_p(&scsiconf->sense_size, s->sense_size, vdev);
+    virtio_stl_p(&scsiconf->cdb_size, s->cdb_size, vdev);
+    virtio_stw_p(&scsiconf->max_channel, VIRTIO_SCSI_MAX_CHANNEL, vdev);
+    virtio_stw_p(&scsiconf->max_target, VIRTIO_SCSI_MAX_TARGET, vdev);
+    virtio_stl_p(&scsiconf->max_lun, VIRTIO_SCSI_MAX_LUN, vdev);
 }
 
 static void virtio_scsi_set_config(VirtIODevice *vdev,
@@ -434,14 +435,15 @@  static void virtio_scsi_set_config(VirtIODevice *vdev,
     VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config;
     VirtIOSCSICommon *vs = VIRTIO_SCSI_COMMON(vdev);
 
-    if ((uint32_t) ldl_raw(&scsiconf->sense_size) >= 65536 ||
-        (uint32_t) ldl_raw(&scsiconf->cdb_size) >= 256) {
+    if ((uint32_t) virtio_ldl_p(&scsiconf->sense_size,
+                                vdev) >= 65536 ||
+        (uint32_t) virtio_ldl_p(&scsiconf->cdb_size, vdev) >= 256) {
         error_report("bad data written to virtio-scsi configuration space");
         exit(1);
     }
 
-    vs->sense_size = ldl_raw(&scsiconf->sense_size);
-    vs->cdb_size = ldl_raw(&scsiconf->cdb_size);
+    vs->sense_size = virtio_ldl_p(&scsiconf->sense_size, vdev);
+    vs->cdb_size = virtio_ldl_p(&scsiconf->cdb_size, vdev);
 }
 
 static uint32_t virtio_scsi_get_features(VirtIODevice *vdev,
@@ -519,8 +521,8 @@  static void virtio_scsi_push_event(VirtIOSCSI *s, SCSIDevice *dev,
 
     evt = req->resp.event;
     memset(evt, 0, sizeof(VirtIOSCSIEvent));
-    evt->event = event;
-    evt->reason = reason;
+    evt->event = virtio_tswap32(event);
+    evt->reason = virtio_tswap32(reason);
     if (!dev) {
         assert(event == VIRTIO_SCSI_T_EVENTS_MISSED);
     } else {