From: Mark McLoughlin <markmc@redhat.com>
To: Anthony Liguori <aliguori@us.ibm.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>,
linux-kernel <linux-kernel@vger.kernel.org>,
kvm <kvm@vger.kernel.org>, Michael Tokarev <mjt@tls.msk.ru>,
Jesse Barnes <jbarnes@virtuousgeek.org>
Subject: Re: [PATCH] virtio: make PCI devices take a virtio_pci module ref
Date: Tue, 09 Dec 2008 16:41:30 +0000 [thread overview]
Message-ID: <1228840890.26198.25.camel@blaa> (raw)
In-Reply-To: <493D334D.6050004@us.ibm.com>
On Mon, 2008-12-08 at 08:46 -0600, Anthony Liguori wrote:
> Mark McLoughlin wrote:
> > On Sun, 2008-12-07 at 18:52 +1030, Rusty Russell wrote:
> >
> >> On Saturday 06 December 2008 01:37:06 Mark McLoughlin wrote:
> >>
> >>> Another example of a lack of an explicit dependency causing problems is
> >>> Fedora's mkinitrd having this hack:
> >>>
> >>> if echo $PWD | grep -q /virtio-pci/ ; then
> >>> findmodule virtio_pci
> >>> fi
> >>>
> >>> which basically says "if this is a virtio device, don't forget to
> >>> include virtio_pci in the initrd too!". Now, mkinitrd is full of hacks,
> >>> but this is a particularly unusual one.
> >>>
> >> Um, I don't know what this does, sorry.
> >>
> >> I have no idea how Fedora chooses what to put in an initrd; I can't think
> >> of a sensible way of deciding what goes in and what doesn't other than
> >> lists and heuristics.
> >>
> >
> > Fedora's mkinitrd creates an initrd suitable to boot the machine you run
> > mkinitrd on, rather than creating an initrd suitable to boot any
> > machine.
> >
> > So, it goes "ah, / is mounted from /dev/vda, we need to include
> > virtio_blk and it's dependencies". It does that in a generic way that
> > works well for most setups:
> >
> > 1) Find the device name (e.g. vda) below /sys/block
> >
> > 2) Follow the 'device' link to e.g. /sys/devices/virtio-pci/virtio1
> >
> > 3) Find the module need for this through either 'modalias' or the
> > 'driver/module' symlink
> >
> > 4) Use modprobe to list any dependencies of that module
> >
> > Clearly, virtio-pci won't be pulled in by any of this so we've added a
> > hack to say "oh, it's a virtio device, let's include virtio_pci just in
> > case".
> >
> > It's not even the case that mkinitrd needs to know how to include the
> > the module for the bus, because in our case that's virtio.ko ... we've
> > pretty effectively hidden the the bus *implementation* from userspace.
> >
> > I don't think this is worth wasting too much time fixing, that's why I'm
> > thinking we should just make virtio_pci built-in by default with
> > CONFIG_KVM_GUEST.
> >
>
> What if we have multiple virtio transports?
I don't think that's so much an an issue (just build in any transport
supported by KVM), but rather that you might build a non-pv_ops kernel
to run on QEMU which would benefit from using virtio drivers ...
> Is there a way that we can
> expose the relationship with virtio-blk and virtio-pci in sysfs? We
> have a struct device for the PCI device, it's just a matter of making
> the link visible.
It feels a bit like busy work to generalise this since only virtio_pci
can be built as a module, but here's a patch.
The mkinitrd hack turns into:
# Handle finding virtio bus implementations
if [ -L ./virtio_module ] ; then
findmodule $(basename $(readlink ./virtio_module))
else if echo $PWD | grep -q /virtio-pci/ ; then
findmodule virtio_pci
fi; fi
Cheers,
Mark.
[PATCH] virtio: add a 'virtio_module' sysfs symlink
Add a way for userspace to determine which virtio bus transport a
given device is associated with.
This will be used by Fedora mkinitrd to generically determine e.g.
that virtio_pci is needed to mount a given root filesystem.
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
---
drivers/virtio/virtio.c | 21 ++++++++++++++++++++-
drivers/virtio/virtio_pci.c | 1 +
include/linux/virtio_config.h | 2 ++
3 files changed, 23 insertions(+), 1 deletions(-)
diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
index 018c070..640ede8 100644
--- a/drivers/virtio/virtio.c
+++ b/drivers/virtio/virtio.c
@@ -189,13 +189,32 @@ int register_virtio_device(struct virtio_device *dev)
* matching driver. */
err = device_register(&dev->dev);
if (err)
- add_status(dev, VIRTIO_CONFIG_S_FAILED);
+ goto out;
+
+ /* Create a virtio_module symlink */
+ if (dev->config->owner) {
+ struct module_kobject *mk = &dev->config->owner->mkobj;
+
+ err = sysfs_create_link(&dev->dev.kobj, &mk->kobj,
+ "virtio_module");
+ if (err)
+ goto unreg;
+ }
+
+ return 0;
+
+unreg:
+ device_unregister(&dev->dev);
+out:
+ add_status(dev, VIRTIO_CONFIG_S_FAILED);
return err;
}
EXPORT_SYMBOL_GPL(register_virtio_device);
void unregister_virtio_device(struct virtio_device *dev)
{
+ if (dev->config->owner)
+ sysfs_remove_link(&dev->dev.kobj, "virtio_module");
device_unregister(&dev->dev);
}
EXPORT_SYMBOL_GPL(unregister_virtio_device);
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
index 939e0b4..59e928d 100644
--- a/drivers/virtio/virtio_pci.c
+++ b/drivers/virtio/virtio_pci.c
@@ -328,6 +328,7 @@ static void vp_del_vq(struct virtqueue *vq)
}
static struct virtio_config_ops virtio_pci_config_ops = {
+ .owner = THIS_MODULE,
.get = vp_get,
.set = vp_set,
.get_status = vp_get_status,
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index bf8ec28..0a01cda 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -33,6 +33,7 @@
/**
* virtio_config_ops - operations for configuring a virtio device
+ * @owner: the module implementing these ops, usually THIS_MODULE
* @get: read the value of a configuration field
* vdev: the virtio_device
* offset: the offset of the configuration field
@@ -68,6 +69,7 @@
*/
struct virtio_config_ops
{
+ struct module *owner;
void (*get)(struct virtio_device *vdev, unsigned offset,
void *buf, unsigned len);
void (*set)(struct virtio_device *vdev, unsigned offset,
--
1.6.0.3
next prev parent reply other threads:[~2008-12-09 16:43 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-04 12:44 [PATCH] virtio: make PCI devices take a virtio_pci module ref Mark McLoughlin
2008-12-04 22:46 ` Jiri Slaby
2008-12-05 9:02 ` Michael Tokarev
2008-12-05 13:17 ` Jiri Slaby
2008-12-05 14:55 ` Mark McLoughlin
2008-12-05 15:25 ` Jiri Slaby
2008-12-05 15:26 ` Greg KH
2008-12-05 15:26 ` Greg KH
2008-12-05 18:30 ` Mark McLoughlin
2008-12-05 18:46 ` Greg KH
2008-12-08 11:49 ` [PATCH 1/2] virtio: add PCI device release() function Mark McLoughlin
2008-12-08 11:49 ` [PATCH 2/2] virtio: do not statically allocate root device Mark McLoughlin
2008-12-08 14:43 ` Anthony Liguori
2008-12-08 14:58 ` Mark McLoughlin
2008-12-05 18:33 ` [PATCH] virtio: make PCI devices take a virtio_pci module ref Mark McLoughlin
2008-12-05 15:43 ` Anthony Liguori
2008-12-05 17:22 ` Jiri Slaby
2008-12-05 18:36 ` Mark McLoughlin
2008-12-05 18:54 ` Anthony Liguori
2008-12-07 8:30 ` Rusty Russell
2008-12-07 13:36 ` Jiri Slaby
2008-12-05 0:13 ` Rusty Russell
2008-12-05 15:07 ` Mark McLoughlin
2008-12-07 8:22 ` Rusty Russell
2008-12-08 13:03 ` Mark McLoughlin
2008-12-08 14:46 ` Anthony Liguori
2008-12-09 16:41 ` Mark McLoughlin [this message]
2008-12-09 16:57 ` Anthony Liguori
2008-12-09 18:16 ` Kay Sievers
2008-12-10 9:49 ` Mark McLoughlin
2008-12-10 12:02 ` Kay Sievers
2008-12-10 17:44 ` [PATCH 0/6] Clean up virtio device object handling [was Re: [PATCH] virtio: make PCI devices take a virtio_pci module ref] Mark McLoughlin
2008-12-10 17:44 ` Mark McLoughlin
2008-12-10 17:45 ` [PATCH 1/6] virtio: add PCI device release() function Mark McLoughlin
2008-12-10 17:45 ` [PATCH 2/6] virtio: add register_virtio_root_device() Mark McLoughlin
2008-12-10 17:45 ` [PATCH 3/6] virtio: do not statically allocate root device Mark McLoughlin
2008-12-10 17:45 ` [PATCH 4/6] lguest: " Mark McLoughlin
2008-12-10 17:45 ` [PATCH 5/6] kvm-s390: use register_virtio_root_device() Mark McLoughlin
2008-12-10 17:45 ` [PATCH 6/6] lguest: struct device - replace bus_id with dev_name() Mark McLoughlin
2008-12-11 9:05 ` [PATCH 5/6] kvm-s390: use register_virtio_root_device() Christian Borntraeger
2008-12-11 12:49 ` Cornelia Huck
2008-12-11 12:49 ` Cornelia Huck
2008-12-11 9:05 ` Christian Borntraeger
2008-12-11 12:59 ` [PATCH 2/6] virtio: add register_virtio_root_device() Cornelia Huck
2008-12-11 12:59 ` Cornelia Huck
2008-12-11 16:16 ` Mark McLoughlin
2008-12-11 16:16 ` Mark McLoughlin
2008-12-11 16:16 ` [PATCH 1/4] driver core: add root_device_register() Mark McLoughlin
2008-12-11 16:16 ` [PATCH 2/4] virtio: do not statically allocate root device Mark McLoughlin
2008-12-11 16:16 ` [PATCH 3/4] lguest: " Mark McLoughlin
2008-12-11 16:16 ` [PATCH 4/4] s390: remove s390_root_dev_*() Mark McLoughlin
2008-12-11 17:00 ` Cornelia Huck
2008-12-11 17:00 ` Cornelia Huck
2008-12-11 17:00 ` Cornelia Huck
2008-12-12 9:29 ` Cornelia Huck
2008-12-12 9:29 ` Cornelia Huck
2008-12-12 9:29 ` Cornelia Huck
2008-12-12 9:35 ` Mark McLoughlin
2008-12-12 9:35 ` Mark McLoughlin
2008-12-12 9:45 ` Martin Schwidefsky
2008-12-12 9:54 ` Martin Schwidefsky
2008-12-12 9:54 ` Martin Schwidefsky
2008-12-12 9:45 ` Martin Schwidefsky
2008-12-12 9:45 ` Cornelia Huck
2008-12-12 9:45 ` Cornelia Huck
2008-12-12 19:07 ` Greg KH
2008-12-12 19:07 ` Greg KH
2008-12-15 12:58 ` [PATCH 1/4] driver core: add root_device_register() Mark McLoughlin
2008-12-15 12:58 ` [PATCH 2/4] virtio: do not statically allocate root device Mark McLoughlin
2008-12-15 12:58 ` [PATCH 3/4] lguest: " Mark McLoughlin
2008-12-15 12:58 ` [PATCH 4/4] s390: remove s390_root_dev_*() Mark McLoughlin
2008-12-15 22:27 ` [PATCH 2/4] virtio: do not statically allocate root device Rusty Russell
2008-12-15 22:27 ` Rusty Russell
2008-12-11 16:56 ` [PATCH 1/4] driver core: add root_device_register() Cornelia Huck
2008-12-11 18:23 ` Mark McLoughlin
2008-12-12 8:42 ` Cornelia Huck
2008-12-12 8:56 ` Mark McLoughlin
2008-12-12 8:56 ` Mark McLoughlin
2008-12-12 9:23 ` Cornelia Huck
2008-12-12 9:23 ` Cornelia Huck
2008-12-12 8:42 ` Cornelia Huck
2008-12-11 18:23 ` Mark McLoughlin
2008-12-11 16:56 ` Cornelia Huck
2008-12-10 18:07 ` [PATCH 0/6] Clean up virtio device object handling [was Re: [PATCH] virtio: make PCI devices take a virtio_pci module ref] Kay Sievers
2008-12-10 18:07 ` Kay Sievers
2008-12-09 22:25 ` [PATCH] virtio: make PCI devices take a virtio_pci module ref Jesse Barnes
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=1228840890.26198.25.camel@blaa \
--to=markmc@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=jbarnes@virtuousgeek.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mjt@tls.msk.ru \
--cc=rusty@rustcorp.com.au \
/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.