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