All of lore.kernel.org
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: Alex Williamson <alex.williamson@hp.com>
Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org, markmc@redhat.com
Subject: Re: [PATCH v2 4/8] qemu:virtio-net: Add a virtqueue for control commands from the guest
Date: Wed, 04 Feb 2009 17:14:59 -0600	[thread overview]
Message-ID: <498A2173.80001@codemonkey.ws> (raw)
In-Reply-To: <1233788398.7026.1237.camel@lappy>

Alex Williamson wrote:
> On Tue, 2009-02-03 at 14:56 -0600, Anthony Liguori wrote:
>   
>> Alex Williamson wrote:
>>     
>>> +        ctrl = elem.out_sg[0].iov_base;
>>> +        status = elem.in_sg[elem.in_num - 1].iov_base;
>>>   
>>>       
>> This works only because we're dealing with uint8_ts but it's broken 
>> elsewhere in virtio-net.  iov_base is guest memory which means it may 
>> have different endianness.  We really should be using ldub_p() here.
>>
>>     
>>> +        *status = VIRTIO_NET_ERR;
>>>   
>>>       
>> And stb_p() here.
>>     
>
> Thanks Anthony.  So before I patch bomb again, I think this turns into
> something like below.  This makes the struct definitions less useful on
> the backend side, but I'm not sure we can do anything about that.  I
> assume for u16s and u32s used in other parts of the interface, we'll
> define those as little endian, which means the guest side driver
> eventually needs a follow-up patch for big endian archs.  Thanks,
>
> Alex
>
>
> qemu:virtio-net: Add a virtqueue for control commands from the guest
>
> This will be used for RX mode, MAC table, VLAN table control, etc...
>
> The control transaction consists of one or more "out" sg entries and
> one or more "in" sg entries.  The first out entry contains a header
> defining the class and command.  Additional out entries may provide
> data for the command.  A response via the ack entry is required
> and the guest will typically be waiting for it.
>
> Signed-off-by: Alex Williamson <alex.williamson@hp.com>
> ---
>
>  hw/virtio-net.c |   34 +++++++++++++++++++++++++++++++++-
>  hw/virtio-net.h |   18 ++++++++++++++++++
>  2 files changed, 51 insertions(+), 1 deletions(-)
>
>
> diff --git a/hw/virtio-net.c b/hw/virtio-net.c
> index 073f23a..7971f95 100644
> --- a/hw/virtio-net.c
> +++ b/hw/virtio-net.c
> @@ -25,6 +25,7 @@ typedef struct VirtIONet
>      uint16_t status;
>      VirtQueue *rx_vq;
>      VirtQueue *tx_vq;
> +    VirtQueue *ctrl_vq;
>      VLANClientState *vc;
>      QEMUTimer *tx_timer;
>      int tx_timer_active;
> @@ -79,7 +80,9 @@ static void virtio_net_set_link_status(VLANClientState *vc)
>  
>  static uint32_t virtio_net_get_features(VirtIODevice *vdev)
>  {
> -    uint32_t features = (1 << VIRTIO_NET_F_MAC) | (1 << VIRTIO_NET_F_STATUS);
> +    uint32_t features = (1 << VIRTIO_NET_F_MAC) |
> +                        (1 << VIRTIO_NET_F_STATUS) |
> +                        (1 << VIRTIO_NET_F_CTRL_VQ);
>  
>      return features;
>  }
> @@ -91,6 +94,34 @@ static void virtio_net_set_features(VirtIODevice *vdev, uint32_t features)
>      n->mergeable_rx_bufs = !!(features & (1 << VIRTIO_NET_F_MRG_RXBUF));
>  }
>  
> +static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
> +{
> +    struct virtio_net_ctrl_hdr ctrl;
> +    virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
> +    VirtQueueElement elem;
> +
> +    while (virtqueue_pop(vq, &elem)) {
> +        if ((elem.in_num < 1) | (elem.out_num < 1)) {
> +            fprintf(stderr, "virtio-net ctrl missing headers\n");
> +            exit(1);
> +        }
> +
> +        if (elem.out_sg[0].iov_len < sizeof(ctrl) ||
> +            elem.out_sg[elem.in_num - 1].iov_len < sizeof(status)) {
> +            fprintf(stderr, "virtio-net ctrl header not in correct element\n");
> +            exit(1);
> +        }
> +
> +        ctrl.class = ldub_p(elem.out_sg[0].iov_base);
> +        ctrl.cmd = ldub_p(elem.out_sg[0].iov_base + sizeof(ctrl.class));
> +
> +        stb_p(elem.in_sg[elem.in_num - 1].iov_base, status);
> +
> +        virtqueue_push(vq, &elem, sizeof(status));
> +        virtio_notify(vdev, vq);
> +    }
> +}
>
>   

Yup, this looks right to me.

Regards,

Anthony Liguori


WARNING: multiple messages have this Message-ID (diff)
From: Anthony Liguori <anthony@codemonkey.ws>
To: Alex Williamson <alex.williamson@hp.com>
Cc: markmc@redhat.com, qemu-devel@nongnu.org, kvm@vger.kernel.org
Subject: [Qemu-devel] Re: [PATCH v2 4/8] qemu:virtio-net: Add a virtqueue for control commands from the guest
Date: Wed, 04 Feb 2009 17:14:59 -0600	[thread overview]
Message-ID: <498A2173.80001@codemonkey.ws> (raw)
In-Reply-To: <1233788398.7026.1237.camel@lappy>

Alex Williamson wrote:
> On Tue, 2009-02-03 at 14:56 -0600, Anthony Liguori wrote:
>   
>> Alex Williamson wrote:
>>     
>>> +        ctrl = elem.out_sg[0].iov_base;
>>> +        status = elem.in_sg[elem.in_num - 1].iov_base;
>>>   
>>>       
>> This works only because we're dealing with uint8_ts but it's broken 
>> elsewhere in virtio-net.  iov_base is guest memory which means it may 
>> have different endianness.  We really should be using ldub_p() here.
>>
>>     
>>> +        *status = VIRTIO_NET_ERR;
>>>   
>>>       
>> And stb_p() here.
>>     
>
> Thanks Anthony.  So before I patch bomb again, I think this turns into
> something like below.  This makes the struct definitions less useful on
> the backend side, but I'm not sure we can do anything about that.  I
> assume for u16s and u32s used in other parts of the interface, we'll
> define those as little endian, which means the guest side driver
> eventually needs a follow-up patch for big endian archs.  Thanks,
>
> Alex
>
>
> qemu:virtio-net: Add a virtqueue for control commands from the guest
>
> This will be used for RX mode, MAC table, VLAN table control, etc...
>
> The control transaction consists of one or more "out" sg entries and
> one or more "in" sg entries.  The first out entry contains a header
> defining the class and command.  Additional out entries may provide
> data for the command.  A response via the ack entry is required
> and the guest will typically be waiting for it.
>
> Signed-off-by: Alex Williamson <alex.williamson@hp.com>
> ---
>
>  hw/virtio-net.c |   34 +++++++++++++++++++++++++++++++++-
>  hw/virtio-net.h |   18 ++++++++++++++++++
>  2 files changed, 51 insertions(+), 1 deletions(-)
>
>
> diff --git a/hw/virtio-net.c b/hw/virtio-net.c
> index 073f23a..7971f95 100644
> --- a/hw/virtio-net.c
> +++ b/hw/virtio-net.c
> @@ -25,6 +25,7 @@ typedef struct VirtIONet
>      uint16_t status;
>      VirtQueue *rx_vq;
>      VirtQueue *tx_vq;
> +    VirtQueue *ctrl_vq;
>      VLANClientState *vc;
>      QEMUTimer *tx_timer;
>      int tx_timer_active;
> @@ -79,7 +80,9 @@ static void virtio_net_set_link_status(VLANClientState *vc)
>  
>  static uint32_t virtio_net_get_features(VirtIODevice *vdev)
>  {
> -    uint32_t features = (1 << VIRTIO_NET_F_MAC) | (1 << VIRTIO_NET_F_STATUS);
> +    uint32_t features = (1 << VIRTIO_NET_F_MAC) |
> +                        (1 << VIRTIO_NET_F_STATUS) |
> +                        (1 << VIRTIO_NET_F_CTRL_VQ);
>  
>      return features;
>  }
> @@ -91,6 +94,34 @@ static void virtio_net_set_features(VirtIODevice *vdev, uint32_t features)
>      n->mergeable_rx_bufs = !!(features & (1 << VIRTIO_NET_F_MRG_RXBUF));
>  }
>  
> +static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
> +{
> +    struct virtio_net_ctrl_hdr ctrl;
> +    virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
> +    VirtQueueElement elem;
> +
> +    while (virtqueue_pop(vq, &elem)) {
> +        if ((elem.in_num < 1) | (elem.out_num < 1)) {
> +            fprintf(stderr, "virtio-net ctrl missing headers\n");
> +            exit(1);
> +        }
> +
> +        if (elem.out_sg[0].iov_len < sizeof(ctrl) ||
> +            elem.out_sg[elem.in_num - 1].iov_len < sizeof(status)) {
> +            fprintf(stderr, "virtio-net ctrl header not in correct element\n");
> +            exit(1);
> +        }
> +
> +        ctrl.class = ldub_p(elem.out_sg[0].iov_base);
> +        ctrl.cmd = ldub_p(elem.out_sg[0].iov_base + sizeof(ctrl.class));
> +
> +        stb_p(elem.in_sg[elem.in_num - 1].iov_base, status);
> +
> +        virtqueue_push(vq, &elem, sizeof(status));
> +        virtio_notify(vdev, vq);
> +    }
> +}
>
>   

Yup, this looks right to me.

Regards,

Anthony Liguori

  parent reply	other threads:[~2009-02-04 23:15 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-03 19:29 [PATCH v2 0/8] qemu:virtio-net: Add MAC and VLAN filtering Alex Williamson
2009-02-03 19:29 ` [Qemu-devel] " Alex Williamson
2009-02-03 19:29 ` [PATCH v2 1/8] qemu:virtio-net: Save status and add some save infrastructure Alex Williamson
2009-02-03 19:29   ` [Qemu-devel] " Alex Williamson
2009-02-03 19:29 ` [PATCH v2 2/8] qemu:virtio-net: Allow setting the MAC address via set_config Alex Williamson
2009-02-03 19:29   ` [Qemu-devel] " Alex Williamson
2009-02-03 19:29 ` [PATCH v2 3/8] qemu:virtio-net: Define ETH_ALEN for use when manipulating MAC addresses Alex Williamson
2009-02-03 19:29   ` [Qemu-devel] " Alex Williamson
2009-02-03 19:29 ` [PATCH v2 4/8] qemu:virtio-net: Add a virtqueue for control commands from the guest Alex Williamson
2009-02-03 19:29   ` [Qemu-devel] " Alex Williamson
2009-02-03 20:56   ` Anthony Liguori
2009-02-03 20:56     ` [Qemu-devel] " Anthony Liguori
2009-02-04 22:59     ` Alex Williamson
2009-02-04 22:59       ` [Qemu-devel] " Alex Williamson
2009-02-04 23:09       ` malc
2009-02-04 23:09         ` malc
2009-02-04 23:34         ` Alex Williamson
2009-02-04 23:14       ` Anthony Liguori [this message]
2009-02-04 23:14         ` Anthony Liguori
2009-02-03 19:29 ` [PATCH v2 5/8] qemu:virtio-net: Add promiscuous and all-multicast mode bits Alex Williamson
2009-02-03 19:29   ` [Qemu-devel] " Alex Williamson
2009-02-03 19:30 ` [PATCH v2 6/8] qemu:virtio-net: Enable filtering based on MAC, promisc, broadcast and allmulti Alex Williamson
2009-02-03 19:30   ` [Qemu-devel] " Alex Williamson
2009-02-03 20:06   ` Blue Swirl
2009-02-03 20:06     ` Blue Swirl
2009-02-03 20:53     ` Anthony Liguori
2009-02-03 20:53       ` Anthony Liguori
2009-02-03 23:35       ` Paul Brook
2009-02-03 23:35         ` Paul Brook
2009-02-04  0:18       ` malc
2009-02-04  0:18         ` [Qemu-devel] " malc
2009-02-03 19:30 ` [PATCH v2 7/8] qemu:virtio-net: Add additional MACs via a filter table Alex Williamson
2009-02-03 19:30   ` [Qemu-devel] " Alex Williamson
2009-02-03 19:30 ` [PATCH v2 8/8] qemu:virtio-net: Add VLAN filtering Alex Williamson
2009-02-03 19:30   ` [Qemu-devel] " Alex Williamson

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=498A2173.80001@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=alex.williamson@hp.com \
    --cc=kvm@vger.kernel.org \
    --cc=markmc@redhat.com \
    --cc=qemu-devel@nongnu.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.