From e9b43d119393f0758f09e21413c17f3c4f7cf85b Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Wed, 23 Oct 2013 00:26:07 -0700 Subject: [PATCH] kernel - general cleanup and mplock removal * General cleanup and remove use of the mplock in multiple non-critical functions. * Might slightly improve performance if programs run uname(), gethostname(), or getdomainname() a lot. --- sys/emulation/43bsd/43bsd_hostinfo.c | 16 +-- sys/kern/kern_acl.c | 35 ------ sys/kern/kern_event.c | 7 +- sys/kern/kern_p1003_1b.c | 164 +++++++++++++++------------ sys/kern/kern_xxx.c | 43 +++---- sys/sys/posix4.h | 2 - 6 files changed, 114 insertions(+), 153 deletions(-) diff --git a/sys/emulation/43bsd/43bsd_hostinfo.c b/sys/emulation/43bsd/43bsd_hostinfo.c index 8e7d17ff58..92fb3f04c3 100644 --- a/sys/emulation/43bsd/43bsd_hostinfo.c +++ b/sys/emulation/43bsd/43bsd_hostinfo.c @@ -52,11 +52,6 @@ #include -#include - -/* - * MPALMOSTSAFE - */ int sys_ogethostname(struct gethostname_args *uap) { @@ -69,9 +64,7 @@ sys_ogethostname(struct gethostname_args *uap) len = MIN(uap->len, MAXHOSTNAMELEN); hostname = kmalloc(MAXHOSTNAMELEN, M_TEMP, M_WAITOK); - get_mplock(); error = kernel_sysctl(name, 2, hostname, &len, NULL, 0, NULL); - rel_mplock(); if (error == 0) error = copyout(hostname, uap->hostname, len); @@ -80,9 +73,6 @@ sys_ogethostname(struct gethostname_args *uap) return (error); } -/* - * MPALMOSTSAFE - */ int sys_osethostname(struct sethostname_args *uap) { @@ -106,9 +96,7 @@ sys_osethostname(struct sethostname_args *uap) return (error); } - get_mplock(); error = kernel_sysctl(name, 2, NULL, 0, hostname, len, NULL); - rel_mplock(); kfree(hostname, M_TEMP); return (error); @@ -214,8 +202,6 @@ sys_ogetkerninfo(struct getkerninfo_args *uap) size_t size; u_int needed = 0; - get_mplock(); - switch (uap->op & 0xff00) { case KINFO_RT: name[0] = CTL_NET; @@ -339,7 +325,7 @@ sys_ogetkerninfo(struct getkerninfo_args *uap) error = EOPNOTSUPP; break; } - rel_mplock(); + if (error) return (error); uap->sysmsg_iresult = (int)size; diff --git a/sys/kern/kern_acl.c b/sys/kern/kern_acl.c index 57fab880ab..cdb9dfc28f 100644 --- a/sys/kern/kern_acl.c +++ b/sys/kern/kern_acl.c @@ -146,8 +146,6 @@ vacl_aclcheck(struct vnode *vp, acl_type_t type, struct acl *aclp) /* * Given a file path, get an ACL for it - * - * MPALMOSTSAFE */ int sys___acl_get_file(struct __acl_get_file_args *uap) @@ -157,7 +155,6 @@ sys___acl_get_file(struct __acl_get_file_args *uap) int error; vp = NULL; - get_mplock(); error = nlookup_init(&nd, uap->path, UIO_USERSPACE, NLC_FOLLOW); if (error == 0) error = nlookup(&nd); @@ -168,15 +165,11 @@ sys___acl_get_file(struct __acl_get_file_args *uap) error = vacl_get_acl(vp, uap->type, uap->aclp); vrele(vp); } - rel_mplock(); - return (error); } /* * Given a file path, set an ACL for it - * - * MPALMOSTSAFE */ int sys___acl_set_file(struct __acl_set_file_args *uap) @@ -186,7 +179,6 @@ sys___acl_set_file(struct __acl_set_file_args *uap) int error; vp = NULL; - get_mplock(); error = nlookup_init(&nd, uap->path, UIO_USERSPACE, NLC_FOLLOW); if (error == 0) error = nlookup(&nd); @@ -197,15 +189,11 @@ sys___acl_set_file(struct __acl_set_file_args *uap) error = vacl_set_acl(vp, uap->type, uap->aclp); vrele(vp); } - rel_mplock(); - return (error); } /* * Given a file descriptor, get an ACL for it - * - * MPALMOSTSAFE */ int sys___acl_get_fd(struct __acl_get_fd_args *uap) @@ -217,9 +205,7 @@ sys___acl_get_fd(struct __acl_get_fd_args *uap) KKASSERT(td->td_proc); if ((error = holdvnode(td->td_proc->p_fd, uap->filedes, &fp)) != 0) return(error); - get_mplock(); error = vacl_get_acl((struct vnode *)fp->f_data, uap->type, uap->aclp); - rel_mplock(); fdrop(fp); return (error); @@ -227,8 +213,6 @@ sys___acl_get_fd(struct __acl_get_fd_args *uap) /* * Given a file descriptor, set an ACL for it - * - * MPALMOSTSAFE */ int sys___acl_set_fd(struct __acl_set_fd_args *uap) @@ -240,17 +224,13 @@ sys___acl_set_fd(struct __acl_set_fd_args *uap) KKASSERT(td->td_proc); if ((error = holdvnode(td->td_proc->p_fd, uap->filedes, &fp)) != 0) return(error); - get_mplock(); error = vacl_set_acl((struct vnode *)fp->f_data, uap->type, uap->aclp); - rel_mplock(); fdrop(fp); return (error); } /* * Given a file path, delete an ACL from it. - * - * MPALMOSTSAFE */ int sys___acl_delete_file(struct __acl_delete_file_args *uap) @@ -260,7 +240,6 @@ sys___acl_delete_file(struct __acl_delete_file_args *uap) int error; vp = NULL; - get_mplock(); error = nlookup_init(&nd, uap->path, UIO_USERSPACE, NLC_FOLLOW); if (error == 0) error = nlookup(&nd); @@ -272,15 +251,11 @@ sys___acl_delete_file(struct __acl_delete_file_args *uap) error = vacl_delete(vp, uap->type); vrele(vp); } - rel_mplock(); - return (error); } /* * Given a file path, delete an ACL from it. - * - * MPALMOSTSAFE */ int sys___acl_delete_fd(struct __acl_delete_fd_args *uap) @@ -292,17 +267,13 @@ sys___acl_delete_fd(struct __acl_delete_fd_args *uap) KKASSERT(td->td_proc); if ((error = holdvnode(td->td_proc->p_fd, uap->filedes, &fp)) != 0) return(error); - get_mplock(); error = vacl_delete((struct vnode *)fp->f_data, uap->type); - rel_mplock(); fdrop(fp); return (error); } /* * Given a file path, check an ACL for it - * - * MPALMOSTSAFE */ int sys___acl_aclcheck_file(struct __acl_aclcheck_file_args *uap) @@ -312,7 +283,6 @@ sys___acl_aclcheck_file(struct __acl_aclcheck_file_args *uap) int error; vp = NULL; - get_mplock(); error = nlookup_init(&nd, uap->path, UIO_USERSPACE, NLC_FOLLOW); if (error == 0) error = nlookup(&nd); @@ -324,14 +294,11 @@ sys___acl_aclcheck_file(struct __acl_aclcheck_file_args *uap) error = vacl_aclcheck(vp, uap->type, uap->aclp); vrele(vp); } - rel_mplock(); return (error); } /* * Given a file descriptor, check an ACL for it - * - * MPALMOSTSAFE */ int sys___acl_aclcheck_fd(struct __acl_aclcheck_fd_args *uap) @@ -343,9 +310,7 @@ sys___acl_aclcheck_fd(struct __acl_aclcheck_fd_args *uap) KKASSERT(td->td_proc); if ((error = holdvnode(td->td_proc->p_fd, uap->filedes, &fp)) != 0) return(error); - get_mplock(); error = vacl_aclcheck((struct vnode *)fp->f_data, uap->type, uap->aclp); - rel_mplock(); fdrop(fp); return (error); } diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index 6ebc5780e0..9fea201e16 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -1271,14 +1271,13 @@ filter_attach(struct knote *kn) { int ret; - if (!(kn->kn_fop->f_flags & FILTEROP_MPSAFE)) { - get_mplock(); + if (kn->kn_fop->f_flags & FILTEROP_MPSAFE) { ret = kn->kn_fop->f_attach(kn); - rel_mplock(); } else { + get_mplock(); ret = kn->kn_fop->f_attach(kn); + rel_mplock(); } - return (ret); } diff --git a/sys/kern/kern_p1003_1b.c b/sys/kern/kern_p1003_1b.c index 7d99640400..32e9d3490e 100644 --- a/sys/kern/kern_p1003_1b.c +++ b/sys/kern/kern_p1003_1b.c @@ -47,11 +47,10 @@ #include #include -#include - MALLOC_DEFINE(M_P31B, "p1003.1b", "Posix 1003.1B"); -/* p31b_proc: Return a proc struct corresponding to a pid to operate on. +/* + * p31b_proc: Return a proc struct corresponding to a pid to operate on. * * Enforce permission policy. * @@ -83,11 +82,16 @@ MALLOC_DEFINE(M_P31B, "p1003.1b", "Posix 1003.1B"); /* * p31b_proc: Look up a proc from a PID. If proc is 0 it is * my own proc. + * + * Returns a held process in *pp. */ -int p31b_proc(struct proc *p, pid_t pid, struct proc **pp) +static +int +p31b_proc(pid_t pid, struct proc **pp) { int ret = 0; - struct proc *other_proc = NULL; + struct proc *p = curproc; + struct proc *other_proc; if (pid == 0) { other_proc = p; @@ -101,18 +105,31 @@ int p31b_proc(struct proc *p, pid_t pid, struct proc **pp) if (other_proc) { /* Enforce permission policy. */ - if (CAN_AFFECT(p, p->p_ucred, other_proc)) + if (CAN_AFFECT(p, p->p_ucred, other_proc)) { *pp = other_proc; - else + lwkt_gettoken(&other_proc->p_token); + } else { + *pp = NULL; ret = EPERM; - PRELE(other_proc); + PRELE(other_proc); + } } else { + *pp = NULL; ret = ESRCH; } - return ret; } +static +void +p31b_proc_done(struct proc *other_proc) +{ + if (other_proc) { + lwkt_reltoken(&other_proc->p_token); + PRELE(other_proc); + } +} + #if !defined(_KPOSIX_PRIORITY_SCHEDULING) @@ -173,107 +190,108 @@ static int sched_attach(void) return ret; } -/* - * MPALMOSTSAFE - */ int sys_sched_setparam(struct sched_setparam_args *uap) { - struct proc *p = curproc; + struct proc *p; struct lwp *lp; - int e; struct sched_param sched_param; + int e; copyin(uap->param, &sched_param, sizeof(sched_param)); - get_mplock(); - if ((e = p31b_proc(p, uap->pid, &p)) == 0) { + if ((e = p31b_proc(uap->pid, &p)) == 0) { lp = FIRST_LWP_IN_PROC(p); /* XXX lwp */ - e = ksched_setparam(&uap->sysmsg_reg, ksched, lp, + if (lp) { + LWPHOLD(lp); + lwkt_gettoken(&lp->lwp_token); + e = ksched_setparam(&uap->sysmsg_reg, ksched, lp, (const struct sched_param *)&sched_param); + lwkt_reltoken(&lp->lwp_token); + LWPRELE(lp); + } else { + e = ESRCH; + } + p31b_proc_done(p); } - rel_mplock(); return e; } -/* - * MPALMOSTSAFE - */ int sys_sched_getparam(struct sched_getparam_args *uap) { - struct proc *p = curproc; struct proc *targetp; struct lwp *lp; struct sched_param sched_param; int e; - get_mplock(); - if (uap->pid != 0 && uap->pid != p->p_pid) { - e = p31b_proc(p, uap->pid, &targetp); - if (e) - goto done; - } else { - targetp = p; + if ((e = p31b_proc(uap->pid, &targetp)) == 0) { + lp = FIRST_LWP_IN_PROC(targetp); /* XXX lwp */ + if (lp) { + LWPHOLD(lp); + lwkt_gettoken(&lp->lwp_token); + e = ksched_getparam(&uap->sysmsg_reg, ksched, + lp, &sched_param); + lwkt_reltoken(&lp->lwp_token); + LWPRELE(lp); + } else { + e = ESRCH; + } + p31b_proc_done(targetp); } - - lp = FIRST_LWP_IN_PROC(targetp); /* XXX lwp */ - e = ksched_getparam(&uap->sysmsg_reg, ksched, lp, &sched_param); -done: - rel_mplock(); if (e == 0) copyout(&sched_param, uap->param, sizeof(sched_param)); return e; } -/* - * MPALMOSTSAFE - */ int sys_sched_setscheduler(struct sched_setscheduler_args *uap) { - struct proc *p = curproc; + struct proc *p; struct lwp *lp; int e; struct sched_param sched_param; copyin(uap->param, &sched_param, sizeof(sched_param)); - get_mplock(); - if ((e = p31b_proc(p, uap->pid, &p)) == 0) { + if ((e = p31b_proc(uap->pid, &p)) == 0) { lp = FIRST_LWP_IN_PROC(p); /* XXX lwp */ - e = ksched_setscheduler(&uap->sysmsg_reg, ksched, lp, - uap->policy, + if (lp) { + LWPHOLD(lp); + lwkt_gettoken(&lp->lwp_token); + e = ksched_setscheduler(&uap->sysmsg_reg, ksched, + lp, uap->policy, (const struct sched_param *)&sched_param); + lwkt_reltoken(&lp->lwp_token); + LWPRELE(lp); + } else { + e = ESRCH; + } + p31b_proc_done(p); } - rel_mplock(); return e; } -/* - * MPALMOSTSAFE - */ int sys_sched_getscheduler(struct sched_getscheduler_args *uap) { - struct proc *p = curproc; struct proc *targetp; struct lwp *lp; int e; - get_mplock(); - if (uap->pid != 0 && uap->pid != p->p_pid) { - e = p31b_proc(p, uap->pid, &targetp); - if (e) - goto done; - } else { - targetp = p; + if ((e = p31b_proc(uap->pid, &targetp)) == 0) { + lp = FIRST_LWP_IN_PROC(targetp); /* XXX lwp */ + if (lp) { + LWPHOLD(lp); + lwkt_gettoken(&lp->lwp_token); + e = ksched_getscheduler(&uap->sysmsg_reg, ksched, lp); + lwkt_reltoken(&lp->lwp_token); + LWPRELE(lp); + } else { + e = ESRCH; + } + p31b_proc_done(targetp); } - - lp = FIRST_LWP_IN_PROC(targetp); /* XXX lwp */ - e = ksched_getscheduler(&uap->sysmsg_reg, ksched, lp); -done: - rel_mplock(); return e; } @@ -304,24 +322,30 @@ sys_sched_get_priority_min(struct sched_get_priority_min_args *uap) return ksched_get_priority_min(&uap->sysmsg_reg, ksched, uap->policy); } -/* - * MPALMOSTSAFE - */ int sys_sched_rr_get_interval(struct sched_rr_get_interval_args *uap) { int e; - struct proc *p = curproc; - struct lwp *lp = curthread->td_lwp; + struct proc *p; + struct lwp *lp; struct timespec ts; - get_mplock(); - if ((e = p31b_proc(p, uap->pid, &p)) == 0) { - e = ksched_rr_get_interval(&uap->sysmsg_reg, ksched, lp, &ts); - if (e == 0) - e = copyout(&ts, uap->interval, sizeof(ts)); + if ((e = p31b_proc(uap->pid, &p)) == 0) { + lp = FIRST_LWP_IN_PROC(p); /* XXX lwp */ + if (lp) { + LWPHOLD(lp); + lwkt_gettoken(&lp->lwp_token); + e = ksched_rr_get_interval(&uap->sysmsg_reg, ksched, + lp, &ts); + if (e == 0) + e = copyout(&ts, uap->interval, sizeof(ts)); + lwkt_reltoken(&lp->lwp_token); + LWPRELE(lp); + } else { + e = ESRCH; + } + p31b_proc_done(p); } - rel_mplock(); return e; } diff --git a/sys/kern/kern_xxx.c b/sys/kern/kern_xxx.c index 606140b336..ffc4d186f4 100644 --- a/sys/kern/kern_xxx.c +++ b/sys/kern/kern_xxx.c @@ -40,11 +40,8 @@ #include #include -#include +struct lwkt_token domain_token = LWKT_TOKEN_INITIALIZER(domain_token); -/* - * MPALMOSTSAFE - */ int sys_uname(struct uname_args *uap) { @@ -52,41 +49,39 @@ sys_uname(struct uname_args *uap) size_t len; char *s, *us; - get_mplock(); - name[0] = CTL_KERN; name[1] = KERN_OSTYPE; len = sizeof uap->name->sysname; rtval = userland_sysctl(name, 2, uap->name->sysname, &len, - 1, 0, 0, 0); + 1, 0, 0, 0); if (rtval) goto done; - subyte( uap->name->sysname + sizeof(uap->name->sysname) - 1, 0); + subyte(uap->name->sysname + sizeof(uap->name->sysname) - 1, 0); name[1] = KERN_HOSTNAME; len = sizeof uap->name->nodename; rtval = userland_sysctl(name, 2, uap->name->nodename, &len, - 1, 0, 0, 0); + 1, 0, 0, 0); if (rtval) goto done; - subyte( uap->name->nodename + sizeof(uap->name->nodename) - 1, 0); + subyte(uap->name->nodename + sizeof(uap->name->nodename) - 1, 0); name[1] = KERN_OSRELEASE; len = sizeof uap->name->release; rtval = userland_sysctl(name, 2, uap->name->release, &len, - 1, 0, 0, 0); + 1, 0, 0, 0); if (rtval) goto done; - subyte( uap->name->release + sizeof(uap->name->release) - 1, 0); + subyte(uap->name->release + sizeof(uap->name->release) - 1, 0); /* name = KERN_VERSION; len = sizeof uap->name->version; rtval = userland_sysctl(name, 2, uap->name->version, &len, - 1, 0, 0, 0); + 1, 0, 0, 0); if (rtval) goto done; - subyte( uap->name->version + sizeof(uap->name->version) - 1, 0); + subyte(uap->name->version + sizeof(uap->name->version) - 1, 0); */ /* @@ -107,36 +102,29 @@ sys_uname(struct uname_args *uap) name[1] = HW_MACHINE; len = sizeof uap->name->machine; rtval = userland_sysctl(name, 2, uap->name->machine, &len, - 1, 0, 0, 0); + 1, 0, 0, 0); if (rtval) goto done; rtval = subyte(uap->name->machine + sizeof(uap->name->machine) - 1, 0); done: - rel_mplock(); return rtval; } -/* - * MPALMOSTSAFE - */ int sys_getdomainname(struct getdomainname_args *uap) { int domainnamelen; int error; - get_mplock(); + lwkt_gettoken_shared(&domain_token); domainnamelen = strlen(domainname) + 1; if ((u_int)uap->len > domainnamelen + 1) uap->len = domainnamelen + 1; error = copyout(domainname, uap->domainname, uap->len); - rel_mplock(); + lwkt_reltoken(&domain_token); return (error); } -/* - * MPALMOSTSAFE - */ int sys_setdomainname(struct setdomainname_args *uap) { @@ -147,11 +135,12 @@ sys_setdomainname(struct setdomainname_args *uap) return (error); if ((u_int)uap->len > sizeof(domainname) - 1) return EINVAL; - get_mplock(); + lwkt_gettoken(&domain_token); + domainnamelen = uap->len; error = copyin(uap->domainname, domainname, uap->len); domainname[domainnamelen] = 0; - rel_mplock(); + + lwkt_reltoken(&domain_token); return (error); } - diff --git a/sys/sys/posix4.h b/sys/sys/posix4.h index 8ff798409e..a165d5a5bc 100644 --- a/sys/sys/posix4.h +++ b/sys/sys/posix4.h @@ -49,8 +49,6 @@ MALLOC_DECLARE(M_P31B); struct proc; struct lwp; -int p31b_proc (struct proc *, pid_t, struct proc **); - void p31b_setcfg (int, int); #ifdef _KPOSIX_PRIORITY_SCHEDULING -- 2.41.0