currently percpu process array is set to 2, which results in segfault
Signed-off-by: Sanjay Singh Rawat sanjay.rawat@linaro.org --- cpuidle/cpuidle_killer.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/cpuidle/cpuidle_killer.c b/cpuidle/cpuidle_killer.c index 5e7320f..09009ef 100644 --- a/cpuidle/cpuidle_killer.c +++ b/cpuidle/cpuidle_killer.c @@ -104,7 +104,7 @@ int main(int argc, char *argv[]) { int ret, i, nrcpus = 2; int nrsleeps, delay; - pid_t pids[nrcpus]; + pid_t *pids; struct timex timex = { 0 };
if (adjtimex(&timex) < 0) { @@ -121,6 +121,11 @@ int main(int argc, char *argv[]) }
fprintf(stderr, "found %d cpu(s)\n", nrcpus); + pids = (pid_t *) calloc(nrcpus, sizeof(pid_t)); + if (pids == NULL) { + fprintf(stderr, "error: calloc failed\n"); + return 1; + }
for (i = 0; i < nrcpus; i++) {
Hello,
I would like to share two observations -
1. Is it necessary to initialize nrcpus = 2 anymore?
2. Another problem may happen in the code below where waitpid is called -
for (i = 0; i < nrcpus; i++) { int status;
waitpid(pids[i], &status, 0); if (status != 0) { fprintf(stderr, "test for cpu %d has failed\n", i); ret = 1; } }
Since for offline cpus, no child process is created, now these cpus pid[i]'s will be zero (due to calloc). This will change the meaning of waitpid function as man page says -
pid 0 - meaning wait for any child process whose process group ID is equal to that of the calling process.
I think a check should be added before waitpid call -
if (pids[i] != 0) waitpid(pids[i], &status, 0);
-- Thanks, -Meraj
On Wed, Apr 30, 2014 at 11:08 AM, Sanjay Singh Rawat < sanjay.rawat@linaro.org> wrote:
currently percpu process array is set to 2, which results in segfault
Signed-off-by: Sanjay Singh Rawat sanjay.rawat@linaro.org
cpuidle/cpuidle_killer.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/cpuidle/cpuidle_killer.c b/cpuidle/cpuidle_killer.c index 5e7320f..09009ef 100644 --- a/cpuidle/cpuidle_killer.c +++ b/cpuidle/cpuidle_killer.c @@ -104,7 +104,7 @@ int main(int argc, char *argv[]) { int ret, i, nrcpus = 2; int nrsleeps, delay;
pid_t pids[nrcpus];
pid_t *pids; struct timex timex = { 0 }; if (adjtimex(&timex) < 0) {
@@ -121,6 +121,11 @@ int main(int argc, char *argv[]) }
fprintf(stderr, "found %d cpu(s)\n", nrcpus);
pids = (pid_t *) calloc(nrcpus, sizeof(pid_t));
if (pids == NULL) {
fprintf(stderr, "error: calloc failed\n");
return 1;
} for (i = 0; i < nrcpus; i++) {
-- 1.7.10.4
linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev
On Wednesday 30 April 2014 12:14 PM, Mohammad Merajul Islam Molla wrote:
Hello,
I would like to share two observations -
- Is it necessary to initialize nrcpus = 2 anymore?
thanks, ack
- Another problem may happen in the code below where waitpid is called -
for (i = 0; i < nrcpus; i++) { int status;
waitpid(pids[i], &status, 0); if (status != 0) { fprintf(stderr, "test for cpu %d has failed\n", i); ret = 1; } } Since for offline cpus, no child process is created, now these cpus
pid[i]'s will be zero (due to calloc). This will change the meaning of waitpid function as man page says -
pid 0 - meaning wait for any child process whose process group
ID is equal to that of the calling process.
I think a check should be added before waitpid call -
if (pids[i] != 0) waitpid(pids[i], &status, 0);
Here Parent will not wait for child infinitely if status is not visible, the option argument is 0(NOHANG). I will add the macro for readability. thanks
-- Thanks, -Meraj
On Wed, Apr 30, 2014 at 11:08 AM, Sanjay Singh Rawat <sanjay.rawat@linaro.org mailto:sanjay.rawat@linaro.org> wrote:
currently percpu process array is set to 2, which results in segfault Signed-off-by: Sanjay Singh Rawat <sanjay.rawat@linaro.org <mailto:sanjay.rawat@linaro.org>> --- cpuidle/cpuidle_killer.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cpuidle/cpuidle_killer.c b/cpuidle/cpuidle_killer.c index 5e7320f..09009ef 100644 --- a/cpuidle/cpuidle_killer.c +++ b/cpuidle/cpuidle_killer.c @@ -104,7 +104,7 @@ int main(int argc, char *argv[]) { int ret, i, nrcpus = 2; int nrsleeps, delay; - pid_t pids[nrcpus]; + pid_t *pids; struct timex timex = { 0 }; if (adjtimex(&timex) < 0) { @@ -121,6 +121,11 @@ int main(int argc, char *argv[]) } fprintf(stderr, "found %d cpu(s)\n", nrcpus); + pids = (pid_t *) calloc(nrcpus, sizeof(pid_t)); + if (pids == NULL) { + fprintf(stderr, "error: calloc failed\n"); + return 1; + } for (i = 0; i < nrcpus; i++) { -- 1.7.10.4 _______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org <mailto:linaro-dev@lists.linaro.org> http://lists.linaro.org/mailman/listinfo/linaro-dev
Hello Sanjay,
As far I know, if option argument is 0, the parent will wait for specified child pid to terminate, its not for immediate return as in case of WNOHANG. This is probably the intended use of the code (author will be able to confirm). Changing 0 to WNOHANG macro will change the meaning of the code.
Also, from header file -
#define WNOHANG 0x00000001 WNOHANG is defined as 1, not zero.
Which makes me think of two cases below -
1. If the real intended purpose is to not to wait infinitely, replacing 0 with WNOHANG macro will do. 2. But if the real intended purpose is to wait infinitely, then the solution I proposed earlier should be real fix, i.e., if (pids[i] != 0) waitpid(pids[i], &status, 0); [ and keeping options argument as 0]
-- Thanks, -Meraj
On Wed, Apr 30, 2014 at 1:25 PM, Sanjay Singh Rawat <sanjay.rawat@linaro.org
wrote:
On Wednesday 30 April 2014 12:14 PM, Mohammad Merajul Islam Molla wrote:
Hello,
I would like to share two observations -
- Is it necessary to initialize nrcpus = 2 anymore?
thanks, ack
- Another problem may happen in the code below where waitpid is called -
for (i = 0; i < nrcpus; i++) { int status;
waitpid(pids[i], &status, 0); if (status != 0) { fprintf(stderr, "test for cpu %d has failed\n",
i); ret = 1; } }
Since for offline cpus, no child process is created, now these cpus
pid[i]'s will be zero (due to calloc). This will change the meaning of waitpid function as man page says -
pid 0 - meaning wait for any child process whose process group
ID is equal to that of the calling process.
I think a check should be added before waitpid call -
if (pids[i] != 0) waitpid(pids[i], &status, 0);
Here Parent will not wait for child infinitely if status is not visible, the option argument is 0(NOHANG). I will add the macro for readability. thanks
-- Thanks, -Meraj
On Wed, Apr 30, 2014 at 11:08 AM, Sanjay Singh Rawat <sanjay.rawat@linaro.org mailto:sanjay.rawat@linaro.org> wrote:
currently percpu process array is set to 2, which results in segfault Signed-off-by: Sanjay Singh Rawat <sanjay.rawat@linaro.org <mailto:sanjay.rawat@linaro.org>> --- cpuidle/cpuidle_killer.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cpuidle/cpuidle_killer.c b/cpuidle/cpuidle_killer.c index 5e7320f..09009ef 100644 --- a/cpuidle/cpuidle_killer.c +++ b/cpuidle/cpuidle_killer.c @@ -104,7 +104,7 @@ int main(int argc, char *argv[]) { int ret, i, nrcpus = 2; int nrsleeps, delay; - pid_t pids[nrcpus]; + pid_t *pids; struct timex timex = { 0 }; if (adjtimex(&timex) < 0) { @@ -121,6 +121,11 @@ int main(int argc, char *argv[]) } fprintf(stderr, "found %d cpu(s)\n", nrcpus); + pids = (pid_t *) calloc(nrcpus, sizeof(pid_t)); + if (pids == NULL) { + fprintf(stderr, "error: calloc failed\n"); + return 1; + } for (i = 0; i < nrcpus; i++) { -- 1.7.10.4 _______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org <mailto:linaro-dev@lists.linaro.org> http://lists.linaro.org/mailman/listinfo/linaro-dev
-- sanjay
On 04/30/2014 10:34 AM, Mohammad Merajul Islam Molla wrote:
Hello Sanjay, As far I know, if option argument is 0, the parent will wait for specified child pid to terminate, its not for immediate return as in case of WNOHANG. This is probably the intended use of the code (author will be able to confirm). Changing 0 to WNOHANG macro will change the meaning of the code.
Right.
Also, from header file - #define WNOHANG 0x00000001 WNOHANG is defined as 1, not zero. Which makes me think of two cases below -
- If the real intended purpose is to not to wait infinitely, replacing
0 with WNOHANG macro will do. 2. But if the real intended purpose is to wait infinitely, then the solution I proposed earlier should be real fix, i.e., if (pids[i] != 0) waitpid(pids[i], &status, 0); [ and keeping options argument as 0] --
There is an alternative if you want to simplify the code.
Instead of using nrcpus and waitpid, use *wait*.
for (;;) { pid_t pid = wait(&status);
if (pid < 0 && errno == ECHILD) break;
if (status != 0) fprintf(stderr, "blabla \n"); }
Thanks, -Meraj
On Wed, Apr 30, 2014 at 1:25 PM, Sanjay Singh Rawat <sanjay.rawat@linaro.org mailto:sanjay.rawat@linaro.org> wrote:
On Wednesday 30 April 2014 12:14 PM, Mohammad Merajul Islam Molla wrote: Hello, I would like to share two observations - 1. Is it necessary to initialize nrcpus = 2 anymore? thanks, ack 2. Another problem may happen in the code below where waitpid is called - for (i = 0; i < nrcpus; i++) { int status; waitpid(pids[i], &status, 0); if (status != 0) { fprintf(stderr, "test for cpu %d has failed\n", i); ret = 1; } } Since for offline cpus, no child process is created, now these cpus pid[i]'s will be zero (due to calloc). This will change the meaning of waitpid function as man page says - pid 0 - meaning wait for any child process whose process group ID is equal to that of the calling process. I think a check should be added before waitpid call - if (pids[i] != 0) waitpid(pids[i], &status, 0); Here Parent will not wait for child infinitely if status is not visible, the option argument is 0(NOHANG). I will add the macro for readability. thanks -- Thanks, -Meraj On Wed, Apr 30, 2014 at 11:08 AM, Sanjay Singh Rawat <sanjay.rawat@linaro.org <mailto:sanjay.rawat@linaro.org> <mailto:sanjay.rawat@linaro.__org <mailto:sanjay.rawat@linaro.org>>> wrote: currently percpu process array is set to 2, which results in segfault Signed-off-by: Sanjay Singh Rawat <sanjay.rawat@linaro.org <mailto:sanjay.rawat@linaro.org> <mailto:sanjay.rawat@linaro.__org <mailto:sanjay.rawat@linaro.org>>> --- cpuidle/cpuidle_killer.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cpuidle/cpuidle_killer.c b/cpuidle/cpuidle_killer.c index 5e7320f..09009ef 100644 --- a/cpuidle/cpuidle_killer.c +++ b/cpuidle/cpuidle_killer.c @@ -104,7 +104,7 @@ int main(int argc, char *argv[]) { int ret, i, nrcpus = 2; int nrsleeps, delay; - pid_t pids[nrcpus]; + pid_t *pids; struct timex timex = { 0 }; if (adjtimex(&timex) < 0) { @@ -121,6 +121,11 @@ int main(int argc, char *argv[]) } fprintf(stderr, "found %d cpu(s)\n", nrcpus); + pids = (pid_t *) calloc(nrcpus, sizeof(pid_t)); + if (pids == NULL) { + fprintf(stderr, "error: calloc failed\n"); + return 1; + } for (i = 0; i < nrcpus; i++) { -- 1.7.10.4 _________________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org <mailto:linaro-dev@lists.linaro.org> <mailto:linaro-dev@lists.__linaro.org <mailto:linaro-dev@lists.linaro.org>> http://lists.linaro.org/__mailman/listinfo/linaro-dev <http://lists.linaro.org/mailman/listinfo/linaro-dev> -- sanjay
On Wednesday 30 April 2014 02:04 PM, Mohammad Merajul Islam Molla wrote:
Hello Sanjay, As far I know, if option argument is 0, the parent will wait for
Looks like waiting is done if childs exit. I checked for the offlined CPU case, if there are no child processes, waitpid returns -1. Setting errno as "no child processes"
specified child pid to terminate, its not for immediate return as in case of WNOHANG. This is probably the intended use of the code (author will be able to confirm). Changing 0 to WNOHANG macro will change the meaning of the code. Also, from header file - #define WNOHANG 0x00000001
sorry i referred wrong document
WNOHANG is defined as 1, not zero. Which makes me think of two cases below -
- If the real intended purpose is to not to wait infinitely, replacing
[...]
Hello Sanjay,
One suggestion - its probably better to precede the output lines with cpu no. As currently output from child processes are intermixed as below and difficult to co-relate.
jiffies are : 10000 usecs found 4 cpu(s) duration: 120 secs, #sleep: 1200, delay: 100000 us duration: 120 secs, #sleep: 1200, delay: 100000 us duration: 120 secs, #sleep: 1200, delay: 100000 us duration: 120 secs, #sleep: 1200, delay: 100000 us counter value 4072718528 test duration: 120.057526 secs deviation 0.000479 counter value 3914063589 test duration: 120.057335 secs counter value 4015937716 test duration: 120.057430 secs deviation 0.000479 deviation 0.000478 counter value 411037603 test duration: 120.062716 secs deviation 0.000523
-- Thanks, -Meraj
On Fri, May 2, 2014 at 11:23 PM, Sanjay Singh Rawat <sanjay.rawat@linaro.org
wrote:
On Wednesday 30 April 2014 02:04 PM, Mohammad Merajul Islam Molla wrote:
Hello Sanjay, As far I know, if option argument is 0, the parent will wait for
Looks like waiting is done if childs exit. I checked for the offlined CPU case, if there are no child processes, waitpid returns -1. Setting errno as "no child processes"
specified child pid to terminate, its not for immediate return as in
case of WNOHANG. This is probably the intended use of the code (author will be able to confirm). Changing 0 to WNOHANG macro will change the meaning of the code. Also, from header file - #define WNOHANG 0x00000001
sorry i referred wrong document
WNOHANG is defined as 1, not zero.
Which makes me think of two cases below -
- If the real intended purpose is to not to wait infinitely, replacing
[...]
On Wednesday 07 May 2014 03:34 PM, Mohammad Merajul Islam Molla wrote:
Hello Sanjay,
One suggestion - its probably better to precede the output lines with cpu no. As currently output from child processes are intermixed as below and difficult to co-relate.
jiffies are : 10000 usecs found 4 cpu(s) duration: 120 secs, #sleep: 1200, delay: 100000 us duration: 120 secs, #sleep: 1200, delay: 100000 us duration: 120 secs, #sleep: 1200, delay: 100000 us duration: 120 secs, #sleep: 1200, delay: 100000 us counter value 4072718528 test duration: 120.057526 secs deviation 0.000479 counter value 3914063589 test duration: 120.057335 secs counter value 4015937716 test duration: 120.057430 secs deviation 0.000479 deviation 0.000478 counter value 411037603 test duration: 120.062716 secs deviation 0.000523
thanks Meraj, done
-- Thanks, -Meraj
On Fri, May 2, 2014 at 11:23 PM, Sanjay Singh Rawat <sanjay.rawat@linaro.org mailto:sanjay.rawat@linaro.org> wrote:
On Wednesday 30 April 2014 02:04 PM, Mohammad Merajul Islam Molla wrote: Hello Sanjay, As far I know, if option argument is 0, the parent will wait for Looks like waiting is done if childs exit. I checked for the offlined CPU case, if there are no child processes, waitpid returns -1. Setting errno as "no child processes" specified child pid to terminate, its not for immediate return as in case of WNOHANG. This is probably the intended use of the code (author will be able to confirm). Changing 0 to WNOHANG macro will change the meaning of the code. Also, from header file - #define WNOHANG 0x00000001 sorry i referred wrong document WNOHANG is defined as 1, not zero. Which makes me think of two cases below - 1. If the real intended purpose is to not to wait infinitely, replacing [...]
Hello Sanjay,
You are welcome.
Earlier I submitted some patches in powedebug and powertop tools. Please feel free to merge if you find any useful.
http://lists.linaro.org/pipermail/linaro-dev/2014-April/017117.html http://lists.linaro.org/pipermail/linaro-dev/2014-May/017141.html http://lists.linaro.org/pipermail/linaro-dev/2014-May/017144.html http://lists.linaro.org/pipermail/linaro-dev/2014-May/017146.html
-- Thanks, -Meraj
Mohammad Merajul Islam Molla (Meraj) Mobile Lab 1, Mobile Development Team Samsung R&D Institute Bangladesh (SRBD) Phone: +880-1754380207 Skype: mmm2177
On Mon, May 12, 2014 at 4:27 PM, Sanjay Singh Rawat <sanjay.rawat@linaro.org
wrote:
On Wednesday 07 May 2014 03:34 PM, Mohammad Merajul Islam Molla wrote:
Hello Sanjay,
One suggestion - its probably better to precede the output lines with cpu no. As currently output from child processes are intermixed as below and difficult to co-relate.
jiffies are : 10000 usecs found 4 cpu(s) duration: 120 secs, #sleep: 1200, delay: 100000 us duration: 120 secs, #sleep: 1200, delay: 100000 us duration: 120 secs, #sleep: 1200, delay: 100000 us duration: 120 secs, #sleep: 1200, delay: 100000 us counter value 4072718528 test duration: 120.057526 secs deviation 0.000479 counter value 3914063589 test duration: 120.057335 secs counter value 4015937716 test duration: 120.057430 secs deviation 0.000479 deviation 0.000478 counter value 411037603 test duration: 120.062716 secs deviation 0.000523
thanks Meraj, done
-- Thanks, -Meraj
On Fri, May 2, 2014 at 11:23 PM, Sanjay Singh Rawat <sanjay.rawat@linaro.org mailto:sanjay.rawat@linaro.org> wrote:
On Wednesday 30 April 2014 02:04 PM, Mohammad Merajul Islam Molla
wrote:
Hello Sanjay, As far I know, if option argument is 0, the parent will wait for Looks like waiting is done if childs exit. I checked for the offlined CPU case, if there are no child processes, waitpid returns -1. Setting errno as "no child processes" specified child pid to terminate, its not for immediate return as
in case of WNOHANG. This is probably the intended use of the code (author will be able to confirm). Changing 0 to WNOHANG macro will change the meaning of the code. Also, from header file - #define WNOHANG 0x00000001
sorry i referred wrong document WNOHANG is defined as 1, not zero. Which makes me think of two cases below - 1. If the real intended purpose is to not to wait infinitely, replacing [...]
-- sanjay