Date: Thu, 12 Aug 2010 09:03:21 +0000 (UTC) From: "Jayachandran C." <jchandra@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r211215 - head/sys/mips/mips Message-ID: <201008120903.o7C93LA6031302@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jchandra Date: Thu Aug 12 09:03:21 2010 New Revision: 211215 URL: http://svn.freebsd.org/changeset/base/211215 Log: Re-arrange the pmap calls that use smp_rendezvous() on SMP, so that their per-cpu variants are also available to be called. The per-cpu variants are needed for some later optimizations. Also remove unnecessary casts, do some style fixes. Reviewed by: alc, neel Modified: head/sys/mips/mips/pmap.c Modified: head/sys/mips/mips/pmap.c ============================================================================== --- head/sys/mips/mips/pmap.c Thu Aug 12 08:39:54 2010 (r211214) +++ head/sys/mips/mips/pmap.c Thu Aug 12 09:03:21 2010 (r211215) @@ -173,7 +173,6 @@ static void pmap_pvh_free(struct md_page static pv_entry_t pmap_pvh_remove(struct md_page *pvh, pmap_t pmap, vm_offset_t va); static __inline void pmap_changebit(vm_page_t m, int bit, boolean_t setem); - static vm_page_t pmap_enter_quick_locked(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot, vm_page_t mpte); static int pmap_remove_pte(struct pmap *pmap, pt_entry_t *ptq, vm_offset_t va); @@ -181,7 +180,8 @@ static void pmap_remove_page(struct pmap static void pmap_remove_entry(struct pmap *pmap, vm_page_t m, vm_offset_t va); static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_page_t mpte, vm_offset_t va, vm_page_t m); -static __inline void pmap_invalidate_page(pmap_t pmap, vm_offset_t va); +static void pmap_invalidate_all(pmap_t pmap); +static void pmap_invalidate_page(pmap_t pmap, vm_offset_t va); static int _pmap_unwire_pte_hold(pmap_t pmap, vm_offset_t va, vm_page_t m); static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags); @@ -592,61 +592,100 @@ pmap_nw_modified(pt_entry_t pte) else return (0); } - #endif +static __inline void +pmap_invalidate_all_local(pmap_t pmap) +{ + + if (pmap == kernel_pmap) { + tlb_invalidate_all(); + return; + } + if (pmap->pm_active & PCPU_GET(cpumask)) + tlb_invalidate_all_user(pmap); + else + pmap->pm_asid[PCPU_GET(cpuid)].gen = 0; +} + +#ifdef SMP static void pmap_invalidate_all(pmap_t pmap) { -#ifdef SMP - smp_rendezvous(0, pmap_invalidate_all_action, 0, (void *)pmap); + + smp_rendezvous(0, pmap_invalidate_all_action, 0, pmap); } static void pmap_invalidate_all_action(void *arg) { - pmap_t pmap = (pmap_t)arg; + pmap_invalidate_all_local((pmap_t)arg); +} +#else +static void +pmap_invalidate_all(pmap_t pmap) +{ + + pmap_invalidate_all_local(pmap); +} #endif - if (pmap == kernel_pmap) { - tlb_invalidate_all(); +static __inline void +pmap_invalidate_page_local(pmap_t pmap, vm_offset_t va) +{ + + if (is_kernel_pmap(pmap)) { + tlb_invalidate_address(pmap, va); return; } - - if (pmap->pm_active & PCPU_GET(cpumask)) - tlb_invalidate_all_user(pmap); - else + if (pmap->pm_asid[PCPU_GET(cpuid)].gen != PCPU_GET(asid_generation)) + return; + else if (!(pmap->pm_active & PCPU_GET(cpumask))) { pmap->pm_asid[PCPU_GET(cpuid)].gen = 0; + return; + } + tlb_invalidate_address(pmap, va); } +#ifdef SMP struct pmap_invalidate_page_arg { pmap_t pmap; vm_offset_t va; }; -static __inline void +static void pmap_invalidate_page(pmap_t pmap, vm_offset_t va) { -#ifdef SMP struct pmap_invalidate_page_arg arg; arg.pmap = pmap; arg.va = va; - - smp_rendezvous(0, pmap_invalidate_page_action, 0, (void *)&arg); + smp_rendezvous(0, pmap_invalidate_page_action, 0, &arg); } static void pmap_invalidate_page_action(void *arg) { - pmap_t pmap = ((struct pmap_invalidate_page_arg *)arg)->pmap; - vm_offset_t va = ((struct pmap_invalidate_page_arg *)arg)->va; + struct pmap_invalidate_page_arg *p = arg; + + pmap_invalidate_page_local(p->pmap, p->va); +} +#else +static void +pmap_invalidate_page(pmap_t pmap, vm_offset_t va) +{ + pmap_invalidate_page_local(pmap, va); +} #endif +static __inline void +pmap_update_page_local(pmap_t pmap, vm_offset_t va, pt_entry_t pte) +{ + if (is_kernel_pmap(pmap)) { - tlb_invalidate_address(pmap, va); + tlb_update(pmap, va, pte); return; } if (pmap->pm_asid[PCPU_GET(cpuid)].gen != PCPU_GET(asid_generation)) @@ -655,9 +694,10 @@ pmap_invalidate_page_action(void *arg) pmap->pm_asid[PCPU_GET(cpuid)].gen = 0; return; } - tlb_invalidate_address(pmap, va); + tlb_update(pmap, va, pte); } +#ifdef SMP struct pmap_update_page_arg { pmap_t pmap; vm_offset_t va; @@ -667,36 +707,29 @@ struct pmap_update_page_arg { void pmap_update_page(pmap_t pmap, vm_offset_t va, pt_entry_t pte) { -#ifdef SMP struct pmap_update_page_arg arg; arg.pmap = pmap; arg.va = va; arg.pte = pte; - - smp_rendezvous(0, pmap_update_page_action, 0, (void *)&arg); + smp_rendezvous(0, pmap_update_page_action, 0, &arg); } static void pmap_update_page_action(void *arg) { - pmap_t pmap = ((struct pmap_update_page_arg *)arg)->pmap; - vm_offset_t va = ((struct pmap_update_page_arg *)arg)->va; - pt_entry_t pte = ((struct pmap_update_page_arg *)arg)->pte; + struct pmap_update_page_arg *p = arg; -#endif - if (is_kernel_pmap(pmap)) { - tlb_update(pmap, va, pte); - return; - } - if (pmap->pm_asid[PCPU_GET(cpuid)].gen != PCPU_GET(asid_generation)) - return; - else if (!(pmap->pm_active & PCPU_GET(cpumask))) { - pmap->pm_asid[PCPU_GET(cpuid)].gen = 0; - return; - } - tlb_update(pmap, va, pte); + pmap_update_page_local(p->pmap, p->va, p->pte); +} +#else +void +pmap_update_page(pmap_t pmap, vm_offset_t va, pt_entry_t pte) +{ + + pmap_update_page_local(pmap, va, pte); } +#endif /* * Routine: pmap_extract
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008120903.o7C93LA6031302>