Commit 0ef36bd2 authored by Helge Deller's avatar Helge Deller

parisc: change value of SHMLBA from 0x00400000 to PAGE_SIZE

On parisc, SHMLBA was defined to 0x00400000 (4MB) to reflect that we need to
take care of our caches for shared mappings. But actually, we can map a file at
any multiple address of PAGE_SIZE, so let us correct that now with a value of
PAGE_SIZE for SHMLBA.  Instead we now take care of this cache colouring via the
constant SHM_COLOUR while we map shared pages.
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
CC: Jeroen Roovers <jer@gentoo.org>
CC: John David Anglin <dave.anglin@bell.net>
CC: Carlos O'Donell <carlos@systemhalted.org>
Cc: stable@kernel.org [3.13+]
parent 496252f7
#ifndef _ASMPARISC_SHMPARAM_H #ifndef _ASMPARISC_SHMPARAM_H
#define _ASMPARISC_SHMPARAM_H #define _ASMPARISC_SHMPARAM_H
#define __ARCH_FORCE_SHMLBA 1 #define SHMLBA PAGE_SIZE /* attach addr a multiple of this */
#define SHM_COLOUR 0x00400000 /* shared mappings colouring */
#define SHMLBA 0x00400000 /* attach addr needs to be 4 Mb aligned */
#endif /* _ASMPARISC_SHMPARAM_H */ #endif /* _ASMPARISC_SHMPARAM_H */
...@@ -323,7 +323,8 @@ void flush_dcache_page(struct page *page) ...@@ -323,7 +323,8 @@ void flush_dcache_page(struct page *page)
* specifically accesses it, of course) */ * specifically accesses it, of course) */
flush_tlb_page(mpnt, addr); flush_tlb_page(mpnt, addr);
if (old_addr == 0 || (old_addr & (SHMLBA - 1)) != (addr & (SHMLBA - 1))) { if (old_addr == 0 || (old_addr & (SHM_COLOUR - 1))
!= (addr & (SHM_COLOUR - 1))) {
__flush_cache_page(mpnt, addr, page_to_phys(page)); __flush_cache_page(mpnt, addr, page_to_phys(page));
if (old_addr) if (old_addr)
printk(KERN_ERR "INEQUIVALENT ALIASES 0x%lx and 0x%lx in file %s\n", old_addr, addr, mpnt->vm_file ? (char *)mpnt->vm_file->f_path.dentry->d_name.name : "(null)"); printk(KERN_ERR "INEQUIVALENT ALIASES 0x%lx and 0x%lx in file %s\n", old_addr, addr, mpnt->vm_file ? (char *)mpnt->vm_file->f_path.dentry->d_name.name : "(null)");
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
static int get_offset(unsigned int last_mmap) static int get_offset(unsigned int last_mmap)
{ {
return (last_mmap & (SHMLBA-1)) >> PAGE_SHIFT; return (last_mmap & (SHM_COLOUR-1)) >> PAGE_SHIFT;
} }
static unsigned long shared_align_offset(unsigned int last_mmap, static unsigned long shared_align_offset(unsigned int last_mmap,
...@@ -57,8 +57,8 @@ static unsigned long shared_align_offset(unsigned int last_mmap, ...@@ -57,8 +57,8 @@ static unsigned long shared_align_offset(unsigned int last_mmap,
static inline unsigned long COLOR_ALIGN(unsigned long addr, static inline unsigned long COLOR_ALIGN(unsigned long addr,
unsigned int last_mmap, unsigned long pgoff) unsigned int last_mmap, unsigned long pgoff)
{ {
unsigned long base = (addr+SHMLBA-1) & ~(SHMLBA-1); unsigned long base = (addr+SHM_COLOUR-1) & ~(SHM_COLOUR-1);
unsigned long off = (SHMLBA-1) & unsigned long off = (SHM_COLOUR-1) &
(shared_align_offset(last_mmap, pgoff) << PAGE_SHIFT); (shared_align_offset(last_mmap, pgoff) << PAGE_SHIFT);
return base + off; return base + off;
...@@ -101,7 +101,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, ...@@ -101,7 +101,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
if (flags & MAP_FIXED) { if (flags & MAP_FIXED) {
if ((flags & MAP_SHARED) && last_mmap && if ((flags & MAP_SHARED) && last_mmap &&
(addr - shared_align_offset(last_mmap, pgoff)) (addr - shared_align_offset(last_mmap, pgoff))
& (SHMLBA - 1)) & (SHM_COLOUR - 1))
return -EINVAL; return -EINVAL;
goto found_addr; goto found_addr;
} }
...@@ -122,7 +122,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, ...@@ -122,7 +122,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
info.length = len; info.length = len;
info.low_limit = mm->mmap_legacy_base; info.low_limit = mm->mmap_legacy_base;
info.high_limit = mmap_upper_limit(); info.high_limit = mmap_upper_limit();
info.align_mask = last_mmap ? (PAGE_MASK & (SHMLBA - 1)) : 0; info.align_mask = last_mmap ? (PAGE_MASK & (SHM_COLOUR - 1)) : 0;
info.align_offset = shared_align_offset(last_mmap, pgoff); info.align_offset = shared_align_offset(last_mmap, pgoff);
addr = vm_unmapped_area(&info); addr = vm_unmapped_area(&info);
...@@ -161,7 +161,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, ...@@ -161,7 +161,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
if (flags & MAP_FIXED) { if (flags & MAP_FIXED) {
if ((flags & MAP_SHARED) && last_mmap && if ((flags & MAP_SHARED) && last_mmap &&
(addr - shared_align_offset(last_mmap, pgoff)) (addr - shared_align_offset(last_mmap, pgoff))
& (SHMLBA - 1)) & (SHM_COLOUR - 1))
return -EINVAL; return -EINVAL;
goto found_addr; goto found_addr;
} }
...@@ -182,7 +182,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, ...@@ -182,7 +182,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
info.length = len; info.length = len;
info.low_limit = PAGE_SIZE; info.low_limit = PAGE_SIZE;
info.high_limit = mm->mmap_base; info.high_limit = mm->mmap_base;
info.align_mask = last_mmap ? (PAGE_MASK & (SHMLBA - 1)) : 0; info.align_mask = last_mmap ? (PAGE_MASK & (SHM_COLOUR - 1)) : 0;
info.align_offset = shared_align_offset(last_mmap, pgoff); info.align_offset = shared_align_offset(last_mmap, pgoff);
addr = vm_unmapped_area(&info); addr = vm_unmapped_area(&info);
if (!(addr & ~PAGE_MASK)) if (!(addr & ~PAGE_MASK))
......
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