Author: alc
Date: Mon May 11 19:55:01 2015
New Revision: 282780
URL: https://svnweb.freebsd.org/changeset/base/282780

Log:
  Retire pmap_lazyfix().  This function only existed in the new armv6 pmap
  because the i386 pmap on which the new armv6 pmap is based had it, and in
  r281707 pmap_lazyfix() was removed from the i386 pmap.
  
  Discussed with:       kib
  Submitted by: Michal Meloun (via Svatopluk Kraus)

Modified:
  head/sys/arm/arm/mp_machdep.c
  head/sys/arm/arm/pmap-v6-new.c
  head/sys/arm/arm/swtch.S
  head/sys/arm/include/pmap-v6.h
  head/sys/arm/include/smp.h

Modified: head/sys/arm/arm/mp_machdep.c
==============================================================================
--- head/sys/arm/arm/mp_machdep.c       Mon May 11 19:20:30 2015        
(r282779)
+++ head/sys/arm/arm/mp_machdep.c       Mon May 11 19:55:01 2015        
(r282780)
@@ -309,12 +309,6 @@ ipi_handler(void *arg)
                        CTR1(KTR_SMP, "%s: IPI_TLB", __func__);
                        cpufuncs.cf_tlb_flushID();
                        break;
-#ifdef ARM_NEW_PMAP
-               case IPI_LAZYPMAP:
-                       CTR1(KTR_SMP, "%s: IPI_LAZYPMAP", __func__);
-                       pmap_lazyfix_action();
-                       break;
-#endif
                default:
                        panic("Unknown IPI 0x%0x on cpu %d", ipi, curcpu);
                }

Modified: head/sys/arm/arm/pmap-v6-new.c
==============================================================================
--- head/sys/arm/arm/pmap-v6-new.c      Mon May 11 19:20:30 2015        
(r282779)
+++ head/sys/arm/arm/pmap-v6-new.c      Mon May 11 19:55:01 2015        
(r282780)
@@ -2166,104 +2166,6 @@ pmap_pinit(pmap_t pmap)
        return (1);
 }
 
-#ifdef SMP
-/*
- *  Deal with a SMP shootdown of other users of the pmap that we are
- *  trying to dispose of.  This can be a bit hairy.
- */
-static cpuset_t *lazymask;
-static ttb_entry_t lazyttb;
-static volatile u_int lazywait;
-
-void
-pmap_lazyfix_action(void)
-{
-
-#ifdef COUNT_IPIS
-       (*ipi_lazypmap_counts[PCPU_GET(cpuid)])++;
-#endif
-       spinlock_enter();
-       if (cp15_ttbr_get() == lazyttb) {
-               cp15_ttbr_set(curthread->td_pcb->pcb_pagedir);
-       }
-       CPU_CLR_ATOMIC(PCPU_GET(cpuid), lazymask);
-       atomic_store_rel_int(&lazywait, 1);
-       spinlock_exit();
-
-}
-
-static void
-pmap_lazyfix_self(u_int cpuid)
-{
-
-       spinlock_enter();
-       if (cp15_ttbr_get() == lazyttb) {
-               cp15_ttbr_set(curthread->td_pcb->pcb_pagedir);
-       }
-       CPU_CLR_ATOMIC(cpuid, lazymask);
-       spinlock_exit();
-}
-
-static void
-pmap_lazyfix(pmap_t pmap)
-{
-       cpuset_t mymask, mask;
-       u_int cpuid, spins;
-       int lsb;
-
-       mask = pmap->pm_active;
-       while (!CPU_EMPTY(&mask)) {
-               spins = 50000000;
-
-               /* Find least significant set bit. */
-               lsb = CPU_FFS(&mask);
-               MPASS(lsb != 0);
-               lsb--;
-               CPU_SETOF(lsb, &mask);
-               mtx_lock_spin(&smp_ipi_mtx);
-
-               lazyttb = pmap_ttb_get(pmap);
-               cpuid = PCPU_GET(cpuid);
-
-               /* Use a cpuset just for having an easy check. */
-               CPU_SETOF(cpuid, &mymask);
-               if (!CPU_CMP(&mask, &mymask)) {
-                       lazymask = &pmap->pm_active;
-                       pmap_lazyfix_self(cpuid);
-               } else {
-                       atomic_store_rel_int((u_int *)&lazymask,
-                           (u_int)&pmap->pm_active);
-                       atomic_store_rel_int(&lazywait, 0);
-                       ipi_selected(mask, IPI_LAZYPMAP);
-                       while (lazywait == 0) {
-                               if (--spins == 0)
-                                       break;
-                       }
-               }
-               mtx_unlock_spin(&smp_ipi_mtx);
-               if (spins == 0)
-                       printf("%s: spun for 50000000\n", __func__);
-               mask = pmap->pm_active;
-       }
-}
-#else  /* SMP */
-/*
- *  Cleaning up on uniprocessor is easy.  For various reasons, we're
- *  unlikely to have to even execute this code, including the fact
- *  that the cleanup is deferred until the parent does a wait(2), which
- *  means that another userland process has run.
- */
-static void
-pmap_lazyfix(pmap_t pmap)
-{
-
-       if (!CPU_EMPTY(&pmap->pm_active)) {
-               cp15_ttbr_set(curthread->td_pcb->pcb_pagedir);
-               CPU_ZERO(&pmap->pm_active);
-       }
-}
-#endif /* SMP */
-
 #ifdef INVARIANTS
 static boolean_t
 pt2tab_user_is_empty(pt2_entry_t *tab)
@@ -2292,8 +2194,9 @@ pmap_release(pmap_t pmap)
            pmap->pm_stats.resident_count));
        KASSERT(pt2tab_user_is_empty(pmap->pm_pt2tab),
            ("%s: has allocated user PT2(s)", __func__));
+       KASSERT(CPU_EMPTY(&pmap->pm_active), 
+           ("%s: pmap %p is active on some CPU(s)", __func__, pmap));
 
-       pmap_lazyfix(pmap);
        mtx_lock_spin(&allpmaps_lock);
        LIST_REMOVE(pmap, pm_list);
        mtx_unlock_spin(&allpmaps_lock);

Modified: head/sys/arm/arm/swtch.S
==============================================================================
--- head/sys/arm/arm/swtch.S    Mon May 11 19:20:30 2015        (r282779)
+++ head/sys/arm/arm/swtch.S    Mon May 11 19:55:01 2015        (r282780)
@@ -624,14 +624,6 @@ ENTRY(cpu_switch)
        cmp     r0, r1                  /* Switching to the TTB? */
        beq     sw0                     /* same TTB, skip */
 
-#if 1 /* Lazy context switch */
-       /* Don't switch mapping for kernel threads */
-       ldr     r1, =pmap_kern_ttb
-       ldr     r1, [r1]                /* r1 = kernel TTB */
-       cmp     r0, r1                  /* Switching to kernel TTB? */
-       beq     sw0                     /* kernel TTB, skip */
-#endif
-
 #ifdef INVARIANTS
        cmp     r0, #0                  /* new thread? */
        beq     badsw4                  /* no, panic */

Modified: head/sys/arm/include/pmap-v6.h
==============================================================================
--- head/sys/arm/include/pmap-v6.h      Mon May 11 19:20:30 2015        
(r282779)
+++ head/sys/arm/include/pmap-v6.h      Mon May 11 19:55:01 2015        
(r282780)
@@ -193,7 +193,6 @@ void pmap_unmapdev(vm_offset_t, vm_size_
 void pmap_kenter_device(vm_offset_t, vm_size_t, vm_paddr_t);
 void pmap_kremove_device(vm_offset_t, vm_size_t);
 void pmap_set_pcb_pagedir(pmap_t , struct pcb *);
-void pmap_lazyfix_action(void);
 
 void pmap_tlb_flush(pmap_t , vm_offset_t );
 void pmap_tlb_flush_range(pmap_t , vm_offset_t , vm_size_t );

Modified: head/sys/arm/include/smp.h
==============================================================================
--- head/sys/arm/include/smp.h  Mon May 11 19:20:30 2015        (r282779)
+++ head/sys/arm/include/smp.h  Mon May 11 19:55:01 2015        (r282780)
@@ -14,7 +14,6 @@
 #define IPI_HARDCLOCK  6
 #define IPI_TLB                7
 #define IPI_CACHE      8
-#define IPI_LAZYPMAP   9
 
 void   init_secondary(int cpu);
 void   mpentry(void);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to