Date: Mon, 3 Jul 2006 12:23:18 GMT From: John Birrell <jb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 100491 for review Message-ID: <200607031223.k63CNI5c078305@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=100491 Change 100491 by jb@jb_freebsd2 on 2006/07/03 12:22:33 Update to use jhb's changes in current. Re-implement version 2 of kldstat to return the path to the module. Affected files ... .. //depot/projects/dtrace/src/sys/kern/kern_linker.c#12 edit Differences ... ==== //depot/projects/dtrace/src/sys/kern/kern_linker.c#12 (text+ko) ==== @@ -40,7 +40,6 @@ #include <sys/proc.h> #include <sys/lock.h> #include <sys/mutex.h> -#include <sys/sdt.h> #include <sys/sx.h> #include <sys/mac.h> #include <sys/module.h> @@ -93,12 +92,6 @@ static struct sx kld_sx; /* kernel linker lock */ -/* - * Load counter used by clients to determine if a linker file has been - * re-loaded. This counter is incremented for each file load. - */ -static int loadcnt; - static linker_class_list_t classes; static linker_file_list_t linker_files; static int next_file_id = 1; @@ -542,10 +535,8 @@ LINKER_GET_NEXT_FILE_ID(lf->id); lf->ndeps = 0; lf->deps = NULL; - lf->loadcnt = ++loadcnt; STAILQ_INIT(&lf->common); TAILQ_INIT(&lf->modules); - mtx_lock(&kld_mtx); TAILQ_INSERT_TAIL(&linker_files, lf, link); return (lf); } @@ -686,27 +677,6 @@ } /* - * List linker files. - */ -int -linker_file_listall(int (*callback_func)(linker_file_t,void *),void *arg) -{ - linker_file_t lf; - int error = 0; - - sx_xlock(&kld_sx); - - TAILQ_FOREACH(lf, &linker_files, link) { - if ((error = callback_func(lf, arg)) != 0) - break; - } - - sx_xunlock(&kld_sx); - - return (error); -} - -/* * List all functions in a file. */ int @@ -722,10 +692,13 @@ linker_file_t lf; c_linker_sym_t sym; linker_symval_t symval; + int locked; symval.value = 0; - sx_xlock(&kld_sx); + locked = KLD_LOCKED(); + if (!locked) + KLD_LOCK(); TAILQ_FOREACH(lf, &linker_files, link) { if (LINKER_LOOKUP_SYMBOL(lf, name, &sym) == 0 && @@ -733,11 +706,13 @@ break; } - sx_xunlock(&kld_sx); + if (!locked) + KLD_UNLOCK(); return (symval.value); } + caddr_t linker_file_lookup_symbol(linker_file_t file, const char *name, int deps) { @@ -994,10 +969,7 @@ printf("kldunload: attempt to unload file that has" " DTrace probes enabled\n"); error = EBUSY; - goto out; - } - - if (lf->userrefs == 0) { + } else if (lf->userrefs == 0) { /* * XXX: maybe LINKER_UNLOAD_FORCE should override ? */ @@ -1129,15 +1101,18 @@ { struct kld_file_stat stat; linker_file_t lf; - int error, namelen; + int error, namelen, version, version_num; /* * Check the version of the user's structure. */ - error = copyin(uap->stat, &stat, sizeof(struct kld_file_stat)); - if (error) + if ((error = copyin(&uap->stat->version, &version, sizeof(version))) != 0) return (error); - if (stat.version != sizeof(struct kld_file_stat)) + if (version == sizeof(struct kld_file_stat_1)) + version_num = 1; + else if (version == sizeof(struct kld_file_stat)) + version_num = 2; + else return (EINVAL); #ifdef MAC @@ -1162,21 +1137,18 @@ stat.id = lf->id; stat.address = lf->address; stat.size = lf->size; + if (version_num > 1) { + /* Version 2 fields: */ + namelen = strlen(lf->pathname) + 1; + if (namelen > MAXPATHLEN) + namelen = MAXPATHLEN; + bcopy(lf->pathname, &stat.pathname[0], namelen); + } KLD_UNLOCK(); - if (version_num < 2) - goto done; - /* Version 2 fields: */ - namelen = strlen(lf->pathname) + 1; - if (namelen > MAXPATHLEN) - namelen = MAXPATHLEN; - if ((error = copyout(lf->pathname, &stat->pathname[0], namelen)) != 0) - goto out; - -done: td->td_retval[0] = 0; - return (copyout(&stat, uap->stat, sizeof(struct kld_file_stat))); + return (copyout(&stat, uap->stat, version)); } /* @@ -1964,9 +1936,6 @@ *lfpp = lfdep; } while (0); free(pathname, M_LINKER); - - SDT_PROBE(kernel, linker_load_module, return, kldname, modname, parent, error, lfpp); - return (error); } @@ -2089,7 +2058,6 @@ return (error); } } - mtx_unlock(&kld_mtx); KLD_UNLOCK(); return (SYSCTL_OUT(req, "", 1)); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200607031223.k63CNI5c078305>