devctl (alike?) for devfs
Andriy Gapon
avg at icyb.net.ua
Wed May 14 13:19:10 UTC 2008
on 14/05/2008 15:19 Kostik Belousov said the following:
> On Tue, May 13, 2008 at 11:40:21PM +0300, Andriy Gapon wrote:
>> on 13/05/2008 22:16 Kostik Belousov said the following:
>>> I looked at your previous patch, and it seems it is much simpler to
>>> do drop the devmtx once more then to try to abuse free lists.
>>> In the destroy_devl(), after the
>>>
>>> while (dev->si_threadcount != 0) {
>>> /* Use unique dummy wait ident */
>>> msleep(&csw, &devmtx, PRIBIO, "devdrn", hz / 10);
>>> }
>>>
>>> loop, add
>>>
>>> mtx_unlock(&devmtx);
>>> if (!cold)
>>> devctl_notify("DEVFS", dev->si_name, "DESTROY", NULL);
>>> mtx_lock(&devmtx);
>> Thank you again! This is simply perfect.
>>
>>
>> --
>> Andriy Gapon
>
>> diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
>> index 1db25f8..f90e469 100644
>
> I do not like abusing the subsystem to communicate the data.
>
> What about this instead ? The created/destroyed cdev name is available
> in the $cdev variable, example clause for devd.conf looks like this:
Kostik,
I do not have a strong opinion on the exact format of notification.
Your code definitely looks cleaner and friendlier, so I am all for it.
P.S. the only non-obvious thing in "strcat-ing" is that space for '\0'
is accounted for in sizeof(prefix) whereas actual '\0' is copied from
si_name.
> notify 1000 {
> system "DEVFS";
> subsystem "CDEV";
> action "echo $type $cdev >/dev/console";
> };
>
> diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c
> index e911913..a5ed25c 100644
> --- a/sys/kern/kern_conf.c
> +++ b/sys/kern/kern_conf.c
> @@ -30,6 +30,7 @@ __FBSDID("$FreeBSD: src/sys/kern/kern_conf.c,v 1.211 2008/04/02 11:11:58 kib Exp
> #include <sys/param.h>
> #include <sys/kernel.h>
> #include <sys/systm.h>
> +#include <sys/bus.h>
> #include <sys/bio.h>
> #include <sys/lock.h>
> #include <sys/mutex.h>
> @@ -526,6 +527,37 @@ unit2minor(int unit)
> return ((unit & 0xff) | ((unit << 8) & ~0xffff));
> }
>
> +static void
> +notify(struct cdev *dev, const char *ev)
> +{
> + static const char prefix[] = "cdev=";
> + char *data;
> + int namelen;
> +
> + if (cold)
> + return;
> + namelen = strlen(dev->si_name);
> + data = malloc(namelen + sizeof(prefix), M_TEMP, M_WAITOK);
> + memcpy(data, prefix, sizeof(prefix) - 1);
> + memcpy(data + sizeof(prefix) - 1, dev->si_name, namelen + 1);
> + devctl_notify("DEVFS", "CDEV", ev, data);
> + free(data, M_TEMP);
> +}
> +
> +static void
> +notify_create(struct cdev *dev)
> +{
> +
> + notify(dev, "CREATE");
> +}
> +
> +static void
> +notify_destroy(struct cdev *dev)
> +{
> +
> + notify(dev, "DESTROY");
> +}
> +
> static struct cdev *
> newdev(struct cdevsw *csw, int y, struct cdev *si)
> {
> @@ -706,6 +738,9 @@ make_dev_credv(int flags, struct cdevsw *devsw, int minornr,
> devfs_create(dev);
> clean_unrhdrl(devfs_inos);
> dev_unlock_and_free();
> +
> + notify_create(dev);
> +
> return (dev);
> }
>
> @@ -794,6 +829,9 @@ make_dev_alias(struct cdev *pdev, const char *fmt, ...)
> clean_unrhdrl(devfs_inos);
> dev_unlock();
> dev_depends(pdev, dev);
> +
> + notify_create(dev);
> +
> return (dev);
> }
>
> @@ -842,6 +880,10 @@ destroy_devl(struct cdev *dev)
> msleep(&csw, &devmtx, PRIBIO, "devdrn", hz / 10);
> }
>
> + mtx_unlock(&devmtx);
> + notify_destroy(dev);
> + mtx_lock(&devmtx);
> +
> dev->si_drv1 = 0;
> dev->si_drv2 = 0;
> bzero(&dev->__si_u, sizeof(dev->__si_u));
--
Andriy Gapon
More information about the freebsd-hackers
mailing list