Commit 538ce05c authored by Linus Torvalds's avatar Linus Torvalds

Fix threaded user page write memory ordering

Make sure we order the writes to a newly created page
with the page table update that potentially exposes the
page to another CPU.

This is a no-op on any architecture where getting the
page table spinlock will already do the ordering (notably
x86), but other architectures can care.
parent 8c225dbc
...@@ -40,6 +40,8 @@ static inline void clear_user_highpage(struct page *page, unsigned long vaddr) ...@@ -40,6 +40,8 @@ static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
void *addr = kmap_atomic(page, KM_USER0); void *addr = kmap_atomic(page, KM_USER0);
clear_user_page(addr, vaddr, page); clear_user_page(addr, vaddr, page);
kunmap_atomic(addr, KM_USER0); kunmap_atomic(addr, KM_USER0);
/* Make sure this page is cleared on other CPU's too before using it */
smp_wmb();
} }
static inline void clear_highpage(struct page *page) static inline void clear_highpage(struct page *page)
...@@ -73,6 +75,8 @@ static inline void copy_user_highpage(struct page *to, struct page *from, unsign ...@@ -73,6 +75,8 @@ static inline void copy_user_highpage(struct page *to, struct page *from, unsign
copy_user_page(vto, vfrom, vaddr, to); copy_user_page(vto, vfrom, vaddr, to);
kunmap_atomic(vfrom, KM_USER0); kunmap_atomic(vfrom, KM_USER0);
kunmap_atomic(vto, KM_USER1); kunmap_atomic(vto, KM_USER1);
/* Make sure this page is cleared on other CPU's too before using it */
smp_wmb();
} }
static inline void copy_highpage(struct page *to, struct page *from) static inline void copy_highpage(struct page *to, struct page *from)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment