----- Original Message ----- > From: "Zhouping Liu" <[email protected]> > To: "LTP List" <[email protected]> > Sent: Wednesday, April 24, 2013 11:02:04 AM > Subject: [LTP] [PATCH] mem/oom: fixed a cpuset error > > For the below special NUMA system, oom0[4|5] failed: > # numactl -H > available: 2 nodes (0-1) > node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 > 24 25 26 27 > node 0 size: 0 MB > node 0 free: 0 MB > node 1 cpus: > node 1 size: 16384 MB > node 1 free: 14173 MB > node distances: > node 0 1 > 0: 10 40 > 1: 40 10 > > failed log: > oom04 1 TBROK : write /dev/cpuset/1/cpuset.mems: errno=EINVAL(22): > Invalid argument > > The reason is that node0 only contains all CPUs, no any memory, > and node1 contains all memory, but no CPUs, in the previous codes, > we only do cpuset testing on a independent node, which caused the > sub-cpuset only contains CPUs or memory in one node, that's not > permitted. The patch fixed it.
Wanlong, Jan and Caspar, any comments for this patch? Thanks, Zhouping > > Signed-off-by: Zhouping Liu <[email protected]> > > Tested on serveral machines, all PASSed. > --- > testcases/kernel/mem/lib/mem.c | 13 ++++++++++++- > testcases/kernel/mem/oom/oom04.c | 19 +++++++++++++------ > testcases/kernel/mem/oom/oom05.c | 25 +++++++++++++++---------- > 3 files changed, 40 insertions(+), 17 deletions(-) > > diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c > index 5397177..b2ad562 100644 > --- a/testcases/kernel/mem/lib/mem.c > +++ b/testcases/kernel/mem/lib/mem.c > @@ -792,7 +792,18 @@ void write_cpusets(long nd) > write_cpuset_files(CPATH_NEW, "mems", buf); > > gather_node_cpus(cpus, nd); > - write_cpuset_files(CPATH_NEW, "cpus", cpus); > + /* > + * If the 'nd' node didn't contains any CPUs, > + * the CPU0 will be used as the cpuset.cpus. > + */ > + if (strlen(cpus) != 0) { > + write_cpuset_files(CPATH_NEW, "cpus", cpus); > + } else { > + tst_resm(TINFO, "No any CPUs in node%ld", nd); > + tst_resm(TINFO, "Using CPU0 to cpuset.cpus " > + "for the special scenario"); > + write_cpuset_files(CPATH_NEW, "cpus", "0"); > + } > > SAFE_FILE_PRINTF(NULL, CPATH_NEW "/tasks", "%d", getpid()); > } > diff --git a/testcases/kernel/mem/oom/oom04.c > b/testcases/kernel/mem/oom/oom04.c > index 4d3f2f4..40c1198 100644 > --- a/testcases/kernel/mem/oom/oom04.c > +++ b/testcases/kernel/mem/oom/oom04.c > @@ -85,6 +85,8 @@ int main(int argc, char *argv[]) > > void setup(void) > { > + int memnode, ret; > + > tst_require_root(NULL); > tst_sig(FORK, DEF_HANDLER, cleanup); > TEST_PAUSE; > @@ -93,12 +95,17 @@ void setup(void) > set_sys_tune("overcommit_memory", 1, 1); > > mount_mem("cpuset", "cpuset", NULL, CPATH, CPATH_NEW); > - if (is_numa(cleanup) > 0) > - /* For NUMA system, using the first node for cpuset.mems */ > - write_cpusets(get_a_numa_node(cleanup)); > - else > - /* For nonNUMA system, using node0 for cpuset.mems */ > - write_cpusets(0); > + > + /* > + * Not any nodes contains memory, so using get_allowed_nodes() > + * to get a memory node, the operation is also appropriate for > + * NonNUMA system. > + */ > + ret = get_allowed_nodes(NH_MEMS, 1, &memnode); > + if (ret < 0) > + tst_brkm(TBROK, NULL, "Got one memory node failed " > + "using get_allowed_nodes()"); > + write_cpusets(memnode); > } > > void cleanup(void) > diff --git a/testcases/kernel/mem/oom/oom05.c > b/testcases/kernel/mem/oom/oom05.c > index 15feba5..520d657 100644 > --- a/testcases/kernel/mem/oom/oom05.c > +++ b/testcases/kernel/mem/oom/oom05.c > @@ -108,24 +108,29 @@ int main(int argc, char *argv[]) > > void setup(void) > { > + int ret, memnode; > + > tst_require_root(NULL); > tst_sig(FORK, DEF_HANDLER, cleanup); > TEST_PAUSE; > > + overcommit = get_sys_tune("overcommit_memory"); > + set_sys_tune("overcommit_memory", 1, 1); > + > mount_mem("memcg", "cgroup", "memory", MEMCG_PATH, MEMCG_PATH_NEW); > mount_mem("cpuset", "cpuset", NULL, CPATH, CPATH_NEW); > write_memcg(); > > - set_sys_tune("overcommit_memory", 1, 1); > - > - if (is_numa(cleanup)) > - /* For NUMA system, using the first node for cpuset.mems */ > - write_cpusets(get_a_numa_node(cleanup)); > - else > - /* For nonNUMA system, using node0 for cpuset.mems */ > - write_cpusets(0); > - > - overcommit = get_sys_tune("overcommit_memory"); > + /* > + * Not any nodes contains memory, so using get_allowed_nodes() > + * to get a memory node, the operation is also appropriate for > + * NonNUMA system. > + */ > + ret = get_allowed_nodes(NH_MEMS, 1, &memnode); > + if (ret < 0) > + tst_brkm(TBROK, NULL, "Got one memory node failed " > + "using get_allowed_nodes()"); > + write_cpusets(memnode); > } > > void cleanup(void) > -- > 1.7.11.7 > > > ------------------------------------------------------------------------------ > Try New Relic Now & We'll Send You this Cool Shirt > New Relic is the only SaaS-based application performance monitoring service > that delivers powerful full stack analytics. Optimize and monitor your > browser, app, & servers with just a few lines of code. Try New Relic > and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr > _______________________________________________ > Ltp-list mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/ltp-list > ------------------------------------------------------------------------------ Try New Relic Now & We'll Send You this Cool Shirt New Relic is the only SaaS-based application performance monitoring service that delivers powerful full stack analytics. Optimize and monitor your browser, app, & servers with just a few lines of code. Try New Relic and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
