It used to be that access to a process's vmspace (and thus its pmap where 
the ASID can be found) was only via a thread's p_vmspace member.  Now that 
the process itself has a copy of that, the loops in the sh code that 
iterated across threads to find a valid pointer can be eliminated.

ok?


Philip Guenther

Index: arch/sh/sh/pmap.c
===================================================================
RCS file: /data/src/openbsd/src/sys/arch/sh/sh/pmap.c,v
retrieving revision 1.26
diff -u -p -r1.26 pmap.c
--- arch/sh/sh/pmap.c   15 Sep 2016 02:00:17 -0000      1.26
+++ arch/sh/sh/pmap.c   13 Oct 2016 04:44:41 -0000
@@ -1067,7 +1067,6 @@ int
 __pmap_asid_alloc(void)
 {
        struct process *pr;
-       struct proc *p;
        int i, j, k, n, map, asid;
 
        /* Search free ASID */
@@ -1092,14 +1091,9 @@ __pmap_asid_alloc(void)
         * too many processes.
         */
        LIST_FOREACH(pr, &allprocess, ps_list) {
-               /* find a thread that still has the process vmspace attached */
-               TAILQ_FOREACH(p, &pr->ps_threads, p_thr_link)
-                       if (p->p_vmspace != NULL)
-                               break;
-               if (p == NULL)
-                       continue;
-               if ((asid = p->p_vmspace->vm_map.pmap->pm_asid) > 0) {
-                       pmap_t pmap = p->p_vmspace->vm_map.pmap;
+               pmap_t pmap = pr->ps_vmspace->vm_map.pmap;
+
+               if ((asid = pmap->pm_asid) > 0) {
                        pmap->pm_asid = -1;
                        __pmap_asid.hint = asid;
                        /* Invalidate all old ASID entry */
Index: arch/sh/sh/db_interface.c
===================================================================
RCS file: /data/src/openbsd/src/sys/arch/sh/sh/db_interface.c,v
retrieving revision 1.8
diff -u -p -r1.8 db_interface.c
--- arch/sh/sh/db_interface.c   18 May 2016 20:21:13 -0000      1.8
+++ arch/sh/sh/db_interface.c   13 Oct 2016 00:36:31 -0000
@@ -368,15 +368,10 @@ __db_procname_by_asid(int asid)
 {
        static char notfound[] = "---";
        struct process *pr;
-       struct proc *p;
 
        LIST_FOREACH(pr, &allprocess, ps_list) {
-               /* find a thread that still has the process vmspace attached */
-               TAILQ_FOREACH(p, &pr->ps_threads, p_thr_link)
-                       if (p->p_vmspace != NULL)
-                               break;
-               if (p != NULL && p->p_vmspace->vm_map.pmap->pm_asid == asid)
+               if (pr->ps_vmspace->vm_map.pmap->pm_asid == asid)
                        return (p->p_comm);
        }
 
        return (notfound);

Reply via email to