On Thu, Feb 07, 2008 at 08:13:37PM +0100, Ingo Molnar wrote:Yes you're right. Thanks makes more sense. The weird style fooled me. It seems to come from the pseudo code in the Intel manual, but I think it would be still cleaner/more idiomatic to use two __flush_tlb_all() and remove the explicit code. The only drawback would be some more cr4 accesses, which does not seem like a big issue. Updated patch follows. -Andi --- Use standard global TLB flushes in MTRR code This is more idiomatic and it does not really make sense for this code to implement a own TLB flushing variant. The control registers will be read/written a few times more, but that should not really matter for this code. Signed-off-by: Andi Kleen <ak@suse.de> --- arch/x86/kernel/cpu/mtrr/generic.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) Index: linux/arch/x86/kernel/cpu/mtrr/generic.c =================================================================== --- linux.orig/arch/x86/kernel/cpu/mtrr/generic.c +++ linux/arch/x86/kernel/cpu/mtrr/generic.c @@ -349,14 +349,8 @@ static void prepare_set(void) __acquires write_cr0(cr0); wbinvd(); - /* Save value of CR4 and clear Page Global Enable (bit 7) */ - if ( cpu_has_pge ) { - cr4 = read_cr4(); - write_cr4(cr4 & ~X86_CR4_PGE); - } - - /* Flush all TLBs via a mov %cr3, %reg; mov %reg, %cr3 */ - __flush_tlb(); + /* Flush all TLBs */ + __flush_tlb_all(); /* Save MTRR state */ rdmsr(MTRRdefType_MSR, deftype_lo, deftype_hi); @@ -368,7 +362,7 @@ static void prepare_set(void) __acquires static void post_set(void) __releases(set_atomicity_lock) { /* Flush TLBs (no need to flush caches - they are disabled) */ - __flush_tlb(); + __flush_tlb_all(); /* Intel (P6) standard MTRRs */ mtrr_wrmsr(MTRRdefType_MSR, deftype_lo, deftype_hi); @@ -376,9 +370,9 @@ static void post_set(void) __releases(se /* Enable caches */ write_cr0(read_cr0() & 0xbfffffff); - /* Restore value of CR4 */ - if ( cpu_has_pge ) - write_cr4(cr4); + /* Flush TLBs again to handle prefetches etc. */ + __flush_tlb_all(); + spin_unlock(&set_atomicity_lock); } --
| david | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
| Greg KH | [2.6.22.2 review 05/84] Fix deadlocks in sparc serial console. |
| Greg KH | [GIT PATCH] driver core patches against 2.6.24 |
| Andrew Morton | -mm merge plans for 2.6.23 |
git: | |
| Jeff Kirsher | [RESEND][NET-NEXT PATCH 01/29] ixgbe: fix bug where using wake queue instead of st... |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| Jarek Poplawski | [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Patrick McHardy | Re: [GIT]: Networking |
| Manuel Bouyer | Re: Interactive performance in -current |
| Christian Limpach | Re: newfs: determining file system parameters |
| YAMAMOTO Takashi | Re: statvfs(2) replacement for statfs(2) patch |
| Charles M. Hannum | Re: kern/22869: Slave IDE drive not detected |
