CVS commit: src/sys/arch/landisk/dev
Module Name:src Committed By: rin Date: Thu Jul 15 05:07:50 UTC 2021 Modified Files: src/sys/arch/landisk/dev: btn_obio.c button.c buttonvar.h Log Message: Migrate btn_init() from btnopen() (with RUN_ONCE) to btn_obio_attach(). Fix uninitialized use of btn_event_list_lock in btn_event_register(). Found by LOCKDEBUG. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/arch/landisk/dev/btn_obio.c cvs rdiff -u -r1.10 -r1.11 src/sys/arch/landisk/dev/button.c cvs rdiff -u -r1.1 -r1.2 src/sys/arch/landisk/dev/buttonvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/arch/landisk/dev/btn_obio.c diff -u src/sys/arch/landisk/dev/btn_obio.c:1.6 src/sys/arch/landisk/dev/btn_obio.c:1.7 --- src/sys/arch/landisk/dev/btn_obio.c:1.6 Sat Jan 21 19:44:29 2012 +++ src/sys/arch/landisk/dev/btn_obio.c Thu Jul 15 05:07:50 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: btn_obio.c,v 1.6 2012/01/21 19:44:29 nonaka Exp $ */ +/* $NetBSD: btn_obio.c,v 1.7 2021/07/15 05:07:50 rin Exp $ */ /*- * Copyright (C) 2005 NONAKA Kimihiro @@ -28,7 +28,7 @@ #include "pwrsw_obio.h" #include -__KERNEL_RCSID(0, "$NetBSD: btn_obio.c,v 1.6 2012/01/21 19:44:29 nonaka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: btn_obio.c,v 1.7 2021/07/15 05:07:50 rin Exp $"); #include #include @@ -141,6 +141,7 @@ btn_obio_attach(device_t parent, device_ } sc->sc_mask |= BTN_RESET_BIT; + btn_init(); for (i = 0; i < NBUTTON; i++) { int idx = btnlist[i].idx; sc->sc_bev[idx].bev_name = btnlist[i].name; Index: src/sys/arch/landisk/dev/button.c diff -u src/sys/arch/landisk/dev/button.c:1.10 src/sys/arch/landisk/dev/button.c:1.11 --- src/sys/arch/landisk/dev/button.c:1.10 Sat Dec 19 21:25:03 2020 +++ src/sys/arch/landisk/dev/button.c Thu Jul 15 05:07:50 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: button.c,v 1.10 2020/12/19 21:25:03 thorpej Exp $ */ +/* $NetBSD: button.c,v 1.11 2021/07/15 05:07:50 rin Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: button.c,v 1.10 2020/12/19 21:25:03 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: button.c,v 1.11 2021/07/15 05:07:50 rin Exp $"); #include #include @@ -59,7 +59,6 @@ __KERNEL_RCSID(0, "$NetBSD: button.c,v 1 /* * event handler */ -static ONCE_DECL(btn_once); static LIST_HEAD(, btn_event) btn_event_list; static kmutex_t btn_event_list_lock; @@ -105,7 +104,7 @@ const struct cdevsw button_cdevsw = { .d_flag = 0 }; -static int +int btn_init(void) { @@ -161,11 +160,6 @@ btnopen(dev_t dev, int flag, int mode, s { int error; - error = RUN_ONCE(&btn_once, btn_init); - if (error) { - return error; - } - if (minor(dev) != 0) { return (ENODEV); } Index: src/sys/arch/landisk/dev/buttonvar.h diff -u src/sys/arch/landisk/dev/buttonvar.h:1.1 src/sys/arch/landisk/dev/buttonvar.h:1.2 --- src/sys/arch/landisk/dev/buttonvar.h:1.1 Fri Sep 1 21:26:18 2006 +++ src/sys/arch/landisk/dev/buttonvar.h Thu Jul 15 05:07:50 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: buttonvar.h,v 1.1 2006/09/01 21:26:18 uwe Exp $ */ +/* $NetBSD: buttonvar.h,v 1.2 2021/07/15 05:07:50 rin Exp $ */ /*- * Copyright (c) 2000 Zembu Labs, Inc. @@ -45,6 +45,8 @@ struct btn_event { LIST_ENTRY(btn_event) bev_list; }; +int btn_init(void); + void btn_settype(const char *type); int btn_event_register(struct btn_event *bev);
CVS commit: src/sys/arch/landisk/dev
Module Name:src Committed By: thorpej Date: Sat Dec 19 21:25:04 UTC 2020 Modified Files: src/sys/arch/landisk/dev: button.c Log Message: Use sel{record,remove}_knote(). To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/sys/arch/landisk/dev/button.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/arch/landisk/dev/button.c diff -u src/sys/arch/landisk/dev/button.c:1.9 src/sys/arch/landisk/dev/button.c:1.10 --- src/sys/arch/landisk/dev/button.c:1.9 Wed Oct 25 08:12:37 2017 +++ src/sys/arch/landisk/dev/button.c Sat Dec 19 21:25:03 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: button.c,v 1.9 2017/10/25 08:12:37 maya Exp $ */ +/* $NetBSD: button.c,v 1.10 2020/12/19 21:25:03 thorpej Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: button.c,v 1.9 2017/10/25 08:12:37 maya Exp $"); +__KERNEL_RCSID(0, "$NetBSD: button.c,v 1.10 2020/12/19 21:25:03 thorpej Exp $"); #include #include @@ -296,8 +296,7 @@ filt_btn_rdetach(struct knote *kn) { mutex_enter(&btn_event_queue_lock); - SLIST_REMOVE(&btn_event_queue_selinfo.sel_klist, - kn, knote, kn_selnext); + selremove_knote(&btn_event_queue_selinfo, kn); mutex_exit(&btn_event_queue_lock); } @@ -329,7 +328,6 @@ static const struct filterops btn_write_ int btnkqfilter(dev_t dev, struct knote *kn) { - struct klist *klist; if (minor(dev) != 0) { return (ENODEV); @@ -337,12 +335,10 @@ btnkqfilter(dev_t dev, struct knote *kn) switch (kn->kn_filter) { case EVFILT_READ: - klist = &btn_event_queue_selinfo.sel_klist; kn->kn_fop = &btn_read_filtops; break; case EVFILT_WRITE: - klist = &btn_event_queue_selinfo.sel_klist; kn->kn_fop = &btn_write_filtops; break; @@ -351,7 +347,7 @@ btnkqfilter(dev_t dev, struct knote *kn) } mutex_enter(&btn_event_queue_lock); - SLIST_INSERT_HEAD(klist, kn, kn_selnext); + selrecord_knote(&btn_event_queue_selinfo, kn); mutex_exit(&btn_event_queue_lock); return (0);
CVS commit: src/sys/arch/landisk/dev
Module Name:src Committed By: rmind Date: Sat May 14 02:27:35 UTC 2011 Modified Files: src/sys/arch/landisk/dev: button.c Log Message: Convert to mutex(9)/condvar(9). Use RUN_ONCE(9) to avoid racy init. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/arch/landisk/dev/button.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. Modified files: Index: src/sys/arch/landisk/dev/button.c diff -u src/sys/arch/landisk/dev/button.c:1.5 src/sys/arch/landisk/dev/button.c:1.6 --- src/sys/arch/landisk/dev/button.c:1.5 Sat Mar 1 14:16:49 2008 +++ src/sys/arch/landisk/dev/button.c Sat May 14 02:27:35 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: button.c,v 1.5 2008/03/01 14:16:49 rmind Exp $ */ +/* $NetBSD: button.c,v 1.6 2011/05/14 02:27:35 rmind Exp $ */ /* * Copyright (c) 2003 Wasabi Systems, Inc. @@ -36,20 +36,18 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: button.c,v 1.5 2008/03/01 14:16:49 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: button.c,v 1.6 2011/05/14 02:27:35 rmind Exp $"); #include #include #include -#include -#include #include -#include -#include +#include #include #include #include #include +#include #include #include #include @@ -61,17 +59,17 @@ /* * event handler */ -static LIST_HEAD(, btn_event) btn_event_list = -LIST_HEAD_INITIALIZER(btn_event_list); -static struct simplelock btn_event_list_slock = -SIMPLELOCK_INITIALIZER; +static ONCE_DECL(btn_once); +static LIST_HEAD(, btn_event) btn_event_list; +static kmutex_t btn_event_list_lock; static struct lwp *btn_daemon; #define BTN_MAX_EVENTS 32 -static struct simplelock btn_event_queue_slock = -SIMPLELOCK_INITIALIZER; +static kmutex_t btn_event_queue_lock; +static kcondvar_t btn_event_queue_cv; + static button_event_t btn_event_queue[BTN_MAX_EVENTS]; static int btn_event_queue_head; static int btn_event_queue_tail; @@ -98,6 +96,19 @@ }; static int +btn_init(void) +{ + + LIST_INIT(&btn_event_list); + mutex_init(&btn_event_list_lock, MUTEX_DEFAULT, IPL_NONE); + mutex_init(&btn_event_queue_lock, MUTEX_DEFAULT, IPL_NONE); + cv_init(&btn_event_queue_cv, "btncv"); + selinit(&btn_event_queue_selinfo); + + return 0; +} + +static int btn_queue_event(button_event_t *bev) { @@ -138,19 +149,18 @@ int btnopen(dev_t dev, int flag, int mode, struct lwp *l) { - static bool btn_event_queue_selinfo_init; /* XXX */ int error; - if (!btn_event_queue_selinfo_init) { - selinit(&btn_event_queue_selinfo); - btn_event_queue_selinfo_init = true; + error = RUN_ONCE(&btn_once, btn_init); + if (error) { + return error; } if (minor(dev) != 0) { return (ENODEV); } - simple_lock(&btn_event_queue_slock); + mutex_enter(&btn_event_queue_lock); if (btn_daemon != NULL) { error = EBUSY; } else { @@ -158,7 +168,7 @@ btn_daemon = l; btn_event_queue_flush(); } - simple_unlock(&btn_event_queue_slock); + mutex_exit(&btn_event_queue_lock); return (error); } @@ -172,11 +182,11 @@ return (ENODEV); } - simple_lock(&btn_event_queue_slock); + mutex_enter(&btn_event_queue_lock); count = btn_event_queue_count; btn_daemon = NULL; btn_event_queue_flush(); - simple_unlock(&btn_event_queue_slock); + mutex_exit(&btn_event_queue_lock); if (count) { printf("WARNING: %d events lost by exiting daemon\n", count); @@ -224,23 +234,22 @@ return (EINVAL); } - simple_lock(&btn_event_queue_slock); + mutex_enter(&btn_event_queue_lock); for (;;) { if (btn_get_event(&bev)) { - simple_unlock(&btn_event_queue_slock); + mutex_exit(&btn_event_queue_lock); return (uiomove(&bev, BUTTON_EVENT_MSG_SIZE, uio)); } if (flags & IO_NDELAY) { - simple_unlock(&btn_event_queue_slock); + mutex_exit(&btn_event_queue_lock); return (EWOULDBLOCK); } btn_event_queue_flags |= BEVQ_F_WAITING; - error = ltsleep(&btn_event_queue_count, - (PRIBIO|PCATCH), "btnread", 0, &btn_event_queue_slock); + error = cv_wait_sig(&btn_event_queue_cv, &btn_event_queue_lock); if (error) { - simple_unlock(&btn_event_queue_slock); + mutex_exit(&btn_event_queue_lock); return (error); } } @@ -261,13 +270,13 @@ if ((events & (POLLIN | POLLRDNORM)) == 0) return (revents); - simple_lock(&btn_event_queue_slock); + mutex_enter(&btn_event_queue_lock); if (btn_event_queue_count) { revents |= events & (POLLIN | POLLRDNORM); } else { selrecord(l, &btn_event_queue_selinfo); } - simple_unlock(&btn_event_queue_slock); + mutex_exit(&btn_event_queue_lock); return (revents); } @@ -276,19 +285,19 @@ filt_btn_rdetach(struct knote *kn) { - simple_lock(&btn_event_queue_slock); + mutex_enter(&btn_event_queue_lock); SLIST_REMOVE(&btn_event_queue_selinfo.sel_klist, kn, knote, kn_selnext); - simple_unlock(&btn_event_queue_slock); + mutex_exit(&btn_event_queue_lock); } static int filt_btn_read(struct knote *kn, long hint) { - simple_lock(&btn_event