The test msgctl11 will fail with log as follows once it is on the
target with more than 4G memory and use default maximum pid value 32768.
Because in this case, the maxnkids is always 0 which will cause fail
and exit.

maxnkids = ((free_pids / 4) / MSGMNI);

Test msgctl11 fail log

"msgctl11    1  TBROK  :  Not enough free pids"

This fix will update the maximum pid value to meet the need of
free pids on the target with more than 4G memory.

For example, on the target with 16G memory

nprocs = MSGMNI = 32768

and every message queue need read and write child process.

So need MSGMNI * 2 pids.

when nkids = maxnkids = 1,

the max pids will be updated to MSGMNI * 2 * 2 and give enought pids to

the test.

Signed-off-by: Jin Li <[email protected]>
---
 include/system_specific_process_info.h          |    3 ++
 lib/system_specific_process_info.c              |   22 +++++++++++++++
 testcases/kernel/syscalls/ipc/msgctl/msgctl11.c |   32 ++++++++++++++++++----
 3 files changed, 51 insertions(+), 6 deletions(-)

diff --git a/include/system_specific_process_info.h 
b/include/system_specific_process_info.h
index 956d90f..dddcac0 100644
--- a/include/system_specific_process_info.h
+++ b/include/system_specific_process_info.h
@@ -26,4 +26,7 @@ int get_max_pids(void);
 /* Returns number of free pids */
 int get_free_pids(void);
 
+/* Set max pid count to /proc/sys/kernel/pid_max */
+int set_max_pids(int);
+
 #endif
diff --git a/lib/system_specific_process_info.c 
b/lib/system_specific_process_info.c
index d3c9638..d631340 100644
--- a/lib/system_specific_process_info.c
+++ b/lib/system_specific_process_info.c
@@ -59,6 +59,28 @@ int get_max_pids(void)
 }
 
 
+int set_max_pids(int pids_max)
+{
+       FILE *f;
+
+       f = fopen("/proc/sys/kernel/pid_max", "w+");
+       if (!f) {
+               tst_resm(TBROK, "Could not open /proc/sys/kernel/pid_max");
+               return -1;
+       }
+       if (!fprintf(f, "%d", pids_max)) {
+               fclose(f);
+               tst_resm(TBROK, "Could not write to /proc/sys/kernel/pid_max");
+               return -1;
+       }
+       if (fclose(f)) {
+               tst_resm(TBROK, "Fail to close file /proc/sys/kernel/pid_max");
+               return -1;
+       }
+       return 0;
+}
+
+
 int get_free_pids(void)
 {
        FILE *f;
diff --git a/testcases/kernel/syscalls/ipc/msgctl/msgctl11.c 
b/testcases/kernel/syscalls/ipc/msgctl/msgctl11.c
index 57bd184..d587376 100644
--- a/testcases/kernel/syscalls/ipc/msgctl/msgctl11.c
+++ b/testcases/kernel/syscalls/ipc/msgctl/msgctl11.c
@@ -79,6 +79,9 @@ int TST_TOTAL = 1;            /* Total number of test cases. 
*/
 
 int exp_enos[] = { 0 };                /* List must end with 0 */
 int maxnkids = MAXNKIDS;       /* Used if pid_max is exceeded */
+int max_pids;
+int adjust_max_pids;
+
 
 key_t keyarray[MAXNPROCS];
 
@@ -641,14 +644,27 @@ void setup()
                tst_exit();
        }
 
+       max_pids = get_max_pids();
+       adjust_max_pids = 0;
        if ((MSGMNI * MAXNKIDS * 2) > (free_pids / 2)) {
-               maxnkids = ((free_pids / 4) / MSGMNI);
-               if (!maxnkids) {
-                       tst_resm(TBROK, "Not enough free pids");
-                       tst_exit();
+               if (nr_msgqs < 8192) {
+                       maxnkids = ((free_pids / 4) / MSGMNI);
+                       if (!maxnkids)
+                               tst_brkm(TBROK, cleanup, "No enough free pids");
+               } else  {
+                       maxnkids = 1;
+
+                       /* After the update of maximum pid number, the free
+                        * pids will be MSGMNI * 2 * 2
+                        */
+                       adjust_max_pids = MSGMNI * 2 * 2 + max_pids - free_pids;
+                       if ((set_max_pids(adjust_max_pids)) < 0) {
+                               tst_brkm(TBROK, cleanup, "cannot adjust"
+                                                               " max pids");
+                       }
+                       free_pids = get_free_pids();
                }
        }
-
        tst_resm(TINFO, "Using upto %d pids", free_pids / 2);
 }
 
@@ -682,4 +698,8 @@ void cleanup()
        fflush(stdout);
        tst_rmdir();
 
-}
\ No newline at end of file
+       if (adjust_max_pids > max_pids) {
+               if (set_max_pids(max_pids) < 0)
+                       tst_brkm(TBROK, NULL, "cannot restore the max pids");
+       }
+}
-- 
1.6.3.1


------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to