ContiguousPTE[12/12] modify sys_shmget/sys_mmap

Change-Id: Icfbe9fbfa6216735ec20c55da95e5b62a25fdfea
This commit is contained in:
TOIDA,Suguru
2018-11-30 09:18:47 +09:00
committed by Masamichi Takagi
parent 410bf13367
commit 4ba4bbd711
4 changed files with 37 additions and 28 deletions

View File

@@ -23,10 +23,14 @@
#define MAP_HUGE_SHIFT 26 #define MAP_HUGE_SHIFT 26
#if FIRST_LEVEL_BLOCK_SUPPORT #if FIRST_LEVEL_BLOCK_SUPPORT
# define MAP_HUGE_FIRST_BLOCK (__PTL3_SHIFT << MAP_HUGE_SHIFT) # define MAP_HUGE_FIRST_BLOCK (__PTL3_SHIFT << MAP_HUGE_SHIFT)
# define MAP_HUGE_FIRST_CONT_BLOCK (__PTL3_CONT_SHIFT << MAP_HUGE_SHIFT)
#else #else
# define MAP_HUGE_FIRST_BLOCK -1 /* not supported */ # define MAP_HUGE_FIRST_BLOCK -1 /* not supported */
# define MAP_HUGE_FIRST_CONT_BLOCK -1 /* not supported */
#endif #endif
#define MAP_HUGE_SECOND_BLOCK (__PTL2_SHIFT << MAP_HUGE_SHIFT) #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() * for mlockall()

View File

@@ -8,10 +8,14 @@
#define SHM_HUGE_SHIFT 26 #define SHM_HUGE_SHIFT 26
#if FIRST_LEVEL_BLOCK_SUPPORT #if FIRST_LEVEL_BLOCK_SUPPORT
# define SHM_HUGE_FIRST_BLOCK (__PTL3_SHIFT << SHM_HUGE_SHIFT) # define SHM_HUGE_FIRST_BLOCK (__PTL3_SHIFT << SHM_HUGE_SHIFT)
# define SHM_HUGE_FIRST_CONT_BLOCK (__PTL3_CONT_SHIFT << SHM_HUGE_SHIFT)
#else #else
# define SHM_HUGE_FIRST_BLOCK -1 /* not supported */ # define SHM_HUGE_FIRST_BLOCK -1 /* not supported */
# define SHM_HUGE_FIRST_CONT_BLOCK -1 /* not supported */
#endif #endif
#define SHM_HUGE_SECOND_BLOCK (__PTL2_SHIFT << SHM_HUGE_SHIFT) #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 { struct ipc_perm {
key_t key; key_t key;

View File

@@ -1745,23 +1745,24 @@ SYSCALL_DECLARE(mmap)
/* check arguments */ /* check arguments */
pgsize = PAGE_SIZE; pgsize = PAGE_SIZE;
if (flags & MAP_HUGETLB) { if (flags & MAP_HUGETLB) {
switch (flags & (0x3F << MAP_HUGE_SHIFT)) { int hugeshift = flags & (0x3F << MAP_HUGE_SHIFT);
case 0:
flags |= MAP_HUGE_SECOND_BLOCK; /* default hugepage size */
break;
case MAP_HUGE_SECOND_BLOCK: if (hugeshift == 0) {
case MAP_HUGE_FIRST_BLOCK: /* default hugepage size */
break; flags |= MAP_HUGE_SECOND_BLOCK;
} else if (hugeshift == MAP_HUGE_SECOND_BLOCK ||
default: 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):" ekprintf("sys_mmap(%lx,%lx,%x,%x,%x,%lx):"
"not supported page size.\n", "not supported page size.\n",
addr0, len0, prot, flags0, fd, off0); addr0, len0, prot, flags0, fd, off0);
error = -EINVAL; error = -EINVAL;
goto out; goto out;
} }
pgsize = (size_t)1 << ((flags >> MAP_HUGE_SHIFT) & 0x3F); 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); dkprintf("shmget(%#lx,%#lx,%#x)\n", key, size, shmflg0);
if (shmflg & SHM_HUGETLB) { if (shmflg & SHM_HUGETLB) {
switch (shmflg & (0x3F << SHM_HUGE_SHIFT)) { int hugeshift = shmflg & (0x3F << SHM_HUGE_SHIFT);
case 0:
shmflg |= SHM_HUGE_SECOND_BLOCK; /* default hugepage size */
break;
case SHM_HUGE_SECOND_BLOCK: if (hugeshift == 0) {
case SHM_HUGE_FIRST_BLOCK: /* default hugepage size */
break; shmflg |= SHM_HUGE_SECOND_BLOCK;
} else if (hugeshift == SHM_HUGE_SECOND_BLOCK ||
default: 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; error = -EINVAL;
goto out; goto out;
} }

View File

@@ -1725,16 +1725,14 @@ SYSCALL_DECLARE(shmget)
dkprintf("shmget(%#lx,%#lx,%#x)\n", key, size, shmflg0); dkprintf("shmget(%#lx,%#lx,%#x)\n", key, size, shmflg0);
if (shmflg & SHM_HUGETLB) { if (shmflg & SHM_HUGETLB) {
switch (shmflg & (0x3F << SHM_HUGE_SHIFT)) { int hugeshift = shmflg & (0x3F << SHM_HUGE_SHIFT);
case 0:
if (hugeshift == 0) {
shmflg |= SHM_HUGE_2MB; /* default hugepage size */ shmflg |= SHM_HUGE_2MB; /* default hugepage size */
break; } else if (hugeshift == SHM_HUGE_2MB ||
hugeshift == SHM_HUGE_1GB) {
case SHM_HUGE_2MB: /*nop*/
case SHM_HUGE_1GB: } else {
break;
default:
error = -EINVAL; error = -EINVAL;
goto out; goto out;
} }