public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <greg@kroah.com>
To: Chris Wright <chrisw@sous-sol.org>
Cc: linux-kernel@vger.kernel.org, virtualization@lists.osdl.org,
	xen-devel@lists.xensource.com,
	Ian Pratt <ian.pratt@xensource.com>,
	Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
Subject: Re: [RFC PATCH 33/35] Add the Xenbus sysfs and virtual device hotplug driver.
Date: Tue, 9 May 2006 12:40:44 -0700	[thread overview]
Message-ID: <20060509194044.GA374@kroah.com> (raw)
In-Reply-To: <20060509085200.826853000@sous-sol.org>

On Tue, May 09, 2006 at 12:00:33AM -0700, Chris Wright wrote:
> +/* xenbus_probe.c */
> +extern char *kasprintf(const char *fmt, ...);

Belongs in a .h file.

> +#define DPRINTK(fmt, args...) \
> +    pr_debug("xenbus_client (%s:%d) " fmt ".\n", __FUNCTION__, __LINE__, ##args)

Please use the dev_dbg() function instead of DPRINTK() or pr_debug().
It's much better and uniquely identifies the driver and device that you
are referring to.

Also, all of the printk() calls in these files should be switched to
dev_err() or dev_warn() for the same reason.

> +int xenbus_watch_path(struct xenbus_device *dev, const char *path,
> +		      struct xenbus_watch *watch,
> +		      void (*callback)(struct xenbus_watch *,
> +				       const char **, unsigned int))
> +{
> +	int err;
> +
> +	watch->node = path;
> +	watch->callback = callback;
> +
> +	err = register_xenbus_watch(watch);
> +
> +	if (err) {
> +		watch->node = NULL;
> +		watch->callback = NULL;
> +		xenbus_dev_fatal(dev, err, "adding watch on %s", path);
> +	}
> +
> +	return err;
> +}
> +EXPORT_SYMBOL_GPL(xenbus_watch_path);
> +
> +
> +int xenbus_watch_path2(struct xenbus_device *dev, const char *path,
> +		       const char *path2, struct xenbus_watch *watch,
> +		       void (*callback)(struct xenbus_watch *,
> +					const char **, unsigned int))
> +{
> +	int err;
> +	char *state = kasprintf("%s/%s", path, path2);
> +	if (!state) {
> +		xenbus_dev_fatal(dev, -ENOMEM, "allocating path for watch");
> +		return -ENOMEM;
> +	}
> +	err = xenbus_watch_path(dev, state, watch, callback);
> +
> +	if (err)
> +		kfree(state);
> +	return err;
> +}
> +EXPORT_SYMBOL_GPL(xenbus_watch_path2);
> +
> +
> +int xenbus_switch_state(struct xenbus_device *dev,
> +			xenbus_transaction_t xbt,
> +			XenbusState state)

I'm guessing that XenbusState is a typedef?  Please fix the naming to be
Linux kernel compatible.

> +{
> +	/* We check whether the state is currently set to the given value, and
> +	   if not, then the state is set.  We don't want to unconditionally
> +	   write the given state, because we don't want to fire watches
> +	   unnecessarily.  Furthermore, if the node has gone, we don't write
> +	   to it, as the device will be tearing down, and we don't want to
> +	   resurrect that directory.
> +	 */
> +
> +	int current_state;
> +	int err;
> +
> +	if (state == dev->state)
> +		return 0;
> +
> +	err = xenbus_scanf(xbt, dev->nodename, "state", "%d",
> +			       &current_state);
> +	if (err != 1)
> +		return 0;
> +
> +	err = xenbus_printf(xbt, dev->nodename, "state", "%d", state);
> +	if (err) {
> +		if (state != XenbusStateClosing) /* Avoid looping */
> +			xenbus_dev_fatal(dev, err, "writing new state");
> +		return err;
> +	}
> +
> +	dev->state = state;
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(xenbus_switch_state);
> +
> +
> +/**
> + * Return the path to the error node for the given device, or NULL on failure.
> + * If the value returned is non-NULL, then it is the caller's to kfree.
> + */
> +static char *error_path(struct xenbus_device *dev)
> +{
> +	return kasprintf("error/%s", dev->nodename);
> +}
> +
> +
> +void _dev_error(struct xenbus_device *dev, int err, const char *fmt,
> +		va_list ap)

Global function?  With no description of what it does?  (hint,
describing it in the .h file, in pseudo-kerneldoc form doesn't really
count, it only makes the tools break...)

> +void xenbus_dev_error(struct xenbus_device *dev, int err, const char *fmt,
> +		      ...)

No kerneldoc for all of the global functions?

> +extern void xenbus_probe(void *);
> +extern int xenstored_ready;

Should be in a .h file.

> +#include <asm/io.h>
> +#include <asm/page.h>
> +#include <asm/pgtable.h>
> +#include <asm/hypervisor.h>
> +#include <xen/xenbus.h>
> +#ifdef XEN_XENBUS_PROC_INTERFACE
> +#include <xen/xen_proc.h>
> +#endif

#ifdef is not needed.  Put it in the .h file.

> +#include <xen/evtchn.h>
> +
> +#include "xenbus_comms.h"
> +
> +extern struct mutex xenwatch_mutex;

Should be in a .h file.

> +struct xen_bus_type
> +{
> +	char *root;
> +	unsigned int levels;
> +	int (*get_bus_id)(char bus_id[BUS_ID_SIZE], const char *nodename);
> +	int (*probe)(const char *type, const char *dir);
> +	struct bus_type bus;
> +	struct device dev;
> +};

Why have you embedded both a struct bus_type and a struct device into
this structure?  How is the lifecycle handled due to 2 different
reference counted structures?

Also, I note that you statically create this, which isn't the nicest,
why not dynamically create it?

And why a different probe function per bus types?

And the bus id is part of the struct bus_type, why a separate function
to retrieve it?

And what are you doing with the different "levels"?  Is there some
description of how you are using sysfs for this?  Busses should not be
"nested", devices should.  How does sysfs look with this code in it?
What is the /sys/bus/ structure?  What is the /sys/devices/ structure?

> +/* device/<type>/<id> => <type>-<id> */
> +static int frontend_bus_id(char bus_id[BUS_ID_SIZE], const char *nodename)
> +{
> +	nodename = strchr(nodename, '/');
> +	if (!nodename || strlen(nodename + 1) >= BUS_ID_SIZE) {
> +		printk(KERN_WARNING "XENBUS: bad frontend %s\n", nodename);
> +		return -EINVAL;
> +	}
> +
> +	strlcpy(bus_id, nodename + 1, BUS_ID_SIZE);
> +	if (!strchr(bus_id, '/')) {
> +		printk(KERN_WARNING "XENBUS: bus_id %s no slash\n", bus_id);
> +		return -EINVAL;
> +	}
> +	*strchr(bus_id, '/') = '-';
> +	return 0;
> +}

And why all the string logic for device ids and names?  Is that the only
unique way to identify the different devices on your bus?  Why not just
give them a numerical id then?  It would save you a lot of
computation...

> +/* Bus type for frontend drivers. */
> +static int xenbus_probe_frontend(const char *type, const char *name);
> +static struct xen_bus_type xenbus_frontend = {
> +	.root = "device",
> +	.levels = 2, 		/* device/type/<id> */
> +	.get_bus_id = frontend_bus_id,
> +	.probe = xenbus_probe_frontend,
> +	.bus = {
> +		.name  = "xen",
> +		.match = xenbus_match,
> +	},
> +	.dev = {
> +		.bus_id = "xen",
> +	},
> +};
> +
> +/* backend/<type>/<fe-uuid>/<id> => <type>-<fe-domid>-<id> */
> +static int backend_bus_id(char bus_id[BUS_ID_SIZE], const char *nodename)
> +{
> +	int domid, err;
> +	const char *devid, *type, *frontend;
> +	unsigned int typelen;
> +
> +	type = strchr(nodename, '/');
> +	if (!type)
> +		return -EINVAL;
> +	type++;
> +	typelen = strcspn(type, "/");
> +	if (!typelen || type[typelen] != '/')
> +		return -EINVAL;
> +
> +	devid = strrchr(nodename, '/') + 1;
> +
> +	err = xenbus_gather(XBT_NULL, nodename, "frontend-id", "%i", &domid,
> +			    "frontend", NULL, &frontend,
> +			    NULL);
> +	if (err)
> +		return err;
> +	if (strlen(frontend) == 0)
> +		err = -ERANGE;
> +	if (!err && !xenbus_exists(XBT_NULL, frontend, ""))
> +		err = -ENOENT;
> +
> +	kfree(frontend);
> +
> +	if (err)
> +		return err;
> +
> +	if (snprintf(bus_id, BUS_ID_SIZE,
> +		     "%.*s-%i-%s", typelen, type, domid, devid) >= BUS_ID_SIZE)
> +		return -ENOSPC;
> +	return 0;
> +}
> +
> +static int xenbus_uevent_backend(struct device *dev, char **envp,
> +				 int num_envp, char *buffer, int buffer_size);
> +static int xenbus_probe_backend(const char *type, const char *domid);
> +static struct xen_bus_type xenbus_backend = {
> +	.root = "backend",
> +	.levels = 3, 		/* backend/type/<frontend>/<id> */
> +	.get_bus_id = backend_bus_id,
> +	.probe = xenbus_probe_backend,
> +	.bus = {
> +		.name  = "xen-backend",
> +		.match = xenbus_match,
> +		.uevent = xenbus_uevent_backend,
> +	},
> +	.dev = {
> +		.bus_id = "xen-backend",
> +	},
> +};

What is the "frontend/backend" relationship here?

> +static int xenbus_uevent_backend(struct device *dev, char **envp,
> +				 int num_envp, char *buffer, int buffer_size)
> +{
> +	struct xenbus_device *xdev;
> +	struct xenbus_driver *drv;
> +	int i = 0;
> +	int length = 0;
> +
> +	DPRINTK("");
> +
> +	if (dev == NULL)
> +		return -ENODEV;
> +
> +	xdev = to_xenbus_device(dev);
> +	if (xdev == NULL)
> +		return -ENODEV;
> +
> +	/* stuff we want to pass to /sbin/hotplug */
> +	add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
> +		       "XENBUS_TYPE=%s", xdev->devicetype);
> +
> +	add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
> +		       "XENBUS_PATH=%s", xdev->nodename);
> +
> +	add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
> +		       "XENBUS_BASE_PATH=%s", xenbus_backend.root);

Why not use the standard "TYPE" "PATH" and no "XENBUS" stuff?

> +static int xenbus_register_driver_common(struct xenbus_driver *drv,
> +					 struct xen_bus_type *bus)
> +{
> +	int ret;
> +
> +	drv->driver.name = drv->name;
> +	drv->driver.bus = &bus->bus;
> +	drv->driver.owner = drv->owner;

Hint, put the owner in the function, which will force the caller to pass
it in.  It's forgotten to be set in the structure a lot.  Look at USB
and PCI register functions now for an example of this.

> +	drv->driver.probe = xenbus_dev_probe;
> +	drv->driver.remove = xenbus_dev_remove;
> +
> +	mutex_lock(&xenwatch_mutex);
> +	ret = driver_register(&drv->driver);
> +	mutex_unlock(&xenwatch_mutex);

What's with the lock?  What is wrong with the driver core lock that is
taken?  What are you trying to protect?

> +void xenbus_suspend(void)
> +{
> +	DPRINTK("");
> +
> +	bus_for_each_dev(&xenbus_frontend.bus, NULL, NULL, suspend_dev);
> +	bus_for_each_dev(&xenbus_backend.bus, NULL, NULL, suspend_dev);
> +	xs_suspend();
> +}
> +EXPORT_SYMBOL_GPL(xenbus_suspend);

I think the driver core will handle walking your devices and suspending
them.  You don't have to do it by hand like this.

> +void xenbus_resume(void)
> +{
> +	xb_init_comms();
> +	xs_resume();
> +	bus_for_each_dev(&xenbus_frontend.bus, NULL, NULL, resume_dev);
> +	bus_for_each_dev(&xenbus_backend.bus, NULL, NULL, resume_dev);
> +}
> +EXPORT_SYMBOL_GPL(xenbus_resume);

Same thing for resume.

> +#ifdef XEN_XENBUS_PROC_INTERFACE
> +static struct file_operations xsd_kva_fops;
> +static struct proc_dir_entry *xsd_kva_intf;
> +static struct proc_dir_entry *xsd_port_intf;

#ifdef not needed if your .h file is written correctly.

> +static int __init xenbus_probe_init(void)
> +{
> +	int err = 0, dom0;
> +
> +	DPRINTK("");
> +
> +	if (xen_init() < 0) {
> +		DPRINTK("failed");
> +		return -ENODEV;
> +	}
> +
> +	/* Register ourselves with the kernel bus & device subsystems */
> +	bus_register(&xenbus_frontend.bus);
> +	bus_register(&xenbus_backend.bus);
> +	device_register(&xenbus_frontend.dev);
> +	device_register(&xenbus_backend.dev);

No error handling?

> +
> +	/*
> +	 * Domain0 doesn't have a store_evtchn or store_mfn yet.
> +	 */
> +	dom0 = (xen_start_info->store_evtchn == 0);
> +
> +#ifdef XEN_XENBUS_PROC_INTERFACE

No #ifdef needed if your .h file is written correctly.

> +/* xenbus_probe.c */
> +extern char *kasprintf(const char *fmt, ...);

Should be in a .h file

> +/*
> + * Details of the xenwatch callback kernel thread. The thread waits on the
> + * watch_events_waitq for work to do (queued on watch_events list). When it
> + * wakes up it acquires the xenwatch_mutex before reading the list and
> + * carrying out work.
> + */
> +static pid_t xenwatch_pid;
> +/* static */ DEFINE_MUTEX(xenwatch_mutex);

Drop the static comment?

> +/* Create a new directory. */
> +int xenbus_mkdir(xenbus_transaction_t t,
> +		 const char *dir, const char *node)
> +{
> +	char *path;
> +	int ret;
> +
> +	path = join(dir, node);
> +	if (IS_ERR(path))
> +		return PTR_ERR(path);
> +
> +	ret = xs_error(xs_single(t, XS_MKDIR, path, NULL));
> +	kfree(path);
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(xenbus_mkdir);

Create a new directory in what?  sysfs?

> +/* Destroy a file or directory (directories must be empty). */
> +int xenbus_rm(xenbus_transaction_t t, const char *dir, const char *node)
> +{
> +	char *path;
> +	int ret;
> +
> +	path = join(dir, node);
> +	if (IS_ERR(path))
> +		return PTR_ERR(path);
> +
> +	ret = xs_error(xs_single(t, XS_RM, path, NULL));
> +	kfree(path);
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(xenbus_rm);

Remove a file or directory in what?  sysfs?

> +#define XBT_NULL 0

What is this for?  What's wrong with just "NULL"?

> +/* A xenbus device. */
> +struct xenbus_device {
> +	const char *devicetype;
> +	const char *nodename;
> +	const char *otherend;
> +	int otherend_id;
> +	struct xenbus_watch otherend_watch;
> +	struct device dev;
> +	XenbusState state;
> +	void *data;

The data field can be dropped.  Use the space in the struct device for
this.

> +typedef u32 xenbus_transaction_t;

Why the typedef?  Please don't.

thanks,

greg k-h

  parent reply	other threads:[~2006-05-09 19:42 UTC|newest]

Thread overview: 185+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-05-09  8:49 [RFC PATCH 00/35] Xen i386 paravirtualization support Chris Wright
2006-05-09  7:00 ` [RFC PATCH 01/35] Add XEN config options and disable unsupported config options Chris Wright
2006-05-09 10:05   ` Adrian Bunk
2006-05-09 11:06     ` Ed Tomlinson
2006-05-09 12:45     ` Christian Limpach
2006-05-09 23:23     ` Chris Wright
2006-05-09 14:47   ` Daniel Walker
2006-05-09 15:16     ` Christian Limpach
2006-05-09 16:00       ` Daniel Walker
2006-05-09 23:25         ` Chris Wright
2006-05-09 16:42   ` Andi Kleen
2006-05-10 15:36   ` [Xen-devel] " Alan Cox
2006-05-10 15:48     ` Christian Limpach
2006-05-09  7:00 ` [RFC PATCH 02/35] Makefile support to build Xen subarch Chris Wright
2006-05-09  7:00 ` [RFC PATCH 03/35] Add Xen interface header files Chris Wright
2006-05-09 14:49   ` Martin J. Bligh
2006-05-09 17:54     ` Christian Limpach
2006-05-09 15:15   ` Christoph Hellwig
2006-05-09 19:35     ` Hollis Blanchard
2006-05-09 19:48       ` [Xen-devel] " Anthony Liguori
2006-05-09 22:34       ` Christoph Hellwig
2006-05-09 22:36     ` Ingo Oeser
2006-05-09 16:06   ` Daniel Walker
2006-05-09 16:18     ` Christian Limpach
2006-05-09 16:29       ` Daniel Walker
2006-05-09  7:00 ` [RFC PATCH 04/35] Hypervisor " Chris Wright
2006-05-09 22:43   ` Ingo Oeser
2006-05-09 23:01     ` Chris Wright
2006-05-09  7:00 ` [RFC PATCH 05/35] Add sync bitops Chris Wright
2006-05-09 22:56   ` Christoph Lameter
2006-05-09 23:04     ` Andi Kleen
2006-05-09 23:07     ` Chris Wright
2006-05-09  7:00 ` [RFC PATCH 06/35] Add vmlinuz build target Chris Wright
2006-05-09  7:00 ` [RFC PATCH 07/35] Make LOAD_OFFSET defined by subarch Chris Wright
2006-05-10 23:28   ` Zachary Amsden
2006-05-11  7:47     ` [Xen-devel] " Gerd Hoffmann
2006-05-11  8:51       ` Chris Wright
2006-05-11  9:06         ` Gerd Hoffmann
2006-05-11 16:43     ` Christian Limpach
2006-05-12  6:47       ` [Xen-devel] " Jan Beulich
2006-05-12  8:38         ` Christian Limpach
2006-05-09  7:00 ` [RFC PATCH 08/35] Add Xen-specific memory management definitions Chris Wright
2006-05-09 14:49   ` Martin J. Bligh
2006-05-09 17:44     ` Christian Limpach
2006-05-15  6:44   ` Pete Zaitcev
2006-05-15  7:04     ` Keir Fraser
2006-05-15  8:19     ` Christian Limpach
2006-05-17 16:06   ` Pete Zaitcev
2006-05-18  7:42     ` Chris Wright
2006-05-09  7:00 ` [RFC PATCH 09/35] Change __FIXADDR_TOP to leave room for the hypervisor Chris Wright
2006-05-09  7:00 ` [RFC PATCH 10/35] Add a new head.S start-of-day file for booting on Xen Chris Wright
2006-05-09  7:00 ` [RFC PATCH 11/35] Add support for Xen to entry.S Chris Wright
2006-05-09 16:51   ` Andi Kleen
2006-05-09  7:00 ` [RFC PATCH 12/35] Add start-of-day setup hooks to subarch Chris Wright
2006-05-09  7:00 ` [RFC PATCH 13/35] Support loading an initrd when running on Xen Chris Wright
2006-05-09  7:00 ` [RFC PATCH 14/35] Subarch support for CPUID instruction Chris Wright
2006-05-09  7:00 ` [RFC PATCH 15/35] subarch support for controlling interrupt delivery Chris Wright
2006-05-09 14:49   ` Martin J. Bligh
2006-05-09 14:55     ` Nick Piggin
2006-05-09 15:51     ` Christian Limpach
2006-05-09 16:02       ` Martin J. Bligh
2006-05-09 16:07       ` Andi Kleen
2006-05-09 16:29         ` Christian Limpach
2006-05-09 16:31           ` Andi Kleen
2006-05-09 20:42             ` Christian Limpach
2006-05-09 21:56               ` Andi Kleen
2006-05-10 10:35                 ` Christian Limpach
2006-05-10 10:54                   ` Andi Kleen
2006-05-09 21:56               ` Chris Wright
2006-05-09  7:00 ` [RFC PATCH 16/35] subarch support for interrupt and exception gates Chris Wright
2006-05-09 11:09   ` Andi Kleen
2006-05-09 12:55     ` Christian Limpach
2006-05-13 12:27   ` Andrew Morton
2006-05-15 18:30     ` Chris Wright
2006-05-09  7:00 ` [RFC PATCH 17/35] Segment register changes for Xen Chris Wright
2006-05-09  7:16   ` Pavel Machek
2006-05-10 20:09     ` Andi Kleen
2006-05-10 20:30       ` Pavel Machek
2006-05-11 10:34         ` Avi Kivity
2006-05-11 10:41           ` Andi Kleen
2006-05-12  0:28     ` [Xen-devel] " Rusty Russell
2006-05-09 16:44   ` Andi Kleen
2006-05-18 20:20   ` Zachary Amsden
2006-05-18 20:41     ` Keir Fraser
2006-05-18 21:26     ` Chris Wright
2006-05-09  7:00 ` [RFC PATCH 18/35] Support gdt/idt/ldt handling on Xen Chris Wright
2006-05-09  7:21   ` Pavel Machek
2006-05-10 20:23     ` Andi Kleen
2006-05-09 14:49   ` Martin J. Bligh
2006-05-09 18:14     ` Christian Limpach
2006-05-09 18:21       ` Martin Bligh
2006-05-09  7:00 ` [RFC PATCH 19/35] subarch support for control register accesses Chris Wright
2006-05-09  7:00 ` [RFC PATCH 20/35] subarch stack pointer update Chris Wright
2006-05-09  7:00 ` [RFC PATCH 21/35] subarch TLB support Chris Wright
2006-05-09  7:00 ` [RFC PATCH 22/35] subarch suport for idle loop (NO_IDLE_HZ for Xen) Chris Wright
2006-05-09 13:21   ` Andi Kleen
2006-05-09 15:13     ` Christian Limpach
2006-05-09  7:00 ` [RFC PATCH 23/35] Increase x86 interrupt vector range Chris Wright
2006-05-09  7:00 ` [RFC PATCH 24/35] Add support for Xen event channels Chris Wright
2006-05-12 21:41   ` Pavel Machek
2006-05-13 12:27   ` Andrew Morton
2006-05-13 13:02     ` Keir Fraser
2006-05-09  7:00 ` [RFC PATCH 25/35] Add Xen time abstractions Chris Wright
2006-05-09 16:23   ` Daniel Walker
2006-05-09 16:38     ` Christian Limpach
2006-05-09 19:27       ` Adrian Bunk
2006-05-09 21:50   ` Andi Kleen
2006-05-09 23:03     ` Ingo Oeser
2006-05-09 23:09       ` Andi Kleen
2006-05-09 23:13       ` Chris Wright
2006-05-12 21:44   ` Pavel Machek
2006-05-09  7:00 ` [RFC PATCH 26/35] Add Xen subarch reboot support Chris Wright
2006-05-09 17:02   ` Andi Kleen
2006-05-12 21:46     ` Pavel Machek
2006-05-12 21:57       ` Chris Wright
2006-05-09  7:00 ` [RFC PATCH 27/35] Add nosegneg capability to the vsyscall page notes Chris Wright
2006-05-09  7:00 ` [RFC PATCH 28/35] add support for Xen feature queries Chris Wright
2006-05-12 21:56   ` Pavel Machek
2006-05-09  7:00 ` [RFC PATCH 29/35] Add the Xen virtual console driver Chris Wright
2006-05-09 13:26   ` Andi Kleen
2006-05-09 15:03     ` Christian Limpach
2006-05-13 12:27   ` Andrew Morton
2006-05-13 12:51     ` Nick Piggin
2006-05-13 14:29       ` Andrew Morton
2006-05-13 14:43         ` Nick Piggin
2006-05-09  7:00 ` [RFC PATCH 30/35] Add apply_to_page_range() function Chris Wright
2006-05-09  7:00 ` [RFC PATCH 31/35] Add Xen grant table support Chris Wright
2006-05-09  7:00 ` [RFC PATCH 32/35] Add Xen driver utility functions Chris Wright
2006-05-09 19:48   ` Greg KH
2006-05-09 21:50   ` Andi Kleen
2006-05-09  7:00 ` [RFC PATCH 33/35] Add the Xenbus sysfs and virtual device hotplug driver Chris Wright
2006-05-09 16:06   ` Alexey Dobriyan
2006-05-09 16:28     ` Andi Kleen
2006-05-09 19:40   ` Greg KH [this message]
2006-05-09 21:53     ` Chris Wright
2006-05-09 22:01       ` Greg KH
2006-05-09 22:50         ` Chris Wright
2006-05-09 23:43         ` Anthony Liguori
2006-05-09 19:49   ` Greg KH
2006-05-09 19:58     ` Chris Wright
2006-05-13 12:28   ` Andrew Morton
2006-05-09  7:00 ` [RFC PATCH 34/35] Add the Xen virtual network device driver Chris Wright
2006-05-09 11:55   ` [Xen-devel] " Herbert Xu
2006-05-09 12:43     ` Christian Limpach
2006-05-09 13:01       ` Herbert Xu
2006-05-09 13:14         ` Andi Kleen
2006-05-09 13:16         ` Christian Limpach
2006-05-09 13:26           ` Herbert Xu
2006-05-09 14:00             ` Christian Limpach
2006-05-09 14:30               ` David Boutcher
2006-05-09 23:35                 ` Chris Wright
2006-05-09 11:58   ` Christoph Hellwig
2006-05-09 23:37     ` Chris Wright
2006-05-09 18:56   ` Stephen Hemminger
2006-05-09 23:39     ` Chris Wright
2006-05-09 20:25   ` Stephen Hemminger
2006-05-09 20:26     ` Keir Fraser
2006-05-09 20:39       ` Stephen Hemminger
2006-05-09 20:46       ` Roland Dreier
2006-05-10 18:28         ` Andi Kleen
2006-05-11  0:33           ` Herbert Xu
2006-05-11  7:49             ` Keir Fraser
2006-05-11  8:04               ` Herbert Xu
2006-05-11  9:47               ` Andi Kleen
2006-05-11 16:18                 ` Stephen Hemminger
2006-05-11 16:48                 ` Rick Jones
2006-05-11 16:55                   ` Stephen Hemminger
2006-05-11 17:30                   ` Andi Kleen
2006-05-09 20:32     ` Chris Wright
2006-05-09 22:41   ` [Xen-devel] " Herbert Xu
2006-05-09 23:51     ` Chris Wright
2006-05-10  6:36       ` Keir Fraser
2006-05-09  7:00 ` [RFC PATCH 35/35] Add Xen virtual block " Chris Wright
2006-05-09 12:01   ` Christoph Hellwig
2006-05-09 14:49 ` [RFC PATCH 00/35] Xen i386 paravirtualization support Martin J. Bligh
2006-05-09 15:07   ` Christoph Hellwig
2006-05-09 15:12     ` Martin J. Bligh
2006-05-09 15:20     ` Andi Kleen
2006-05-09 15:22       ` Christoph Hellwig
2006-05-09 15:45         ` Pekka Enberg
2006-05-14  1:35         ` Andrew Morton
2006-05-15 21:01           ` Chris Wright
  -- strict thread matches above, loose matches on Subject: below --
2006-03-22  6:30 Chris Wright
2006-03-22  6:31 ` [RFC PATCH 33/35] Add the Xenbus sysfs and virtual device hotplug driver Chris Wright
2006-03-22  8:53   ` Arjan van de Ven
2006-03-22 11:14     ` Keir Fraser

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=20060509194044.GA374@kroah.com \
    --to=greg@kroah.com \
    --cc=Christian.Limpach@cl.cam.ac.uk \
    --cc=chrisw@sous-sol.org \
    --cc=ian.pratt@xensource.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=virtualization@lists.osdl.org \
    --cc=xen-devel@lists.xensource.com \
    /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