From owner-svn-src-all@FreeBSD.ORG Mon Jun 8 15:17:12 2015 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 085B39D0; Mon, 8 Jun 2015 15:17:12 +0000 (UTC) (envelope-from br@bsdpad.com) Received: from bsdpad.com (xc1.bsdpad.com [195.154.136.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C28B619FF; Mon, 8 Jun 2015 15:17:11 +0000 (UTC) (envelope-from br@bsdpad.com) Received: from localhost ([127.0.0.1] helo=bsdpad.com) by bsdpad.com with smtp (Exim 4.83 (FreeBSD)) (envelope-from ) id 1Z1yJp-0009qx-OK; Mon, 08 Jun 2015 15:46:29 +0100 Received: by bsdpad.com (nbSMTP-1.00) for uid 1001 br@bsdpad.com; Mon, 8 Jun 2015 15:46:29 +0100 (BST) Date: Mon, 8 Jun 2015 15:46:29 +0100 From: Ruslan Bukin To: John Baldwin Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r284153 - head/sys/kern Message-ID: <20150608144629.GA37834@bsdpad.com> References: <201506081406.t58E6mvA033492@svn.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <201506081406.t58E6mvA033492@svn.freebsd.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 08 Jun 2015 15:17:12 -0000 For some reason it hangs for me after 'random' lines on arm64 FreeBSD clang version 3.6.1 (tags/RELEASE_361/final 237755) 20150525 CPU: ARM Cortex-A57 r1p0 IMPLEMENT ME: dtrace_toxic_ranges random: entropy device infrastructure driver random: selecting highest priority adaptor On Mon, Jun 08, 2015 at 02:06:48PM +0000, John Baldwin wrote: > Author: jhb > Date: Mon Jun 8 14:06:47 2015 > New Revision: 284153 > URL: https://svnweb.freebsd.org/changeset/base/284153 > > Log: > Add an internal "locked" variant of linker_file_lookup_set() and change > the public function to acquire the global linker lock directly. This > permits linker_file_lookup_set() to be safely used from other modules. > > Modified: > head/sys/kern/kern_linker.c > > Modified: head/sys/kern/kern_linker.c > ============================================================================== > --- head/sys/kern/kern_linker.c Mon Jun 8 13:23:56 2015 (r284152) > +++ head/sys/kern/kern_linker.c Mon Jun 8 14:06:47 2015 (r284153) > @@ -137,6 +137,8 @@ static int linker_file_add_dependency(li > linker_file_t dep); > static caddr_t linker_file_lookup_symbol_internal(linker_file_t file, > const char* name, int deps); > +static int linker_file_lookup_set_locked(linker_file_t file, > + const char *name, void *firstp, void *lastp, int *countp); > static int linker_load_module(const char *kldname, > const char *modname, struct linker_file *parent, > const struct mod_depend *verinfo, struct linker_file **lfpp); > @@ -189,7 +191,8 @@ linker_file_sysinit(linker_file_t lf) > > sx_assert(&kld_sx, SA_XLOCKED); > > - if (linker_file_lookup_set(lf, "sysinit_set", &start, &stop, NULL) != 0) > + if (linker_file_lookup_set_locked(lf, "sysinit_set", &start, &stop, > + NULL) != 0) > return; > /* > * Perform a bubble sort of the system initialization objects by > @@ -237,7 +240,7 @@ linker_file_sysuninit(linker_file_t lf) > > sx_assert(&kld_sx, SA_XLOCKED); > > - if (linker_file_lookup_set(lf, "sysuninit_set", &start, &stop, > + if (linker_file_lookup_set_locked(lf, "sysuninit_set", &start, &stop, > NULL) != 0) > return; > > @@ -288,7 +291,8 @@ linker_file_register_sysctls(linker_file > > sx_assert(&kld_sx, SA_XLOCKED); > > - if (linker_file_lookup_set(lf, "sysctl_set", &start, &stop, NULL) != 0) > + if (linker_file_lookup_set_locked(lf, "sysctl_set", &start, &stop, > + NULL) != 0) > return; > > sx_xunlock(&kld_sx); > @@ -309,7 +313,8 @@ linker_file_unregister_sysctls(linker_fi > > sx_assert(&kld_sx, SA_XLOCKED); > > - if (linker_file_lookup_set(lf, "sysctl_set", &start, &stop, NULL) != 0) > + if (linker_file_lookup_set_locked(lf, "sysctl_set", &start, &stop, > + NULL) != 0) > return; > > sx_xunlock(&kld_sx); > @@ -332,7 +337,7 @@ linker_file_register_modules(linker_file > > sx_assert(&kld_sx, SA_XLOCKED); > > - if (linker_file_lookup_set(lf, "modmetadata_set", &start, > + if (linker_file_lookup_set_locked(lf, "modmetadata_set", &start, > &stop, NULL) != 0) { > /* > * This fallback should be unnecessary, but if we get booted > @@ -742,8 +747,8 @@ linker_file_add_dependency(linker_file_t > * This function is used in this file so we can avoid having lots of (void **) > * casts. > */ > -int > -linker_file_lookup_set(linker_file_t file, const char *name, > +static int > +linker_file_lookup_set_locked(linker_file_t file, const char *name, > void *firstp, void *lastp, int *countp) > { > > @@ -751,6 +756,19 @@ linker_file_lookup_set(linker_file_t fil > return (LINKER_LOOKUP_SET(file, name, firstp, lastp, countp)); > } > > +int > +linker_file_lookup_set(linker_file_t file, const char *name, > + void *firstp, void *lastp, int *countp) > +{ > + int error; > + > + sx_slock(&kld_sx); > + error = linker_file_lookup_set_locked(file, name, firstp, lastp, > + countp); > + sx_sunlock(&kld_sx); > + return (error); > +} > + > /* > * List all functions in a file. > */ > @@ -1469,8 +1487,8 @@ linker_preload(void *arg) > /* > * First get a list of stuff in the kernel. > */ > - if (linker_file_lookup_set(linker_kernel_file, MDT_SETNAME, &start, > - &stop, NULL) == 0) > + if (linker_file_lookup_set_locked(linker_kernel_file, MDT_SETNAME, > + &start, &stop, NULL) == 0) > linker_addmodules(linker_kernel_file, start, stop, 1); > > /* > @@ -1479,7 +1497,7 @@ linker_preload(void *arg) > */ > restart: > TAILQ_FOREACH(lf, &loaded_files, loaded) { > - error = linker_file_lookup_set(lf, MDT_SETNAME, &start, > + error = linker_file_lookup_set_locked(lf, MDT_SETNAME, &start, > &stop, NULL); > /* > * First, look to see if we would successfully link with this > @@ -1573,7 +1591,7 @@ restart: > panic("cannot add dependency"); > } > lf->userrefs++; /* so we can (try to) kldunload it */ > - error = linker_file_lookup_set(lf, MDT_SETNAME, &start, > + error = linker_file_lookup_set_locked(lf, MDT_SETNAME, &start, > &stop, NULL); > if (!error) { > for (mdp = start; mdp < stop; mdp++) { > @@ -1610,7 +1628,7 @@ restart: > goto fail; > } > linker_file_register_modules(lf); > - if (linker_file_lookup_set(lf, "sysinit_set", &si_start, > + if (linker_file_lookup_set_locked(lf, "sysinit_set", &si_start, > &si_stop, NULL) == 0) > sysinit_add(si_start, si_stop); > linker_file_register_sysctls(lf); > @@ -2042,7 +2060,7 @@ linker_load_dependencies(linker_file_t l > if (error) > return (error); > } > - if (linker_file_lookup_set(lf, MDT_SETNAME, &start, &stop, > + if (linker_file_lookup_set_locked(lf, MDT_SETNAME, &start, &stop, > &count) != 0) > return (0); > for (mdp = start; mdp < stop; mdp++) { >