From: Rusty Russell <rusty-8n+1lVoiYb80n/F98K4Iww@public.gmane.org>
To: Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org>
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
virtualization
<virtualization-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>
Subject: Re: [PATCH 1/3] virtio interface
Date: Tue, 25 Sep 2007 09:37:38 +1000 [thread overview]
Message-ID: <1190677058.27805.225.camel@localhost.localdomain> (raw)
In-Reply-To: <200709250018.12705.arnd-r2nGTMty4D4@public.gmane.org>
On Tue, 2007-09-25 at 00:18 +0200, Arnd Bergmann wrote:
> On Monday 24 September 2007, Rusty Russell wrote:
> > This attempts to implement a "virtual I/O" layer which should allow
> > common drivers to be efficiently used across most virtual I/O
> > mechanisms. It will no-doubt need further enhancement.
>
> Hi Rusty,
>
> Thanks for your update, as you can imagine, I'm much happier with
> this version ;-)
Hi Arnd,
Yes, I thought you might be...
> > +
> > +struct virtio_bus {
> > + struct bus_type bus;
> > + struct device dev;
> > +};
> > +
> > +static struct virtio_bus virtio_bus = {
> > + .bus = {
> > + .name = "virtio",
> > + .match = virtio_dev_match,
> > + .dev_attrs = virtio_dev_attrs,
> > + },
> > + .dev = {
> > + /* Can override this if you have a real bus behind it. */
> > + .parent = NULL,
> > + .bus_id = "virtio",
> > + }
> > +};
>
> This is a pattern I've seen a few times before, but could never understand
> what it's good for. What is your reason for defining a new data structure
> that is used only once, instead of just
>
> static struct bus_type virtio_bus_type;
> static struct device virtio_root_dev;
It's copied from the lguest bus which was copied from somewhere else.
Creating a struct like this is a quiet complaint about the requirements
to do so: it's not clear to me why I need to create a fake device,
rather than making the bus the parent of the device if it needs one.
> Also, I would not mix the two in a single source file. Instead, I think
> every driver that can provide virtio devices (pci, lguest, ...) should
> be responsible for setting the parent appropriately.
I don't mind: we could expose it.
> > +struct virtio_config_ops
> > +{
> > + void *(*find)(struct virtio_device *vdev, u8 type, unsigned *len);
> > + void (*get)(struct virtio_device *vdev, void *token,
> > + void *buf, unsigned len);
> > + void (*set)(struct virtio_device *vdev, void *token,
> > + const void *buf, unsigned len);
> > + u8 (*get_status)(struct virtio_device *vdev);
> > + void (*set_status)(struct virtio_device *vdev, u8 status);
> > + struct virtqueue *(*find_vq)(struct virtio_device *vdev,
> > + bool (*callback)(struct virtqueue *));
> > + void (*del_vq)(struct virtqueue *vq);
> > +};
>
> The configuration logic looks more complicated than it should be.
> Maybe more of this can be done using data structure definitions instead
> of dynamic callback. E.g. the virtqueues of a given device can be
> listed as members of the struct virtio_device.
I agree about the complexity, but the reason I didn't do that is the way
the config system works. Drivers look for fields they want, and those
fields are marked so the host can see what was used. This makes it
fairly easy to add new fields and then tell if the guest understood them
or not.
This includes new virtqueues, so the core must not simply grab them all.
My previous solution was to put a "new_vq" and "del_vq" inside
virtqueue_ops: the driver found the config field and handed it through.
That was a little messier for the driver.
> > +/**
> > + * virtio_config_val - get a single virtio config and mark it used.
> > + * @config: the virtio config space
> > + * @type: the type to search for.
> > + * @val: a pointer to the value to fill in.
> > + *
> > + * Once used, the config type is marked with VIRTIO_CONFIG_F_USED so it can't
> > + * be found again. This version does endian conversion. */
> > +#define virtio_config_val(vdev, type, v) ({ \
> > + int _err = __virtio_config_val((vdev),(type),(v),sizeof(*(v))); \
> > + \
> > + BUILD_BUG_ON(sizeof(*(v)) != 1 && sizeof(*(v)) != 2 \
> > + && sizeof(*(v)) != 4 && sizeof(*(v)) != 8); \
> > + if (!_err) { \
> > + switch (sizeof(*(v))) { \
> > + case 2: le16_to_cpus(v); break; \
> > + case 4: le32_to_cpus(v); break; \
> > + case 8: le64_to_cpus(v); break; \
> > + } \
> > + } \
> > + _err; \
> > +})
>
> Especially the macro looks like something better avoided...
C'mon, everyone loves optimization!
(Which reminds me, I said little endian here but didn't actually do that
in the lguest launcher, bad Rusty).
Thanks,
Rusty.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
next prev parent reply other threads:[~2007-09-24 23:37 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-09-24 9:13 [PATCH 0/3] virtio implementation (draft VI) Rusty Russell
[not found] ` <1190625194.27805.199.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-24 9:14 ` [PATCH 1/3] virtio interface Rusty Russell
[not found] ` <1190625256.27805.201.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-24 9:15 ` [PATCH 2/3] virtio ring implementation Rusty Russell
[not found] ` <1190625307.27805.203.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-24 9:16 ` [PATCH 3/3] virtio module alias support Rusty Russell
[not found] ` <1190625394.27805.206.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-24 16:02 ` Greg KH
[not found] ` <20070924160221.GB5846-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2007-09-25 0:50 ` Rusty Russell
[not found] ` <1190681405.27805.243.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-25 1:57 ` Greg KH
[not found] ` <20070925015747.GA16011-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2007-09-25 2:11 ` Rusty Russell
[not found] ` <1190686275.27805.255.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-25 3:10 ` Greg KH
2007-09-24 13:44 ` [PATCH 2/3] virtio ring implementation Dor Laor
[not found] ` <46F7BF41.9060705-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-09-24 23:43 ` Rusty Russell
2007-09-25 13:32 ` Rusty Russell
[not found] ` <1190727156.27805.332.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-25 17:15 ` Dor Laor
[not found] ` <46F94243.2000602-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-09-25 23:37 ` Rusty Russell
[not found] ` <1190763475.2227.20.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-26 9:08 ` Dor Laor
2007-09-24 22:18 ` [PATCH 1/3] virtio interface Arnd Bergmann
[not found] ` <200709250018.12705.arnd-r2nGTMty4D4@public.gmane.org>
2007-09-24 23:37 ` Rusty Russell [this message]
[not found] ` <1190677058.27805.225.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2007-09-25 6:36 ` Arnd Bergmann
[not found] ` <200709250836.29451.arnd-r2nGTMty4D4@public.gmane.org>
2007-09-25 10:54 ` Rusty Russell
2007-09-25 8:18 ` Cornelia Huck
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=1190677058.27805.225.camel@localhost.localdomain \
--to=rusty-8n+1lvoiyb80n/f98k4iww@public.gmane.org \
--cc=arnd-r2nGTMty4D4@public.gmane.org \
--cc=kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
--cc=virtualization-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.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