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
