qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin O'Connor <kevin@koconnor.net>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: seabios@seabios.org, qemu-devel@nongnu.org,
	"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [SeaBIOS] [PATCH v2 03/22] virtio: add struct vp_device
Date: Tue, 30 Jun 2015 10:33:49 -0400	[thread overview]
Message-ID: <20150630143349.GA6954@morn.localdomain> (raw)
In-Reply-To: <1435653553-7728-4-git-send-email-kraxel@redhat.com>

On Tue, Jun 30, 2015 at 10:38:54AM +0200, Gerd Hoffmann wrote:
> For virtio 1.0 support we will need more state than just the (legacy
> mode) ioaddr for each virtio-pci device.  Prepare for that by adding
> a new struct for it.  For now it carries the ioaddr only.
> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  src/hw/virtio-blk.c  | 20 ++++++++++----------
>  src/hw/virtio-pci.c  | 15 +++++++++------
>  src/hw/virtio-pci.h  | 46 +++++++++++++++++++++++++++-------------------
>  src/hw/virtio-ring.c |  4 ++--
>  src/hw/virtio-ring.h |  3 ++-
>  src/hw/virtio-scsi.c | 32 +++++++++++++++++---------------
>  6 files changed, 67 insertions(+), 53 deletions(-)
> 
> diff --git a/src/hw/virtio-blk.c b/src/hw/virtio-blk.c
> index 15ac171..13cf09a 100644
> --- a/src/hw/virtio-blk.c
> +++ b/src/hw/virtio-blk.c
> @@ -25,7 +25,7 @@
>  struct virtiodrive_s {
>      struct drive_s drive;
>      struct vring_virtqueue *vq;
> -    u16 ioaddr;
> +    struct vp_device *vp;
>  };
>  
>  static int
> @@ -60,7 +60,7 @@ virtio_blk_op(struct disk_op_s *op, int write)
>          vring_add_buf(vq, sg, 2, 1, 0, 0);
>      else
>          vring_add_buf(vq, sg, 1, 2, 0, 0);
> -    vring_kick(GET_GLOBALFLAT(vdrive_gf->ioaddr), vq, 1);
> +    vring_kick(GET_GLOBALFLAT(vdrive_gf->vp), vq, 1);
>  
>      /* Wait for reply */
>      while (!vring_more_used(vq))
> @@ -72,7 +72,7 @@ virtio_blk_op(struct disk_op_s *op, int write)
>      /* Clear interrupt status register.  Avoid leaving interrupts stuck if
>       * VRING_AVAIL_F_NO_INTERRUPT was ignored and interrupts were raised.
>       */
> -    vp_get_isr(GET_GLOBALFLAT(vdrive_gf->ioaddr));
> +    vp_get_isr(GET_GLOBALFLAT(vdrive_gf->vp));
>  
>      return status == VIRTIO_BLK_S_OK ? DISK_RET_SUCCESS : DISK_RET_EBADTRACK;
>  }
> @@ -113,18 +113,17 @@ init_virtio_blk(struct pci_device *pci)
>      vdrive->drive.type = DTYPE_VIRTIO_BLK;
>      vdrive->drive.cntl_id = bdf;
>  
> -    u16 ioaddr = vp_init_simple(bdf);
> -    vdrive->ioaddr = ioaddr;
> -    if (vp_find_vq(ioaddr, 0, &vdrive->vq) < 0 ) {
> +    vdrive->vp = vp_init_simple(bdf);
> +    if (vp_find_vq(vdrive->vp, 0, &vdrive->vq) < 0 ) {
>          dprintf(1, "fail to find vq for virtio-blk %x:%x\n",
>                  pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf));
>          goto fail;
>      }
>  
>      struct virtio_blk_config cfg;
> -    vp_get(ioaddr, 0, &cfg, sizeof(cfg));
> +    vp_get(vdrive->vp, 0, &cfg, sizeof(cfg));
>  
> -    u32 f = vp_get_features(ioaddr);
> +    u32 f = vp_get_features(vdrive->vp);
>      vdrive->drive.blksize = (f & (1 << VIRTIO_BLK_F_BLK_SIZE)) ?
>          cfg.blk_size : DISK_SECTOR_SIZE;
>  
> @@ -148,12 +147,13 @@ init_virtio_blk(struct pci_device *pci)
>  
>      boot_add_hd(&vdrive->drive, desc, bootprio_find_pci_device(pci));
>  
> -    vp_set_status(ioaddr, VIRTIO_CONFIG_S_ACKNOWLEDGE |
> +    vp_set_status(vdrive->vp, VIRTIO_CONFIG_S_ACKNOWLEDGE |
>                    VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK);
>      return;
>  
>  fail:
> -    vp_reset(ioaddr);
> +    vp_reset(vdrive->vp);
> +    free(vdrive->vp);
>      free(vdrive->vq);
>      free(vdrive);
>  }
> diff --git a/src/hw/virtio-pci.c b/src/hw/virtio-pci.c
> index b9b3ab1..3cd478d 100644
> --- a/src/hw/virtio-pci.c
> +++ b/src/hw/virtio-pci.c
> @@ -24,9 +24,10 @@
>  #include "virtio-pci.h"
>  #include "virtio-ring.h"
>  
> -int vp_find_vq(unsigned int ioaddr, int queue_index,
> +int vp_find_vq(struct vp_device *vp, int queue_index,
>                 struct vring_virtqueue **p_vq)
>  {
> +   int ioaddr = GET_LOWFLAT(vp->ioaddr);
>     u16 num;
>  
>     ASSERT32FLAT();
> @@ -84,14 +85,16 @@ fail:
>     return -1;
>  }
>  
> -u16 vp_init_simple(u16 bdf)
> +struct vp_device *vp_init_simple(u16 bdf)
>  {
> -    u16 ioaddr = pci_config_readl(bdf, PCI_BASE_ADDRESS_0) &
> +    struct vp_device *vp = malloc_high(sizeof(*vp));
> +
> +    vp->ioaddr = pci_config_readl(bdf, PCI_BASE_ADDRESS_0) &
>          PCI_BASE_ADDRESS_IO_MASK;

The malloc_high() call can fail - so the code needs to check if it
returns NULL.  (It really can fail in practice and if code writes to
NULL it will corrupt the 16bit isr table, which is painful to debug.)

Why not pass in a vp_device* to vp_init_simple() and have
vp_init_simple() fill it.  Then init_virtio_scsi() can stack allocate
a temporary vp_device and virtio_scsi_add_lun() can memcpy it to
virtio_lun_s.

>  
> -    vp_reset(ioaddr);
> +    vp_reset(vp);
>      pci_config_maskw(bdf, PCI_COMMAND, 0, PCI_COMMAND_MASTER);
> -    vp_set_status(ioaddr, VIRTIO_CONFIG_S_ACKNOWLEDGE |
> +    vp_set_status(vp, VIRTIO_CONFIG_S_ACKNOWLEDGE |
>                    VIRTIO_CONFIG_S_DRIVER );
> -    return ioaddr;
> +    return vp;
>  }
> diff --git a/src/hw/virtio-pci.h b/src/hw/virtio-pci.h
> index bc04b03..47bef3d 100644
> --- a/src/hw/virtio-pci.h
> +++ b/src/hw/virtio-pci.h
> @@ -2,6 +2,7 @@
>  #define _VIRTIO_PCI_H
>  
>  #include "x86.h" // inl
> +#include "biosvar.h" // GET_LOWFLAT
>  
>  /* A 32-bit r/o bitmask of the features supported by the host */
>  #define VIRTIO_PCI_HOST_FEATURES        0
> @@ -39,19 +40,24 @@
>  /* Virtio ABI version, this must match exactly */
>  #define VIRTIO_PCI_ABI_VERSION          0
>  
> -static inline u32 vp_get_features(unsigned int ioaddr)
> +struct vp_device {
> +    unsigned int ioaddr;
> +};
> +
> +static inline u32 vp_get_features(struct vp_device *vp)
>  {
> -   return inl(ioaddr + VIRTIO_PCI_HOST_FEATURES);
> +    return inl(GET_LOWFLAT(vp->ioaddr) + VIRTIO_PCI_HOST_FEATURES);
>  }

These GET_LOWFLAT() calls are confusing (as they are only valid for
memory allocated with malloc_low() ).  Granted, they are no-ops in
32bit mode, but they are still confusing.

The rest of the series looks good to me.  (Two other minor points
would be that patch 9 should be squashed into patch 6, and I have some
comments on patch 2.)

Thanks.
-Kevin

  reply	other threads:[~2015-06-30 14:34 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-30  8:38 [Qemu-devel] [PATCH v2 00/22] virtio: add version 1.0 support Gerd Hoffmann
2015-06-30  8:38 ` [Qemu-devel] [PATCH v2 01/22] pci: allow to loop over capabilities Gerd Hoffmann
2015-06-30  8:38 ` [Qemu-devel] [PATCH v2 02/22] virtio: run drivers in 32bit mode Gerd Hoffmann
2015-06-30 14:36   ` [Qemu-devel] [SeaBIOS] " Kevin O'Connor
2015-07-01  7:27     ` Gerd Hoffmann
2015-07-01  8:08   ` [Qemu-devel] " Michael S. Tsirkin
2015-07-01 12:30     ` Gerd Hoffmann
2015-07-01 13:50       ` Michael S. Tsirkin
2015-07-01 13:59         ` Michael S. Tsirkin
2015-07-01 14:03         ` Gerd Hoffmann
2015-07-01 14:13         ` [Qemu-devel] [SeaBIOS] " Kevin O'Connor
2015-06-30  8:38 ` [Qemu-devel] [PATCH v2 03/22] virtio: add struct vp_device Gerd Hoffmann
2015-06-30 14:33   ` Kevin O'Connor [this message]
2015-07-01  7:34     ` [Qemu-devel] [SeaBIOS] " Gerd Hoffmann
2015-06-30  8:38 ` [Qemu-devel] [PATCH v2 04/22] virtio: pass struct pci_device to vp_init_simple Gerd Hoffmann
2015-06-30  8:38 ` [Qemu-devel] [PATCH v2 05/22] virtio: add version 1.0 structs and #defines Gerd Hoffmann
2015-06-30  8:38 ` [Qemu-devel] [PATCH v2 06/22] virtio: add version 0.9.5 struct Gerd Hoffmann
2015-06-30  8:38 ` [Qemu-devel] [PATCH v2 07/22] virtio: find version 1.0 virtio capabilities Gerd Hoffmann
2015-07-01 11:43   ` Michael S. Tsirkin
2015-07-01 12:24     ` Gerd Hoffmann
2015-07-01 12:28       ` Michael S. Tsirkin
2015-07-01 12:49         ` Gerd Hoffmann
2015-07-01 13:49           ` Michael S. Tsirkin
2015-06-30  8:38 ` [Qemu-devel] [PATCH v2 08/22] virtio: create vp_cap struct for legacy bar Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 09/22] virtio: add version 0.9.5 struct [fixup] Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 10/22] virtio: add read/write functions and macros Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 11/22] virtio: make features 64bit, support version 1.0 features Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 12/22] virtio: add version 1.0 support to vp_{get, set}_status Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 13/22] virtio: add version 1.0 support to vp_get_isr Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 14/22] virtio: add version 1.0 support to vp_reset Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 15/22] virtio: add version 1.0 support to vp_notify Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 16/22] virtio: remove unused vp_del_vq Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 17/22] virtio: add version 1.0 support to vp_find_vq Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 18/22] virtio-scsi: fix initialization for version 1.0 Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 19/22] virtio-blk: " Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 20/22] virtio: use version 1.0 if available (flip the big switch) Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 21/22] virtio: also probe version 1.0 pci ids Gerd Hoffmann
2015-06-30  8:39 ` [Qemu-devel] [PATCH v2 22/22] virtio: legacy cleanup Gerd Hoffmann
2015-07-01 11:48 ` [Qemu-devel] [PATCH v2 00/22] virtio: add version 1.0 support Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150630143349.GA6954@morn.localdomain \
    --to=kevin@koconnor.net \
    --cc=kraxel@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=seabios@seabios.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).