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);

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

Test msgctl11 fail log

"msgctl11    1  TBROK  :  Not enough free pids"

Signed-off-by: Jin Li <[email protected]>
---
 lib/system_specific_process_info.c              |   27 ++++++++++++++++++++++
 testcases/kernel/syscalls/ipc/msgctl/msgctl11.c |   28 +++++++++++++++++++++-
 2 files changed, 53 insertions(+), 2 deletions(-)

diff --git a/lib/system_specific_process_info.c 
b/lib/system_specific_process_info.c
index d3c9638..aaa7f8b 100644
--- a/lib/system_specific_process_info.c
+++ b/lib/system_specific_process_info.c
@@ -59,6 +59,33 @@ int get_max_pids(void)
 }
 
 
+int set_max_pids(int pids_max)
+{
+#ifdef __linux__
+
+        FILE *f;
+        char buf[BUFSIZE]={0};
+
+       snprintf(buf, sizeof(buf), "%d\n", pids_max);
+
+        f = fopen("/proc/sys/kernel/pid_max", "w+");
+        if (!f) {
+                tst_resm(TBROK, "Could not open /proc/sys/kernel/pid_max");
+                return -1;
+        }
+        if (!(fwrite(buf, BUFSIZE,1,f))) {
+                fclose(f);
+                tst_resm(TBROK, "Could not write /proc/sys/kernel/pid_max");
+                return -1;
+        }
+        fclose(f);
+        return atoi(buf);
+#else
+        return SHRT_MAX;
+#endif
+}
+
+
 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..eb6cb71 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 = 0 ;
+
 
 key_t keyarray[MAXNPROCS];
 
@@ -641,14 +644,29 @@ void setup()
                tst_exit();
        }
 
+       max_pids = get_max_pids();
        if ((MSGMNI * MAXNKIDS * 2) > (free_pids / 2)) {
+            if ( nr_msgqs < 8192 ) {
                maxnkids = ((free_pids / 4) / MSGMNI);
                if (!maxnkids) {
                        tst_resm(TBROK, "Not enough free pids");
                        tst_exit();
                }
-       }
+           } 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_resm(TBROK, "cannot adjust max pids");
+                   tst_exit();
+               }
+                free_pids = get_free_pids();
+            }
 
+        }
        tst_resm(TINFO, "Using upto %d pids", free_pids / 2);
 }
 
@@ -682,4 +700,10 @@ void cleanup()
        fflush(stdout);
        tst_rmdir();
 
-}
\ No newline at end of file
+       if ( adjust_max_pids > max_pids ) {
+           if ( ! set_max_pids(max_pids) ) {
+                tst_resm(TBROK, "cannot restore the max pids");
+                tst_exit();
+           }
+        }
+}
-- 
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