Module Name: src Committed By: maxv Date: Sat Dec 12 14:47:37 UTC 2015
Modified Files: src/sys/kern: sys_module.c Log Message: Put the code in charge of handling MODCTL_STAT into a separate function. No functional change. To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 src/sys/kern/sys_module.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/kern/sys_module.c diff -u src/sys/kern/sys_module.c:1.20 src/sys/kern/sys_module.c:1.21 --- src/sys/kern/sys_module.c:1.20 Wed Nov 4 04:28:58 2015 +++ src/sys/kern/sys_module.c Sat Dec 12 14:47:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: sys_module.c,v 1.20 2015/11/04 04:28:58 pgoyette Exp $ */ +/* $NetBSD: sys_module.c,v 1.21 2015/12/12 14:47:37 maxv Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sys_module.c,v 1.20 2015/11/04 04:28:58 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sys_module.c,v 1.21 2015/12/12 14:47:37 maxv Exp $"); #ifdef _KERNEL_OPT #include "opt_modular.h" @@ -115,6 +115,73 @@ out1: return error; } +static int +handle_modctl_stat(struct iovec *iov, void *arg) +{ + modstat_t *ms, *mso; + modinfo_t *mi; + module_t *mod; + vaddr_t addr; + size_t size; + size_t mslen; + int error; + + kernconfig_lock(); + mslen = (module_count+module_builtinlist+1) * sizeof(modstat_t); + mso = kmem_zalloc(mslen, KM_SLEEP); + if (mso == NULL) { + kernconfig_unlock(); + return ENOMEM; + } + ms = mso; + TAILQ_FOREACH(mod, &module_list, mod_chain) { + mi = mod->mod_info; + strlcpy(ms->ms_name, mi->mi_name, sizeof(ms->ms_name)); + if (mi->mi_required != NULL) { + strlcpy(ms->ms_required, mi->mi_required, + sizeof(ms->ms_required)); + } + if (mod->mod_kobj != NULL) { + kobj_stat(mod->mod_kobj, &addr, &size); + ms->ms_addr = addr; + ms->ms_size = size; + } + ms->ms_class = mi->mi_class; + ms->ms_refcnt = mod->mod_refcnt; + ms->ms_source = mod->mod_source; + ms->ms_flags = mod->mod_flags; + ms++; + } + TAILQ_FOREACH(mod, &module_builtins, mod_chain) { + mi = mod->mod_info; + strlcpy(ms->ms_name, mi->mi_name, sizeof(ms->ms_name)); + if (mi->mi_required != NULL) { + strlcpy(ms->ms_required, mi->mi_required, + sizeof(ms->ms_required)); + } + if (mod->mod_kobj != NULL) { + kobj_stat(mod->mod_kobj, &addr, &size); + ms->ms_addr = addr; + ms->ms_size = size; + } + ms->ms_class = mi->mi_class; + ms->ms_refcnt = -1; + KASSERT(mod->mod_source == MODULE_SOURCE_KERNEL); + ms->ms_source = mod->mod_source; + ms++; + } + kernconfig_unlock(); + error = copyout(mso, iov->iov_base, + min(mslen - sizeof(modstat_t), iov->iov_len)); + kmem_free(mso, mslen); + if (error == 0) { + iov->iov_len = mslen - sizeof(modstat_t); + error = copyout(iov, arg, sizeof(*iov)); + } + + return error; +} + int sys_modctl(struct lwp *l, const struct sys_modctl_args *uap, register_t *retval) @@ -124,12 +191,6 @@ sys_modctl(struct lwp *l, const struct s syscallarg(void *) arg; } */ char buf[MAXMODNAME]; - size_t mslen; - module_t *mod; - modinfo_t *mi; - modstat_t *ms, *mso; - vaddr_t addr; - size_t size; struct iovec iov; modctl_load_t ml; int error; @@ -161,58 +222,7 @@ sys_modctl(struct lwp *l, const struct s if (error != 0) { break; } - kernconfig_lock(); - mslen = (module_count+module_builtinlist+1) * sizeof(modstat_t); - mso = kmem_zalloc(mslen, KM_SLEEP); - if (mso == NULL) { - kernconfig_unlock(); - return ENOMEM; - } - ms = mso; - TAILQ_FOREACH(mod, &module_list, mod_chain) { - mi = mod->mod_info; - strlcpy(ms->ms_name, mi->mi_name, sizeof(ms->ms_name)); - if (mi->mi_required != NULL) { - strlcpy(ms->ms_required, mi->mi_required, - sizeof(ms->ms_required)); - } - if (mod->mod_kobj != NULL) { - kobj_stat(mod->mod_kobj, &addr, &size); - ms->ms_addr = addr; - ms->ms_size = size; - } - ms->ms_class = mi->mi_class; - ms->ms_refcnt = mod->mod_refcnt; - ms->ms_source = mod->mod_source; - ms->ms_flags = mod->mod_flags; - ms++; - } - TAILQ_FOREACH(mod, &module_builtins, mod_chain) { - mi = mod->mod_info; - strlcpy(ms->ms_name, mi->mi_name, sizeof(ms->ms_name)); - if (mi->mi_required != NULL) { - strlcpy(ms->ms_required, mi->mi_required, - sizeof(ms->ms_required)); - } - if (mod->mod_kobj != NULL) { - kobj_stat(mod->mod_kobj, &addr, &size); - ms->ms_addr = addr; - ms->ms_size = size; - } - ms->ms_class = mi->mi_class; - ms->ms_refcnt = -1; - KASSERT(mod->mod_source == MODULE_SOURCE_KERNEL); - ms->ms_source = mod->mod_source; - ms++; - } - kernconfig_unlock(); - error = copyout(mso, iov.iov_base, - min(mslen - sizeof(modstat_t), iov.iov_len)); - kmem_free(mso, mslen); - if (error == 0) { - iov.iov_len = mslen - sizeof(modstat_t); - error = copyout(&iov, arg, sizeof(iov)); - } + error = handle_modctl_stat(&iov, arg); break; case MODCTL_EXISTS: