From: Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org>
To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Cc: virtualization
<virtualization-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>
Subject: Re: [PATCH 1/3] virtio interface
Date: Tue, 25 Sep 2007 00:18:12 +0200 [thread overview]
Message-ID: <200709250018.12705.arnd@arndb.de> (raw)
In-Reply-To: <1190625256.27805.201.camel-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
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 ;-)
> +
> +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;
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.
> +#ifndef _LINUX_VIRTIO_CONFIG_H
> +#define _LINUX_VIRTIO_CONFIG_H
> +/* Virtio devices use a standardized configuration space to define their
> + * features and pass configuration information, but each implementation can
> + * store and access that space differently. */
> +#include <linux/types.h>
> +
> +/* Status byte for guest to report progress, and synchronize config. */
> +/* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
> +#define VIRTIO_CONFIG_S_ACKNOWLEDGE 1
> +/* We have found a driver for the device. */
> +#define VIRTIO_CONFIG_S_DRIVER 2
> +/* Driver has used its parts of the config, and is happy */
> +#define VIRTIO_CONFIG_S_DRIVER_OK 4
> +/* We've given up on this device. */
> +#define VIRTIO_CONFIG_S_FAILED 0x80
> +
> +/* Feature byte (actually 7 bits availabe): */
> +/* Requirements/features of the virtio implementation. */
> +#define VIRTIO_CONFIG_F_VIRTIO 1
> +/* Requirements/features of the virtqueue (may have more than one). */
> +#define VIRTIO_CONFIG_F_VIRTQUEUE 2
> +
> +#ifdef __KERNEL__
> +struct virtio_device;
> +
> +/**
> + * virtio_config_ops - operations for configuring a virtio device
> + * @find: search for the next configuration field of the given type.
> + * vdev: the virtio_device
> + * type: the feature type
> + * len: the (returned) length of the field if found.
> + * Returns a token if found, or NULL. Never returnes the same field twice
> + * (ie. it's used up).
> + * @get: read the value of a configuration field after find().
> + * vdev: the virtio_device
> + * token: the token returned from find().
> + * buf: the buffer to write the field value into.
> + * len: the length of the buffer (given by find()).
> + * Note that contents are conventionally little-endian.
> + * @set: write the value of a configuration field after find().
> + * vdev: the virtio_device
> + * token: the token returned from find().
> + * buf: the buffer to read the field value from.
> + * len: the length of the buffer (given by find()).
> + * Note that contents are conventionally little-endian.
> + * @get_status: read the status byte
> + * vdev: the virtio_device
> + * Returns the status byte
> + * @set_status: write the status byte
> + * vdev: the virtio_device
> + * status: the new status byte
> + * @find_vq: find the first VIRTIO_CONFIG_F_VIRTQUEUE and create a virtqueue.
> + * vdev: the virtio_device
> + * callback: the virqtueue callback
> + * Returns the new virtqueue or ERR_PTR().
> + * @del_vq: free a virtqueue found by find_vq().
> + */
> +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.
> +/**
> + * 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...
Arnd <><
-------------------------------------------------------------------------
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 22:18 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 ` Arnd Bergmann [this message]
[not found] ` <200709250018.12705.arnd-r2nGTMty4D4@public.gmane.org>
2007-09-24 23:37 ` [PATCH 1/3] virtio interface Rusty Russell
[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=200709250018.12705.arnd@arndb.de \
--to=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