mirror of https://gitee.com/openkylin/linux.git
s390/mm: Fix crst upgrade of mmap with MAP_FIXED
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>
This commit is contained in:
parent
a4e69245bd
commit
486c0a0bc8
|
@ -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__ */
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue