kernel - Attempt to make procfs MPSAFE (3)
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 16 Nov 2011 05:48:59 +0000 (21:48 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 16 Nov 2011 05:48:59 +0000 (21:48 -0800)
* More fixes to silly bugs.  Well, I did say 'attempt' :-)

sys/vfs/procfs/procfs_ctl.c
sys/vfs/procfs/procfs_mem.c
sys/vfs/procfs/procfs_subr.c
sys/vfs/procfs/procfs_vnops.c

index 75bcafe..9707795 100644 (file)
@@ -220,7 +220,7 @@ procfs_control(struct proc *curp, struct lwp *lp, int op)
                if (p->p_oppid != p->p_pptr->p_pid) {
                        struct proc *pp;
 
-                       pp = pfind(p->p_oppid);
+                       pp = pfs_pfind(p->p_oppid);
                        if (pp) {
                                proc_reparent(p, pp);
                                pfs_pdone(pp);
index 84ecdf8..79ae5a9 100644 (file)
@@ -71,7 +71,7 @@ static int    procfs_rwmem (struct proc *curp,
                                  struct proc *p, struct uio *uio);
 
 /*
- * p->p_token must be held.
+ * p->p_token is held on entry.
  */
 static int
 procfs_rwmem(struct proc *curp, struct proc *p, struct uio *uio)
@@ -112,8 +112,8 @@ procfs_rwmem(struct proc *curp, struct proc *p, struct uio *uio)
         */
        do {
                vm_offset_t uva;
-               int page_offset;                /* offset into page */
-               u_int len;
+               vm_offset_t page_offset;        /* offset into page */
+               size_t len;
                vm_page_t m;
 
                uva = (vm_offset_t) uio->uio_offset;
@@ -142,11 +142,12 @@ procfs_rwmem(struct proc *curp, struct proc *p, struct uio *uio)
 
                /*
                 * Cleanup tmap then create a temporary KVA mapping and
-                * do the I/O.
+                * do the I/O.  We can switch between cpus so don't bother
+                * synchronizing across all cores.
                 */
-               pmap_kenter(kva, VM_PAGE_TO_PHYS(m));
+               pmap_kenter_quick(kva, VM_PAGE_TO_PHYS(m));
                error = uiomove((caddr_t)(kva + page_offset), len, uio);
-               pmap_kremove(kva);
+               pmap_kremove_quick(kva);
 
                /*
                 * release the page and we are done
@@ -163,6 +164,8 @@ procfs_rwmem(struct proc *curp, struct proc *p, struct uio *uio)
  * We do this by mapping the process's page into
  * the kernel and then doing a uiomove direct
  * from the kernel address space.
+ *
+ * lp->lwp_proc->p_token is held on entry.
  */
 int
 procfs_domem(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
@@ -174,7 +177,6 @@ procfs_domem(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
        if (uio->uio_resid == 0)
                return (0);
 
-       lwkt_gettoken(&p->p_token);
        if ((p->p_flags & P_INEXEC) != 0) {
                /*
                 * Can't trace a process that's currently exec'ing.
@@ -188,7 +190,6 @@ procfs_domem(struct proc *curp, struct lwp *lp, struct pfsnode *pfs,
        } else {
                error = procfs_rwmem(curp, p, uio);
        }
-       lwkt_reltoken(&p->p_token);
        return(error);
 }
 
index 12ea6aa..f170404 100644 (file)
@@ -316,7 +316,6 @@ procfs_rw(struct vop_read_args *ap)
                return (EINVAL);
 
        lwkt_gettoken(&proc_token);
-
        p = pfs_pfind(pfs->pfs_pid);
        if (p == NULL) {
                rtval = (EINVAL);
@@ -335,8 +334,6 @@ procfs_rw(struct vop_read_args *ap)
        }
        pfs->pfs_lockowner = curproc->p_pid;
 
-       lwkt_gettoken(&p->p_token);
-
        switch (pfs->pfs_type) {
        case Pnote:
        case Pnotepg:
@@ -387,15 +384,14 @@ procfs_rw(struct vop_read_args *ap)
                rtval = EOPNOTSUPP;
                break;
        }
-       lwkt_reltoken(&p->p_token);
        LWPRELE(lp);
 
        pfs->pfs_lockowner = 0;
        wakeup(&pfs->pfs_lockowner);
 
 out:
-       lwkt_reltoken(&proc_token);
        pfs_pdone(p);
+       lwkt_reltoken(&proc_token);
 
        return rtval;
 }
index 704e9e5..944599d 100644 (file)
@@ -248,7 +248,7 @@ procfs_close(struct vop_close_args *ap)
                 */
                p = NULL;
                if ((ap->a_vp->v_opencount < 2)
-                   && (p = pfind(pfs->pfs_pid))
+                   && (p = pfs_pfind(pfs->pfs_pid))
                    && !(p->p_pfsflags & PF_LINGER)) {
                        spin_lock(&p->p_spin);
                        p->p_stops = 0;