Skip to content

Commit

Permalink
x86, pat: avoid highmem cache attribute aliasing
Browse files Browse the repository at this point in the history
Highmem code can leave ptes and tlb entries around for a given page even after
kunmap, and after it has been freed.

>From what I can gather, the PAT code may change the cache attributes of
arbitrary physical addresses (ie. including highmem pages), which would result
in aliases in the case that it operates on one of these lazy tlb highmem
pages.

Flushing kmaps should solve the problem.

I've also just added code for conditional flushing if we haven't got
any dangling highmem aliases -- this should help performance if we
change page attributes frequently or systems that aren't using much
highmem pages (eg. if < 4G RAM). Should be turned into 2 patches, but
just for RFC...

Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Nick Piggin authored and Ingo Molnar committed Aug 15, 2008
1 parent 466ae83 commit 5843d9a
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 1 deletion.
3 changes: 3 additions & 0 deletions arch/x86/mm/pageattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -777,6 +777,9 @@ static int do_change_page_attr_set_clr(unsigned long addr, int numpages,
WARN_ON_ONCE(1);
}

/* Must avoid aliasing mappings in the highmem code */
kmap_flush_unused();

cpa.vaddr = addr;
cpa.numpages = numpages;
cpa.mask_set = mask_set;
Expand Down
5 changes: 4 additions & 1 deletion mm/highmem.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ static DECLARE_WAIT_QUEUE_HEAD(pkmap_map_wait);
static void flush_all_zero_pkmaps(void)
{
int i;
int need_flush = 0;

flush_cache_kmaps();

Expand Down Expand Up @@ -101,8 +102,10 @@ static void flush_all_zero_pkmaps(void)
&pkmap_page_table[i]);

set_page_address(page, NULL);
need_flush = 1;
}
flush_tlb_kernel_range(PKMAP_ADDR(0), PKMAP_ADDR(LAST_PKMAP));
if (need_flush)
flush_tlb_kernel_range(PKMAP_ADDR(0), PKMAP_ADDR(LAST_PKMAP));
}

/**
Expand Down

0 comments on commit 5843d9a

Please sign in to comment.