From 4117f2fda70b263231a9c322c39f683c93615c3d Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Sat, 23 Oct 2010 09:41:44 -0700 Subject: [PATCH] kernel - synchronize smp_invltlb() * With much of the kernel running MPSAFE, smp_invltlb() cannot run asynchronously. --- sys/platform/pc32/i386/mp_machdep.c | 9 +++++++++ sys/platform/pc64/x86_64/machdep.c | 2 +- sys/platform/pc64/x86_64/mp_machdep.c | 9 +++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/sys/platform/pc32/i386/mp_machdep.c b/sys/platform/pc32/i386/mp_machdep.c index 9078ecdd2a..95e231c4cd 100644 --- a/sys/platform/pc32/i386/mp_machdep.c +++ b/sys/platform/pc32/i386/mp_machdep.c @@ -62,6 +62,7 @@ #include #include #include +#include #include /* setidt() */ #include /* IPIs */ @@ -2605,6 +2606,13 @@ void smp_invltlb(void) { #ifdef SMP + pmap_inval_info info; + + pmap_inval_init(&info); + pmap_inval_interlock(&info, &kernel_pmap, -1); + pmap_inval_deinterlock(&info, &kernel_pmap); + pmap_inval_done(&info); +#if 0 if (smp_startup_mask == smp_active_mask) { all_but_self_ipi(XINVLTLB_OFFSET); } else { @@ -2612,6 +2620,7 @@ smp_invltlb(void) APIC_DELMODE_FIXED); } #endif +#endif } /* diff --git a/sys/platform/pc64/x86_64/machdep.c b/sys/platform/pc64/x86_64/machdep.c index 32e3120adb..d6c5fae4d7 100644 --- a/sys/platform/pc64/x86_64/machdep.c +++ b/sys/platform/pc64/x86_64/machdep.c @@ -440,7 +440,7 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code) } /* Align to 16 bytes */ - sfp = (struct sigframe *)((intptr_t)sp & ~0xFUL); + sfp = (struct sigframe *)((intptr_t)sp & ~(intptr_t)0xF); /* Translate the signal is appropriate */ if (p->p_sysent->sv_sigtbl) { diff --git a/sys/platform/pc64/x86_64/mp_machdep.c b/sys/platform/pc64/x86_64/mp_machdep.c index 9afa4bffc5..221c5fca76 100644 --- a/sys/platform/pc64/x86_64/mp_machdep.c +++ b/sys/platform/pc64/x86_64/mp_machdep.c @@ -61,6 +61,7 @@ #include #include #include +#include #include /* setidt() */ #include /* IPIs */ @@ -2788,6 +2789,13 @@ void smp_invltlb(void) { #ifdef SMP + struct pmap_inval_info info; + + pmap_inval_init(&info); + pmap_inval_interlock(&info, &kernel_pmap, -1); + pmap_inval_deinterlock(&info, &kernel_pmap); + pmap_inval_done(&info); +#if 0 if (smp_startup_mask == smp_active_mask) { all_but_self_ipi(XINVLTLB_OFFSET); } else { @@ -2795,6 +2803,7 @@ smp_invltlb(void) APIC_DELMODE_FIXED); } #endif +#endif } /* -- 2.11.4.GIT