From: Wanlong G. <gao...@cn...> - 2012-03-27 02:31:58
|
If shm_size bigger than shmmax, shmget() will fail with EINTVAL. So, limit the value of shm_size. Below is the test result: [root@gaowanlong hugeshmget]# ./hugeshmget02 hugeshmget02 0 TINFO : set nr_hugepages to 128 hugeshmget02 1 TBROK : shmget #setup: errno=EINVAL(22): Invalid argument hugeshmget02 2 TBROK : Remaining cases broken hugeshmget02 0 TINFO : set nr_hugepages to 0 [root@gaowanlong hugeshmget]# cat /proc/sys/kernel/shmmax 33554432 After patched, [root@gaowanlong hugeshmget]# ./hugeshmget02 hugeshmget02 0 TINFO : set nr_hugepages to 128 hugeshmget02 1 TPASS : shmget failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument hugeshmget02 2 TPASS : shmget failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument hugeshmget02 3 TPASS : shmget failed as expected: TEST_ERRNO=EEXIST(17): File exists hugeshmget02 4 TPASS : shmget failed as expected: TEST_ERRNO=ENOENT(2): No such file or directory hugeshmget02 0 TINFO : set nr_hugepages to 0 [root@gaowanlong hugeshmget]# cat /proc/sys/kernel/shmall 2097152 [root@gaowanlong hugeshmget]# cat /proc/sys/kernel/shmmax 33554432 Signed-off-by: Wanlong Gao <gao...@cn...> --- testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c b/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c index 1ec786f..a971608 100644 --- a/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c +++ b/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c @@ -58,6 +58,8 @@ char *TCID = "hugeshmget02"; int TST_TOTAL = 4; +#define PATH_SHMMAX "/proc/sys/kernel/shmmax" + static size_t shm_size; static int shm_id_1 = -1; static int shm_id_2 = -1; @@ -126,6 +128,8 @@ int main(int ac, char **av) void setup(void) { long hpage_size; + char buf[BUFSIZ]; + long shmmax; tst_require_root(NULL); tst_sig(NOFORK, DEF_HANDLER, cleanup); @@ -136,6 +140,10 @@ void setup(void) hpage_size = read_meminfo("Hugepagesize:") * 1024; shm_size = hpage_size * hugepages / 2; + read_file(PATH_SHMMAX, buf); + shmmax = SAFE_STRTOL(cleanup, buf, 0, LONG_MAX); + if (shm_size > shmmax) + shm_size = shmmax; shmkey = getipckey(); shmkey2 = shmkey + 1; shm_id_1 = shmget(shmkey, shm_size, IPC_CREAT|IPC_EXCL|SHM_RW); -- 1.7.10.rc1 |
From: Caspar Z. <ca...@ca...> - 2012-03-27 02:35:26
|
On 03/27/2012 10:30 AM, Wanlong Gao wrote: > If shm_size bigger than shmmax, shmget() will fail with > EINTVAL. So, limit the value of shm_size. > > Below is the test result: > [root@gaowanlong hugeshmget]# ./hugeshmget02 > hugeshmget02 0 TINFO : set nr_hugepages to 128 > hugeshmget02 1 TBROK : shmget #setup: errno=EINVAL(22): Invalid argument > hugeshmget02 2 TBROK : Remaining cases broken > hugeshmget02 0 TINFO : set nr_hugepages to 0 > [root@gaowanlong hugeshmget]# cat /proc/sys/kernel/shmmax > 33554432 > > After patched, > > [root@gaowanlong hugeshmget]# ./hugeshmget02 > hugeshmget02 0 TINFO : set nr_hugepages to 128 > hugeshmget02 1 TPASS : shmget failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument > hugeshmget02 2 TPASS : shmget failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument > hugeshmget02 3 TPASS : shmget failed as expected: TEST_ERRNO=EEXIST(17): File exists > hugeshmget02 4 TPASS : shmget failed as expected: TEST_ERRNO=ENOENT(2): No such file or directory > hugeshmget02 0 TINFO : set nr_hugepages to 0 > [root@gaowanlong hugeshmget]# cat /proc/sys/kernel/shmall > 2097152 > [root@gaowanlong hugeshmget]# cat /proc/sys/kernel/shmmax > 33554432 > > > Signed-off-by: Wanlong Gao <gao...@cn...> Acked-by: Caspar Zhang <ca...@ca...> > --- > testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c b/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c > index 1ec786f..a971608 100644 > --- a/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c > +++ b/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c > @@ -58,6 +58,8 @@ > char *TCID = "hugeshmget02"; > int TST_TOTAL = 4; > > +#define PATH_SHMMAX "/proc/sys/kernel/shmmax" > + > static size_t shm_size; > static int shm_id_1 = -1; > static int shm_id_2 = -1; > @@ -126,6 +128,8 @@ int main(int ac, char **av) > void setup(void) > { > long hpage_size; > + char buf[BUFSIZ]; > + long shmmax; > > tst_require_root(NULL); > tst_sig(NOFORK, DEF_HANDLER, cleanup); > @@ -136,6 +140,10 @@ void setup(void) > hpage_size = read_meminfo("Hugepagesize:") * 1024; > > shm_size = hpage_size * hugepages / 2; > + read_file(PATH_SHMMAX, buf); > + shmmax = SAFE_STRTOL(cleanup, buf, 0, LONG_MAX); > + if (shm_size > shmmax) > + shm_size = shmmax; > shmkey = getipckey(); > shmkey2 = shmkey + 1; > shm_id_1 = shmget(shmkey, shm_size, IPC_CREAT|IPC_EXCL|SHM_RW); |
From: Wanlong G. <gao...@cn...> - 2012-03-27 03:11:12
|
On 03/27/2012 10:33 AM, Caspar Zhang wrote: > On 03/27/2012 10:30 AM, Wanlong Gao wrote: >> If shm_size bigger than shmmax, shmget() will fail with >> EINTVAL. So, limit the value of shm_size. >> >> Below is the test result: >> [root@gaowanlong hugeshmget]# ./hugeshmget02 >> hugeshmget02 0 TINFO : set nr_hugepages to 128 >> hugeshmget02 1 TBROK : shmget #setup: errno=EINVAL(22): Invalid argument >> hugeshmget02 2 TBROK : Remaining cases broken >> hugeshmget02 0 TINFO : set nr_hugepages to 0 >> [root@gaowanlong hugeshmget]# cat /proc/sys/kernel/shmmax >> 33554432 >> >> After patched, >> >> [root@gaowanlong hugeshmget]# ./hugeshmget02 >> hugeshmget02 0 TINFO : set nr_hugepages to 128 >> hugeshmget02 1 TPASS : shmget failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument >> hugeshmget02 2 TPASS : shmget failed as expected: TEST_ERRNO=EINVAL(22): Invalid argument >> hugeshmget02 3 TPASS : shmget failed as expected: TEST_ERRNO=EEXIST(17): File exists >> hugeshmget02 4 TPASS : shmget failed as expected: TEST_ERRNO=ENOENT(2): No such file or directory >> hugeshmget02 0 TINFO : set nr_hugepages to 0 >> [root@gaowanlong hugeshmget]# cat /proc/sys/kernel/shmall >> 2097152 >> [root@gaowanlong hugeshmget]# cat /proc/sys/kernel/shmmax >> 33554432 >> >> >> Signed-off-by: Wanlong Gao <gao...@cn...> > > Acked-by: Caspar Zhang <ca...@ca...> thanks for reviewing Caspar, pushed, Wanlong Gao > >> --- >> testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c | 8 ++++++++ >> 1 file changed, 8 insertions(+) >> >> diff --git a/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c b/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c >> index 1ec786f..a971608 100644 >> --- a/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c >> +++ b/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget02.c >> @@ -58,6 +58,8 @@ >> char *TCID = "hugeshmget02"; >> int TST_TOTAL = 4; >> >> +#define PATH_SHMMAX "/proc/sys/kernel/shmmax" >> + >> static size_t shm_size; >> static int shm_id_1 = -1; >> static int shm_id_2 = -1; >> @@ -126,6 +128,8 @@ int main(int ac, char **av) >> void setup(void) >> { >> long hpage_size; >> + char buf[BUFSIZ]; >> + long shmmax; >> >> tst_require_root(NULL); >> tst_sig(NOFORK, DEF_HANDLER, cleanup); >> @@ -136,6 +140,10 @@ void setup(void) >> hpage_size = read_meminfo("Hugepagesize:") * 1024; >> >> shm_size = hpage_size * hugepages / 2; >> + read_file(PATH_SHMMAX, buf); >> + shmmax = SAFE_STRTOL(cleanup, buf, 0, LONG_MAX); >> + if (shm_size > shmmax) >> + shm_size = shmmax; >> shmkey = getipckey(); >> shmkey2 = shmkey + 1; >> shm_id_1 = shmget(shmkey, shm_size, IPC_CREAT|IPC_EXCL|SHM_RW); > > |