PERFORCE change 94304 for review
John Baldwin
jhb at FreeBSD.org
Thu Mar 30 15:49:24 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=94304
Change 94304 by jhb at jhb_slimer on 2006/03/30 15:48:58
Use sx_xlocked() to handle recursion in the wrapper functions and
make the internal functions private to kern_linker.c.
Affected files ...
.. //depot/projects/smpng/sys/kern/kern_linker.c#51 edit
.. //depot/projects/smpng/sys/kern/link_elf.c#37 edit
.. //depot/projects/smpng/sys/kern/link_elf_obj.c#12 edit
.. //depot/projects/smpng/sys/sys/linker.h#19 edit
Differences ...
==== //depot/projects/smpng/sys/kern/kern_linker.c#51 (text+ko) ====
@@ -63,6 +63,7 @@
#define KLD_LOCK() do { sx_xlock(&kld_sx); mtx_lock(&Giant); } while (0)
#define KLD_UNLOCK() do { mtx_unlock(&Giant); sx_xunlock(&kld_sx); } while (0)
+#define KLD_LOCKED() sx_xlocked(&kld_sx)
#define KLD_LOCK_ASSERT() do { if (!cold) sx_assert(&kld_sx, SX_XLOCKED); } while (0)
/*
@@ -113,6 +114,9 @@
static int linker_file_add_dependency(linker_file_t file,
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_unload_internal(linker_file_t _file, int flags);
static int linker_load_module_internal(const char *kldname,
const char *modname, struct linker_file *parent,
struct mod_depend *verinfo, struct linker_file **lfpp);
@@ -410,19 +414,23 @@
linker_file_t *result)
{
modlist_t mod;
- int error;
+ int error, locked;
- KLD_LOCK();
+ locked = KLD_LOCKED();
+ if (!locked)
+ KLD_LOCK();
if ((mod = modlist_lookup2(modname, verinfo)) != NULL) {
*result = mod->container;
(*result)->refs++;
- KLD_UNLOCK();
+ if (!locked)
+ KLD_UNLOCK();
return (0);
}
error = linker_load_module_internal(NULL, modname, NULL, verinfo,
result);
- KLD_UNLOCK();
+ if (!locked)
+ KLD_UNLOCK();
return (error);
}
@@ -488,16 +496,18 @@
int
linker_file_unload(linker_file_t file, int flags)
{
- int error;
+ int error, locked;
- KLD_LOCK();
+ locked = KLD_LOCKED();
+ if (!locked)
+ KLD_LOCK();
error = linker_file_unload_internal(file, flags);
- KLD_UNLOCK();
+ if (!locked)
+ KLD_UNLOCK();
return (error);
}
-/* Not static as it is shared with the linker backends. */
-int
+static int
linker_file_unload_internal(linker_file_t file, int flags)
{
module_t mod, next;
@@ -512,7 +522,7 @@
error = mac_check_kld_unload(curthread->td_ucred);
if (error)
return (error);
-#endif
+#endif
KLD_LOCK_ASSERT();
KLD_DPF(FILE, ("linker_file_unload: lf->refs=%d\n", file->refs));
@@ -624,9 +634,11 @@
linker_file_lookup_set(linker_file_t file, const char *name,
void *firstp, void *lastp, int *countp)
{
- int error;
+ int error, locked;
- KLD_LOCK();
+ locked = KLD_LOCKED();
+ if (!locked)
+ KLD_LOCK();
error = linker_lookup_set(file, name, firstp, lastp, countp);
KLD_UNLOCK();
return (error);
@@ -636,14 +648,18 @@
linker_file_lookup_symbol(linker_file_t file, const char *name, int deps)
{
caddr_t sym;
+ int locked;
- KLD_LOCK();
+ locked = KLD_LOCKED();
+ if (!locked)
+ KLD_LOCK();
sym = linker_file_lookup_symbol_internal(file, name, deps);
- KLD_UNLOCK();
+ if (!locked)
+ KLD_UNLOCK();
return (sym);
}
-caddr_t
+static caddr_t
linker_file_lookup_symbol_internal(linker_file_t file, const char *name,
int deps)
{
@@ -1766,12 +1782,14 @@
struct linker_file *parent, struct mod_depend *verinfo,
struct linker_file **lfpp)
{
- int error;
+ int error, locked;
- KLD_LOCK();
+ if (!locked)
+ KLD_LOCK();
error = linker_load_module_internal(kldname, modname, parent,
verinfo, lfpp);
- KLD_UNLOCK();
+ if (!locked)
+ KLD_UNLOCK();
return (error);
}
==== //depot/projects/smpng/sys/kern/link_elf.c#37 (text+ko) ====
@@ -495,7 +495,7 @@
error = parse_dynamic(ef);
if (error) {
- linker_file_unload_internal(lf, LINKER_UNLOAD_FORCE);
+ linker_file_unload(lf, LINKER_UNLOAD_FORCE);
return error;
}
link_elf_reloc_local(lf);
@@ -855,7 +855,7 @@
out:
if (error && lf)
- linker_file_unload_internal(lf, LINKER_UNLOAD_FORCE);
+ linker_file_unload(lf, LINKER_UNLOAD_FORCE);
if (shdr)
free(shdr, M_LINKER);
if (firstpage)
@@ -1301,8 +1301,7 @@
if (*symbol == 0)
return (0);
- return ((Elf_Addr)linker_file_lookup_symbol_internal(lf, symbol,
- deps));
+ return ((Elf_Addr)linker_file_lookup_symbol(lf, symbol, deps));
}
static void
==== //depot/projects/smpng/sys/kern/link_elf_obj.c#12 (text+ko) ====
@@ -349,7 +349,7 @@
out:
/* preload not done this way */
- linker_file_unload_internal(lf, LINKER_UNLOAD_FORCE);
+ linker_file_unload(lf, LINKER_UNLOAD_FORCE);
return (error);
}
@@ -784,7 +784,7 @@
out:
if (error && lf)
- linker_file_unload_internal(lf, LINKER_UNLOAD_FORCE);
+ linker_file_unload(lf, LINKER_UNLOAD_FORCE);
if (hdr)
free(hdr, M_LINKER);
VOP_UNLOCK(nd.ni_vp, 0, td);
@@ -1101,8 +1101,7 @@
/* Force a lookup failure if the symbol name is bogus. */
if (*symbol == 0)
return (0);
- ret = ((Elf_Addr)linker_file_lookup_symbol_internal(lf, symbol,
- deps));
+ ret = ((Elf_Addr)linker_file_lookup_symbol(lf, symbol, deps));
return ret;
case STB_WEAK:
==== //depot/projects/smpng/sys/sys/linker.h#19 (text+ko) ====
@@ -146,9 +146,6 @@
* Functions soley for use by the linker class handlers.
*/
int linker_add_class(linker_class_t _cls);
-caddr_t linker_file_lookup_symbol_internal(linker_file_t _file,
- const char* _name, int _deps);
-int linker_file_unload_internal(linker_file_t _file, int flags);
int linker_load_dependencies(linker_file_t _lf);
linker_file_t linker_make_file(const char* _filename, linker_class_t _cls);
More information about the p4-projects
mailing list