Skip to content

Commit

Permalink
s390/mm: Fix crst upgrade of mmap with MAP_FIXED
Browse files Browse the repository at this point in the history
Right now the page table upgrade does not happen if the end address
of a fixed mapping is greater than TASK_SIZE.
Enhance s390_mmap_check() to handle MAP_FIXED mappings correctly.

Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Hendrik Brueckner authored and Martin Schwidefsky committed Feb 14, 2013
1 parent a4e6924 commit 486c0a0
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 5 deletions.
4 changes: 2 additions & 2 deletions arch/s390/include/asm/mman.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include <uapi/asm/mman.h>

#if !defined(__ASSEMBLY__) && defined(CONFIG_64BIT)
int s390_mmap_check(unsigned long addr, unsigned long len);
#define arch_mmap_check(addr,len,flags) s390_mmap_check(addr,len)
int s390_mmap_check(unsigned long addr, unsigned long len, unsigned long flags);
#define arch_mmap_check(addr, len, flags) s390_mmap_check(addr, len, flags)
#endif
#endif /* __S390_MMAN_H__ */
9 changes: 6 additions & 3 deletions arch/s390/mm/mmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,15 @@ void arch_pick_mmap_layout(struct mm_struct *mm)

#else

int s390_mmap_check(unsigned long addr, unsigned long len)
int s390_mmap_check(unsigned long addr, unsigned long len, unsigned long flags)
{
int rc;

if (!is_compat_task() &&
len >= TASK_SIZE && TASK_SIZE < (1UL << 53)) {
if (is_compat_task() || (TASK_SIZE >= (1UL << 53)))
return 0;
if (!(flags & MAP_FIXED))
addr = 0;
if ((addr + len) >= TASK_SIZE) {
rc = crst_table_upgrade(current->mm, 1UL << 53);
if (rc)
return rc;
Expand Down

0 comments on commit 486c0a0

Please sign in to comment.