kernel - general cleanup and mplock removal
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 23 Oct 2013 07:26:07 +0000 (00:26 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 23 Oct 2013 07:30:06 +0000 (00:30 -0700)
* 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
sys/kern/kern_acl.c
sys/kern/kern_event.c
sys/kern/kern_p1003_1b.c
sys/kern/kern_xxx.c
sys/sys/posix4.h

index 8e7d17f..92fb3f0 100644 (file)
 
 #include <vm/vm_param.h>
 
-#include <sys/mplock2.h>
-
-/*
- * 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;
index 57fab88..cdb9dfc 100644 (file)
@@ -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);
 }
index 6ebc578..9fea201 100644 (file)
@@ -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);
 }
 
index 7d99640..32e9d34 100644 (file)
 #include <sys/sysctl.h>
 #include <sys/unistd.h>
 
-#include <sys/mplock2.h>
-
 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;
 }
 
index 606140b..ffc4d18 100644 (file)
 #include <sys/sysctl.h>
 #include <sys/utsname.h>
 
-#include <sys/mplock2.h>
+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);
 }
-
index 8ff7984..a165d5a 100644 (file)
@@ -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