ContiguousPTE[12/12] modify sys_shmget/sys_mmap
Change-Id: Icfbe9fbfa6216735ec20c55da95e5b62a25fdfea
This commit is contained in:
committed by
Masamichi Takagi
parent
410bf13367
commit
4ba4bbd711
@@ -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()
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user