From: Mark McLoughlin <markmc@redhat.com>
To: Cornelia Huck <cornelia.huck@de.ibm.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>,
linux-kernel@vger.kernel.org,
virtualization@lists.linux-foundation.org,
Anthony Liguori <aliguori@us.ibm.com>,
Kay Sievers <kay.sievers@vrfy.org>, Greg KH <gregkh@suse.de>
Subject: Re: [PATCH 2/6] virtio: add register_virtio_root_device()
Date: Thu, 11 Dec 2008 16:16:43 +0000 [thread overview]
Message-ID: <1229012203.7968.79.camel@blaa> (raw)
In-Reply-To: <20081211135924.4394cc56@gondolin>
On Thu, 2008-12-11 at 13:59 +0100, Cornelia Huck wrote:
> On Wed, 10 Dec 2008 17:45:35 +0000,
> Mark McLoughlin <markmc@redhat.com> wrote:
>
> > Add a function to allocate a root device object to group the
> > devices from a given virtio implementation.
> >
> > Also add a 'module' sysfs symlink to allow so that userspace
> > can generically determine which virtio implementation a
> > 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.
>
> Nothing about this is really virtio-specific (just as
> s390_root_dev_register() is not really s390-specific), and a 'module'
> symlink doesn't really hurt in a generic implementation, even if it is
> unneeded. I'm voting to put this in some generic, always built-in code
> (or have the users select it) so we could also use it from s390.
Okay, coming up ...
> > Signed-off-by: Mark McLoughlin <markmc@redhat.com>
> > ---
> > drivers/virtio/virtio.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++
> > include/linux/virtio.h | 10 ++++++
> > 2 files changed, 81 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
> > index 018c070..61e6597 100644
> > --- a/drivers/virtio/virtio.c
> > +++ b/drivers/virtio/virtio.c
> > @@ -1,6 +1,7 @@
> > #include <linux/virtio.h>
> > #include <linux/spinlock.h>
> > #include <linux/virtio_config.h>
> > +#include <linux/err.h>
> >
> > /* Unique numbering for virtio devices. */
> > static unsigned int dev_index;
> > @@ -200,6 +201,76 @@ void unregister_virtio_device(struct virtio_device *dev)
> > }
> > EXPORT_SYMBOL_GPL(unregister_virtio_device);
> >
> > +/* A root device for virtio devices from a given backend. This makes them
> > + * appear as /sys/devices/{name}/0,1,2 not /sys/devices/0,1,2. It also allows
> > + * us to have a /sys/devices/{name}/module symlink to the backend module. */
> > +struct virtio_root_device
> > +{
> > + struct device dev;
> > + struct module *owner;
> > +};
> > +
> > +static struct virtio_root_device *to_virtio_root(struct device *dev)
> > +{
> > + return container_of(dev, struct virtio_root_device, dev);
> > +}
> > +
> > +static void release_virtio_root_device(struct device *dev)
> > +{
> > + struct virtio_root_device *root = to_virtio_root(dev);
> > + if (root->owner)
> > + sysfs_remove_link(&root->dev.kobj, "module");
> > + kfree(root);
> > +}
>
> Can this code be a module? If yes, move the release callback to a
> build-in as there are races with release-functions in modules.
Not sure I fully understand the issue here, but it won't be an problem
with it if we move to driver core.
> > +struct device *__register_virtio_root_device(const char *name,
> > + struct module *owner)
> > +{
> > + struct virtio_root_device *root;
> > + int err = -ENOMEM;
> > +
> > + root = kzalloc(sizeof(struct virtio_root_device), GFP_KERNEL);
> > + if (!root)
> > + goto out;
> > +
> > + err = dev_set_name(&root->dev, name);
> > + if (err)
> > + goto free_root;
> > +
> > + err = device_register(&root->dev);
> > + if (err)
> > + goto free_root;
> > +
> > + root->dev.parent = NULL;
> > + root->dev.release = release_virtio_root_device;
>
> You must set ->release before calling device_register(), and setting
> the parent is unneeded.
Okay.
> > + if (owner) {
> > + struct module_kobject *mk = &owner->mkobj;
> > +
> > + err = sysfs_create_link(&root->dev.kobj, &mk->kobj, "module");
> > + if (err) {
> > + device_unregister(&root->dev);
> > + return ERR_PTR(err);
> > + }
> > +
> > + root->owner = owner;
> > + }
> > +
> > + return &root->dev;
> > +
> > +free_root:
> > + kfree(root);
>
> You need to call device_put() if you called device_register().
Oh, I missed that subtlety. So the rules are:
1) To release before calling device_register(), use kfree()
2) To release if device_register() failed, put_device()
3) To release once device_register() succeeds, device_unregister()
Cheers,
Mark.
next prev parent reply other threads:[~2008-12-11 16:21 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
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 16:16 ` Mark McLoughlin [this message]
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:45 ` Martin Schwidefsky
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 ` 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-12 9:35 ` [PATCH 4/4] s390: remove s390_root_dev_*() Mark McLoughlin
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-11 18:23 ` Mark McLoughlin
2008-12-12 8:42 ` Cornelia Huck
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-11 16:56 ` Cornelia Huck
2008-12-11 16:16 ` [PATCH 2/6] virtio: add register_virtio_root_device() Mark McLoughlin
2008-12-11 12:59 ` 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=1229012203.7968.79.camel@blaa \
--to=markmc@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=cornelia.huck@de.ibm.com \
--cc=gregkh@suse.de \
--cc=kay.sievers@vrfy.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rusty@rustcorp.com.au \
--cc=virtualization@lists.linux-foundation.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.