Date: Wed, 14 Jun 2017 15:17:36 +0000 From: bugzilla-noreply@freebsd.org To: freebsd-bugs@FreeBSD.org Subject: [Bug 219988] [kernel] sys/kern/kern_sysctl.c:a sleep-under-rmlock bug in sysctl_add_oid Message-ID: <bug-219988-8-3RgBntooFq@https.bugs.freebsd.org/bugzilla/> In-Reply-To: <bug-219988-8@https.bugs.freebsd.org/bugzilla/> References: <bug-219988-8@https.bugs.freebsd.org/bugzilla/>
next in thread | previous in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D219988 Conrad Meyer <cem@freebsd.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |cem@freebsd.org Version|11.0-RELEASE |CURRENT Hardware|i386 |Any --- Comment #1 from Conrad Meyer <cem@freebsd.org> --- I suggest moving the allocation out from under the lock rather than convert= ing an M_WAITOK allocation to M_NOWAIT. E.g., --- a/sys/kern/kern_sysctl.c +++ b/sys/kern/kern_sysctl.c @@ -698,11 +698,12 @@ sysctl_add_oid(struct sysctl_ctx_list *clist, struct sysctl_oid_list *parent, int (*handler)(SYSCTL_HANDLER_ARGS), const char *fmt, const char *descr, const char *label) { - struct sysctl_oid *oidp; + struct sysctl_oid *oidp, *storage; /* You have to hook up somewhere.. */ if (parent =3D=3D NULL) return(NULL); + storage =3D malloc(sizeof(*storage), M_SYSCTLOID, M_WAITOK|M_ZERO); /* Check if the node already exists, otherwise create it */ SYSCTL_WLOCK(); oidp =3D sysctl_find_oidname(name, parent); @@ -713,14 +714,16 @@ sysctl_add_oid(struct sysctl_ctx_list *clist, struct sysctl_oid_list *parent, if (clist !=3D NULL) sysctl_ctx_entry_add(clist, oidp); SYSCTL_WUNLOCK(); + free(storage); return (oidp); } else { SYSCTL_WUNLOCK(); printf("can't re-use a leaf (%s)!\n", name); + free(storage); return (NULL); } } - oidp =3D malloc(sizeof(struct sysctl_oid), M_SYSCTLOID, M_WAITOK|M_= ZERO); + oidp =3D storage; oidp->oid_parent =3D parent; SLIST_INIT(&oidp->oid_children); oidp->oid_number =3D number; --=20 You are receiving this mail because: You are the assignee for the bug.=
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-219988-8-3RgBntooFq>