<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small">Xu,</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Apr 21, 2020 at 6:24 PM Yang Xu <<a href="mailto:xuyang2018.jy@cn.fujitsu.com" target="_blank">xuyang2018.jy@cn.fujitsu.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail_default" style="font-size:small">...</span><br>
> <br>
>     +       if (pid == 0) {<br>
>     +               (*test_func[n])();<br>
> <br>
>     +               tst_reap_children();<br>
>     +               SAFE_CLOSE(fds[0]);<br>
>     +               SAFE_CLOSE(fds[1]);<br>
> <br>
> <br>
> I tend to move the cloese(fd) to the test process to nearby pipe2(). <br>
> Otherwise, it causes an unclear error like:<br>
> <br>
> # ./pipe2_03<br>
> tst_test.c:1246: INFO: Timeout per run is 0h 05m 00s<br>
> pipe2_03.c:48: PASS: Each write(2) uses a separate packet<br>
> pipe2_03.c:61: PASS: Each read(2) reads a separate packet<br>
> pipe2_03.c:81: PASS: write(higner than PIPE_BUF) split into multiple packet<br>
> pipe2_03.c:108: FAIL: the excess bytes in the packet is discarded by <br>
> read, expect 1 got 1%A<br>
Even I use one fork and exit(0), I don't meet this problem. Or, I miss <br>
something?<br></blockquote><div><br></div><div><div class="gmail_default" style="font-size:small">My test env is kernel-5.7.0-rc1+ x86_64, I haven't figured out why the read() get more words from the pipe, but the error has gone one I move the safe_close(fd) part to the test main process. </div></div><div class="gmail_default" style="font-size:small"><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
--- a/testcases/kernel/syscalls/pipe2/pipe2_03.c<br>
+++ b/testcases/kernel/syscalls/pipe2/pipe2_03.c<br>
@@ -59,6 +59,7 @@ static void check_peer_rw(void)<br>
                                         "Each read(2) doesn't read a <br>
separate packet, return %ld", TST_RET);<br>
                 }<br>
                 tst_res(TPASS, "Each read(2) reads a separate packet");<br>
+                _exit(0);<br>
         }<br>
  }<br>
<br>
@@ -79,6 +80,7 @@ static void check_split(void)<br>
                                         "write(higner than PIPE_BUF) <br>
split into multiple packet, return %ld", TST_RET);<br>
                 }<br>
                 tst_res(TPASS, "write(higner than PIPE_BUF) split into <br>
multiple packet");<br>
+                _exit(0);<br>
         }<br>
  }<br>
<br>
@@ -107,21 +109,17 @@ static void check_discard(void)<br>
                                 tst_res(TFAIL,<br>
                                         "the excess bytes in the packet <br>
is discarded by read, expect 1 got %s", tmp_secondbuf);<br>
                 }<br>
+                _exit(0);<br>
         }<br>
  }<br>
<br>
  static void verify_pipe2(unsigned int n)<br>
  {<br>
-       int pid;<br>
-<br>
-       pid = SAFE_FORK();<br>
-       if (pid == 0) {<br>
-               (*test_func[n])();<br>
-               tst_reap_children();<br>
-               SAFE_CLOSE(fds[0]);<br>
-               SAFE_CLOSE(fds[1]);<br>
-       }<br>
+      <span class="gmail_default" style="font-size:small"></span> (*test_func[n])();<br>
+       SAFE_CLOSE(fds[0]);<br>
+       SAFE_CLOSE(fds[1]);<br>
         tst_reap_children();<br></blockquote><div><br></div><div><div class="gmail_default" style="font-size:small">In my opinion, it is not a good habit to wait for children's status after the test function, we'd better do that at the behind of fork() in the test main process. I'd only keep the <span class="gmail_default"></span> (*test_func[n])(); in this verify_pipe2() but no more else.</div></div><div> </div></div>-- <br><div dir="ltr"><div dir="ltr"><div>Regards,<br></div><div>Li Wang<br></div></div></div></div>