On 05/06/2013 04:55 PM, Zhouping Liu wrote:
> Hi Cyril and Wanlong,
> 
> any comments for this patch?

Sorry for the late reply.

Acked-by: Wanlong Gao <[email protected]>


> 
> ----- Original Message -----
>> From: "Zhouping Liu" <[email protected]>
>> To: "LTP List" <[email protected]>
>> Sent: Monday, April 29, 2013 2:07:17 PM
>> Subject: [LTP] [PATCH v3] 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 an independent node, which caused the
>> sub-cpuset cgroup to only contain CPUs or memory in one node, but
>> that's not permitted in the scenario described above.
>>
>> Signed-off-by: Zhouping Liu <[email protected]>
>> Reviewed-by: Caspar Zhang <[email protected]>
>> ---
>> Change log:
>>  v1 - v2:
>>     fixed some grammar errors, and updated some comments.
>>  v2 - v3:
>>     amended some comment messages.
>>
>>  testcases/kernel/mem/lib/mem.c   | 13 ++++++++++++-
>>  testcases/kernel/mem/oom/oom04.c | 20 ++++++++++++++------
>>  testcases/kernel/mem/oom/oom05.c | 26 ++++++++++++++++----------
>>  3 files changed, 42 insertions(+), 17 deletions(-)
>>
>> diff --git a/testcases/kernel/mem/lib/mem.c b/testcases/kernel/mem/lib/mem.c
>> index 5397177..1232b4f 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 doesn't contain any CPUs,
>> +     * the first ID of CPU '0' will be used as
>> +     * the value of cpuset.cpus.
>> +     */
>> +    if (strlen(cpus) != 0) {
>> +            write_cpuset_files(CPATH_NEW, "cpus", cpus);
>> +    } else {
>> +            tst_resm(TINFO, "No CPUs in the node%ld; "
>> +                            "using only CPU0", nd);
>> +            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..ac48c36 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,18 @@ 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);
>> +
>> +    /*
>> +     * Some nodes do not contain memory, so use
>> +     * get_allowed_nodes(NH_MEMS) to get a memory
>> +     * node. This operation also applies to Non-NUMA
>> +     * systems.
>> +     */
>> +    ret = get_allowed_nodes(NH_MEMS, 1, &memnode);
>> +    if (ret < 0)
>> +            tst_brkm(TBROK, NULL, "Failed to get a memory node "
>> +                                  "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..545b5f0 100644
>> --- a/testcases/kernel/mem/oom/oom05.c
>> +++ b/testcases/kernel/mem/oom/oom05.c
>> @@ -108,24 +108,30 @@ 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");
>> +    /*
>> +     * Some nodes do not contain memory, so use
>> +     * get_allowed_nodes(NH_MEMS) to get a memory
>> +     * node. This operation also applies to Non-NUMA
>> +     * systems.
>> +     */
>> +    ret = get_allowed_nodes(NH_MEMS, 1, &memnode);
>> +    if (ret < 0)
>> +            tst_brkm(TBROK, NULL, "Failed to get a memory node "
>> +                                  "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
>>
> 


------------------------------------------------------------------------------
Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET
Get 100% visibility into your production application - at no cost.
Code-level diagnostics for performance bottlenecks with <2% overhead
Download for free and get started troubleshooting in minutes.
http://p.sf.net/sfu/appdyn_d2d_ap1
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to