Message ID | 20220914015147.3071025-6-tan.shaopeng@jp.fujitsu.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | selftests/resctrl: Some improvements of resctrl selftest | expand |
Hi Shaopeng, On 9/13/2022 6:51 PM, Shaopeng Tan wrote: ... > @@ -218,11 +219,11 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type) > } > } > close(pipefd[0]); > - kill(bm_pid, SIGKILL); > } > > - if (bm_pid) > - umount_resctrlfs(); > +out: > + kill(bm_pid, SIGKILL); > + umount_resctrlfs(); > From what I can tell both parent and child will now run this code. So both will attempt to unmount resctrl fs and the child will attempt to kill PID 0? Reinette
Hi Reinette, > On 9/13/2022 6:51 PM, Shaopeng Tan wrote: > > ... > > > @@ -218,11 +219,11 @@ int cat_perf_miss_val(int cpu_no, int n, char > *cache_type) > > } > > } > > close(pipefd[0]); > > - kill(bm_pid, SIGKILL); > > } > > > > - if (bm_pid) > > - umount_resctrlfs(); > > +out: > > + kill(bm_pid, SIGKILL); > > + umount_resctrlfs(); > > > > From what I can tell both parent and child will now run this code. So both will > attempt to unmount resctrl fs and the child will attempt to kill PID 0? Thanks for your advice. There are problems as you point out. I think it is complicated if we fix this bug like MBM/MBA/CMT test using sigaction(). It seems this bug cannot be solved easily. Please give me some time. Best Regards, Shaopeng
diff --git a/tools/testing/selftests/resctrl/cat_test.c b/tools/testing/selftests/resctrl/cat_test.c index d1134f66469f..f62da445acbb 100644 --- a/tools/testing/selftests/resctrl/cat_test.c +++ b/tools/testing/selftests/resctrl/cat_test.c @@ -186,11 +186,11 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type) ret = cat_val(¶m); if (ret) - return ret; + goto out; ret = check_results(¶m); if (ret) - return ret; + goto out; if (bm_pid == 0) { /* Tell parent that child is ready */ @@ -200,7 +200,8 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type) sizeof(pipe_message)) { close(pipefd[1]); perror("# failed signaling parent process"); - return errno; + ret = errno; + goto out; } close(pipefd[1]); @@ -218,11 +219,11 @@ int cat_perf_miss_val(int cpu_no, int n, char *cache_type) } } close(pipefd[0]); - kill(bm_pid, SIGKILL); } - if (bm_pid) - umount_resctrlfs(); +out: + kill(bm_pid, SIGKILL); + umount_resctrlfs(); - return 0; + return ret; }
After creating a child process with fork() in CAT test, if there is an exception occurs, the parent process will be terminated immediately, but the child process will not be killed and umount_resctrlfs() will not be called. When fork() is used in CMT/MBA/MBM tests. If an exception occurs, before parent process exiting, the child process is killed and umount_resctrlfs() is called. Kill the child process before exiting the parent process if an exception occurs in CAT test, like in CMT/MBA/MBM tests. Signed-off-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com> --- tools/testing/selftests/resctrl/cat_test.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)