Date: Sun, 19 May 2002 18:13:34 -0700 (PDT) From: Jake Burkholder <jake@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 11572 for review Message-ID: <200205200113.g4K1DY160929@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://people.freebsd.org/~peter/p4db/chv.cgi?CH=11572 Change 11572 by jake@jake_sparc64 on 2002/05/19 18:13:24 De-inline the tlb functions. These were so big that gcc3.1 refused to inline them anyway. Affected files ... ... //depot/projects/sparc64/sys/conf/files.sparc64#35 edit ... //depot/projects/sparc64/sys/sparc64/include/tlb.h#35 edit ... //depot/projects/sparc64/sys/sparc64/sparc64/tlb.c#1 add Differences ... ==== //depot/projects/sparc64/sys/conf/files.sparc64#35 (text+ko) ==== @@ -79,6 +79,7 @@ sparc64/sparc64/sys_machdep.c standard sparc64/sparc64/swtch.s standard sparc64/sparc64/tick.c standard +sparc64/sparc64/tlb.c standard sparc64/sparc64/trap.c standard sparc64/sparc64/tsb.c standard sparc64/sparc64/vm_machdep.c standard ==== //depot/projects/sparc64/sys/sparc64/include/tlb.h#35 (text+ko) ==== @@ -83,106 +83,9 @@ extern int kernel_tlb_slots; extern struct tte *kernel_ttes; -/* - * Some tlb operations must be atomic, so no interrupt or trap can be allowed - * while they are in progress. Traps should not happen, but interrupts need to - * be explicitely disabled. critical_enter() cannot be used here, since it only - * disables soft interrupts. - */ - -static __inline void -tlb_context_demap(struct pmap *pm) -{ - void *cookie; - u_long s; - - /* - * It is important that we are not interrupted or preempted while - * doing the IPIs. The interrupted CPU may hold locks, and since - * it will wait for the CPU that sent the IPI, this can lead - * to a deadlock when an interrupt comes in on that CPU and it's - * handler tries to grab one of that locks. This will only happen for - * spin locks, but these IPI types are delivered even if normal - * interrupts are disabled, so the lock critical section will not - * protect the target processor from entering the IPI handler with - * the lock held. - */ - critical_enter(); - cookie = ipi_tlb_context_demap(pm); - if (pm->pm_active & PCPU_GET(cpumask)) { - KASSERT(pm->pm_context[PCPU_GET(cpuid)] != -1, - ("tlb_context_demap: inactive pmap?")); - s = intr_disable(); - stxa(TLB_DEMAP_PRIMARY | TLB_DEMAP_CONTEXT, ASI_DMMU_DEMAP, 0); - stxa(TLB_DEMAP_PRIMARY | TLB_DEMAP_CONTEXT, ASI_IMMU_DEMAP, 0); - membar(Sync); - intr_restore(s); - } - ipi_wait(cookie); - critical_exit(); -} - -static __inline void -tlb_page_demap(u_int tlb, struct pmap *pm, vm_offset_t va) -{ - u_long flags; - void *cookie; - u_long s; - - critical_enter(); - cookie = ipi_tlb_page_demap(tlb, pm, va); - if (pm->pm_active & PCPU_GET(cpumask)) { - KASSERT(pm->pm_context[PCPU_GET(cpuid)] != -1, - ("tlb_page_demap: inactive pmap?")); - if (pm == kernel_pmap) - flags = TLB_DEMAP_NUCLEUS | TLB_DEMAP_PAGE; - else - flags = TLB_DEMAP_PRIMARY | TLB_DEMAP_PAGE; - - s = intr_disable(); - if (tlb & TLB_DTLB) { - stxa(TLB_DEMAP_VA(va) | flags, ASI_DMMU_DEMAP, 0); - membar(Sync); - } - if (tlb & TLB_ITLB) { - stxa(TLB_DEMAP_VA(va) | flags, ASI_IMMU_DEMAP, 0); - membar(Sync); - } - intr_restore(s); - } - ipi_wait(cookie); - critical_exit(); -} - -static __inline void -tlb_range_demap(struct pmap *pm, vm_offset_t start, vm_offset_t end) -{ - vm_offset_t va; - void *cookie; - u_long flags; - u_long s; - - critical_enter(); - cookie = ipi_tlb_range_demap(pm, start, end); - if (pm->pm_active & PCPU_GET(cpumask)) { - KASSERT(pm->pm_context[PCPU_GET(cpuid)] != -1, - ("tlb_range_demap: inactive pmap?")); - if (pm == kernel_pmap) - flags = TLB_DEMAP_NUCLEUS | TLB_DEMAP_PAGE; - else - flags = TLB_DEMAP_PRIMARY | TLB_DEMAP_PAGE; - - s = intr_disable(); - for (va = start; va < end; va += PAGE_SIZE) { - stxa(TLB_DEMAP_VA(va) | flags, ASI_DMMU_DEMAP, 0); - stxa(TLB_DEMAP_VA(va) | flags, ASI_IMMU_DEMAP, 0); - membar(Sync); - } - intr_restore(s); - } - ipi_wait(cookie); - critical_exit(); -} +void tlb_context_demap(struct pmap *pm); +void tlb_page_demap(u_int tlb, struct pmap *pm, vm_offset_t va); +void tlb_range_demap(struct pmap *pm, vm_offset_t start, vm_offset_t end); #define tlb_tte_demap(tte, pm) \ tlb_page_demap(TD_GET_TLB((tte).tte_data), pm, \ To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe p4-projects" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200205200113.g4K1DY160929>