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 <gaowanl...@cn.fujitsu.com>
---
 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


------------------------------------------------------------------------------
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to