From 4ba4bbd7114ede5aebf9757e068603ac6ca6fd41 Mon Sep 17 00:00:00 2001 From: "TOIDA,Suguru" Date: Fri, 30 Nov 2018 09:18:47 +0900 Subject: [PATCH] ContiguousPTE[12/12] modify sys_shmget/sys_mmap Change-Id: Icfbe9fbfa6216735ec20c55da95e5b62a25fdfea --- arch/arm64/kernel/include/arch/mman.h | 4 +++ arch/arm64/kernel/include/arch/shm.h | 4 +++ arch/arm64/kernel/syscall.c | 41 ++++++++++++++------------- arch/x86_64/kernel/syscall.c | 16 +++++------ 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/arch/arm64/kernel/include/arch/mman.h b/arch/arm64/kernel/include/arch/mman.h index 6b6c8e81..300ddbee 100644 --- a/arch/arm64/kernel/include/arch/mman.h +++ b/arch/arm64/kernel/include/arch/mman.h @@ -23,10 +23,14 @@ #define MAP_HUGE_SHIFT 26 #if FIRST_LEVEL_BLOCK_SUPPORT # define MAP_HUGE_FIRST_BLOCK (__PTL3_SHIFT << MAP_HUGE_SHIFT) +# define MAP_HUGE_FIRST_CONT_BLOCK (__PTL3_CONT_SHIFT << MAP_HUGE_SHIFT) #else # define MAP_HUGE_FIRST_BLOCK -1 /* not supported */ +# define MAP_HUGE_FIRST_CONT_BLOCK -1 /* not supported */ #endif #define MAP_HUGE_SECOND_BLOCK (__PTL2_SHIFT << MAP_HUGE_SHIFT) +#define MAP_HUGE_SECOND_CONT_BLOCK (__PTL2_CONT_SHIFT << MAP_HUGE_SHIFT) +#define MAP_HUGE_THIRD_CONT_BLOCK (__PTL1_CONT_SHIFT << MAP_HUGE_SHIFT) /* * for mlockall() diff --git a/arch/arm64/kernel/include/arch/shm.h b/arch/arm64/kernel/include/arch/shm.h index 8facbff7..8c9be4a6 100644 --- a/arch/arm64/kernel/include/arch/shm.h +++ b/arch/arm64/kernel/include/arch/shm.h @@ -8,10 +8,14 @@ #define SHM_HUGE_SHIFT 26 #if FIRST_LEVEL_BLOCK_SUPPORT # define SHM_HUGE_FIRST_BLOCK (__PTL3_SHIFT << SHM_HUGE_SHIFT) +# define SHM_HUGE_FIRST_CONT_BLOCK (__PTL3_CONT_SHIFT << SHM_HUGE_SHIFT) #else # define SHM_HUGE_FIRST_BLOCK -1 /* not supported */ +# define SHM_HUGE_FIRST_CONT_BLOCK -1 /* not supported */ #endif #define SHM_HUGE_SECOND_BLOCK (__PTL2_SHIFT << SHM_HUGE_SHIFT) +#define SHM_HUGE_SECOND_CONT_BLOCK (__PTL2_CONT_SHIFT << SHM_HUGE_SHIFT) +#define SHM_HUGE_THIRD_CONT_BLOCK (__PTL1_CONT_SHIFT << SHM_HUGE_SHIFT) struct ipc_perm { key_t key; diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c index e15d6adb..4cf45aee 100644 --- a/arch/arm64/kernel/syscall.c +++ b/arch/arm64/kernel/syscall.c @@ -1745,23 +1745,24 @@ SYSCALL_DECLARE(mmap) /* check arguments */ pgsize = PAGE_SIZE; if (flags & MAP_HUGETLB) { - switch (flags & (0x3F << MAP_HUGE_SHIFT)) { - case 0: - flags |= MAP_HUGE_SECOND_BLOCK; /* default hugepage size */ - break; + int hugeshift = flags & (0x3F << MAP_HUGE_SHIFT); - case MAP_HUGE_SECOND_BLOCK: - case MAP_HUGE_FIRST_BLOCK: - break; - - default: + if (hugeshift == 0) { + /* default hugepage size */ + flags |= MAP_HUGE_SECOND_BLOCK; + } else if (hugeshift == MAP_HUGE_SECOND_BLOCK || + hugeshift == MAP_HUGE_FIRST_BLOCK || + hugeshift == MAP_HUGE_SECOND_CONT_BLOCK || + hugeshift == MAP_HUGE_FIRST_CONT_BLOCK || + hugeshift == MAP_HUGE_THIRD_CONT_BLOCK) { + /*nop*/ + } else { ekprintf("sys_mmap(%lx,%lx,%x,%x,%x,%lx):" "not supported page size.\n", addr0, len0, prot, flags0, fd, off0); error = -EINVAL; goto out; } - pgsize = (size_t)1 << ((flags >> MAP_HUGE_SHIFT) & 0x3F); } @@ -1819,16 +1820,18 @@ SYSCALL_DECLARE(shmget) dkprintf("shmget(%#lx,%#lx,%#x)\n", key, size, shmflg0); if (shmflg & SHM_HUGETLB) { - switch (shmflg & (0x3F << SHM_HUGE_SHIFT)) { - case 0: - shmflg |= SHM_HUGE_SECOND_BLOCK; /* default hugepage size */ - break; + int hugeshift = shmflg & (0x3F << SHM_HUGE_SHIFT); - case SHM_HUGE_SECOND_BLOCK: - case SHM_HUGE_FIRST_BLOCK: - break; - - default: + if (hugeshift == 0) { + /* default hugepage size */ + shmflg |= SHM_HUGE_SECOND_BLOCK; + } else if (hugeshift == SHM_HUGE_SECOND_BLOCK || + hugeshift == SHM_HUGE_FIRST_BLOCK || + hugeshift == SHM_HUGE_SECOND_CONT_BLOCK || + hugeshift == SHM_HUGE_FIRST_CONT_BLOCK || + hugeshift == SHM_HUGE_THIRD_CONT_BLOCK) { + /*nop*/ + } else { error = -EINVAL; goto out; } diff --git a/arch/x86_64/kernel/syscall.c b/arch/x86_64/kernel/syscall.c index 3c1f61d0..a090448f 100644 --- a/arch/x86_64/kernel/syscall.c +++ b/arch/x86_64/kernel/syscall.c @@ -1725,16 +1725,14 @@ SYSCALL_DECLARE(shmget) dkprintf("shmget(%#lx,%#lx,%#x)\n", key, size, shmflg0); if (shmflg & SHM_HUGETLB) { - switch (shmflg & (0x3F << SHM_HUGE_SHIFT)) { - case 0: + int hugeshift = shmflg & (0x3F << SHM_HUGE_SHIFT); + + if (hugeshift == 0) { shmflg |= SHM_HUGE_2MB; /* default hugepage size */ - break; - - case SHM_HUGE_2MB: - case SHM_HUGE_1GB: - break; - - default: + } else if (hugeshift == SHM_HUGE_2MB || + hugeshift == SHM_HUGE_1GB) { + /*nop*/ + } else { error = -EINVAL; goto out; }