svn commit: r263704 - head/sys/kern
Warner Losh
imp at bsdimp.com
Tue Mar 25 14:03:22 UTC 2014
On Mar 24, 2014, at 9:28 PM, Mateusz Guzik <mjg at FreeBSD.org> wrote:
> Author: mjg
> Date: Tue Mar 25 03:28:58 2014
> New Revision: 263704
> URL: http://svnweb.freebsd.org/changeset/base/263704
>
> Log:
> Make /dev/devctl mpsafe.
>
> MFC after: 1 week
>
> Modified:
> head/sys/kern/subr_bus.c
>
> Modified: head/sys/kern/subr_bus.c
> ==============================================================================
> --- head/sys/kern/subr_bus.c Tue Mar 25 03:25:30 2014 (r263703)
> +++ head/sys/kern/subr_bus.c Tue Mar 25 03:28:58 2014 (r263704)
> @@ -358,15 +358,16 @@ device_sysctl_fini(device_t dev)
> /* Deprecated way to adjust queue length */
> static int sysctl_devctl_disable(SYSCTL_HANDLER_ARGS);
> /* XXX Need to support old-style tunable hw.bus.devctl_disable" */
> -SYSCTL_PROC(_hw_bus, OID_AUTO, devctl_disable, CTLTYPE_INT | CTLFLAG_RW, NULL,
> - 0, sysctl_devctl_disable, "I", "devctl disable -- deprecated");
> +SYSCTL_PROC(_hw_bus, OID_AUTO, devctl_disable, CTLTYPE_INT | CTLFLAG_RW |
> + CTLFLAG_MPSAFE, NULL, 0, sysctl_devctl_disable, "I",
> + "devctl disable -- deprecated”);
This can likely be deleted now...
> #define DEVCTL_DEFAULT_QUEUE_LEN 1000
> static int sysctl_devctl_queue(SYSCTL_HANDLER_ARGS);
> static int devctl_queue_length = DEVCTL_DEFAULT_QUEUE_LEN;
> TUNABLE_INT("hw.bus.devctl_queue", &devctl_queue_length);
> -SYSCTL_PROC(_hw_bus, OID_AUTO, devctl_queue, CTLTYPE_INT | CTLFLAG_RW, NULL,
> - 0, sysctl_devctl_queue, "I", "devctl queue length");
> +SYSCTL_PROC(_hw_bus, OID_AUTO, devctl_queue, CTLTYPE_INT | CTLFLAG_RW |
> + CTLFLAG_MPSAFE, NULL, 0, sysctl_devctl_queue, "I", "devctl queue length");
>
> static d_open_t devopen;
> static d_close_t devclose;
> @@ -376,7 +377,6 @@ static d_poll_t devpoll;
>
> static struct cdevsw dev_cdevsw = {
> .d_version = D_VERSION,
> - .d_flags = D_NEEDGIANT,
> .d_open = devopen,
> .d_close = devclose,
> .d_read = devread,
> @@ -420,23 +420,31 @@ devinit(void)
> static int
> devopen(struct cdev *dev, int oflags, int devtype, struct thread *td)
> {
> +
> if (devsoftc.inuse)
> return (EBUSY);
Why not delete these two lines? Since this isn’t a performance critical part of the code,
it is clearer and safer to just test inuse inside the locked section.
> + mtx_lock(&devsoftc.mtx);
> + if (devsoftc.inuse) {
> + mtx_unlock(&devsoftc.mtx);
> + return (EBUSY);
> + }
> /* move to init */
> devsoftc.inuse = 1;
> devsoftc.nonblock = 0;
> devsoftc.async_proc = NULL;
> + mtx_unlock(&devsoftc.mtx);
> return (0);
> }
>
> static int
> devclose(struct cdev *dev, int fflag, int devtype, struct thread *td)
> {
> - devsoftc.inuse = 0;
> +
> mtx_lock(&devsoftc.mtx);
> + devsoftc.inuse = 0;
> + devsoftc.async_proc = NULL;
> cv_broadcast(&devsoftc.cv);
> mtx_unlock(&devsoftc.mtx);
> - devsoftc.async_proc = NULL;
> return (0);
> }
More information about the svn-src-all
mailing list