<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Apr 22, 2020 at 6:47 PM Yang Xu <<a href="mailto:xuyang2018.jy@cn.fujitsu.com">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">Signed-off-by: Yang Xu <<a href="mailto:xuyang2018.jy@cn.fujitsu.com" target="_blank">xuyang2018.jy@cn.fujitsu.com</a>><br>
---<br>
 runtest/syscalls                           |   1 +<br>
 testcases/kernel/syscalls/pipe2/.gitignore |   1 +<br>
 testcases/kernel/syscalls/pipe2/pipe2_03.c | 172 +++++++++++++++++++++<br>
 3 files changed, 174 insertions(+)<br>
 create mode 100644 testcases/kernel/syscalls/pipe2/pipe2_03.c<br>
<br>
diff --git a/runtest/syscalls b/runtest/syscalls<br>
index 9bb72beb2..16add02d3 100644<br>
--- a/runtest/syscalls<br>
+++ b/runtest/syscalls<br>
@@ -916,6 +916,7 @@ pipe13 pipe13<br>
<br>
 pipe2_01 pipe2_01<br>
 pipe2_02 pipe2_02<br>
+pipe2_03 pipe2_03<br>
 pipe2_04 pipe2_04<br>
<br>
 pivot_root01 pivot_root01<br>
diff --git a/testcases/kernel/syscalls/pipe2/.gitignore b/testcases/kernel/syscalls/pipe2/.gitignore<br>
index 773450a48..ede1da65e 100644<br>
--- a/testcases/kernel/syscalls/pipe2/.gitignore<br>
+++ b/testcases/kernel/syscalls/pipe2/.gitignore<br>
@@ -1,3 +1,4 @@<br>
 /pipe2_01<br>
 /pipe2_02<br>
+/pipe2_03<br>
 /pipe2_04<br>
diff --git a/testcases/kernel/syscalls/pipe2/pipe2_03.c b/testcases/kernel/syscalls/pipe2/pipe2_03.c<br>
new file mode 100644<br>
index 000000000..0314f9eda<br>
--- /dev/null<br>
+++ b/testcases/kernel/syscalls/pipe2/pipe2_03.c<br>
@@ -0,0 +1,172 @@<br>
+// SPDX-License-Identifier: GPL-2.0-or-later<br>
+/*<br>
+ * Copyright (c) 2020 FUJITSU LIMITED. All rights reserved.<br>
+ * Author: Yang Xu <<a href="mailto:xuyang2018.jy@cn.fujitsu.com" target="_blank">xuyang2018.jy@cn.fujitsu.com</a>><br>
+ *<br>
+ * This case is designed to test the basic functionality about the<br>
+ * O_DIRECT flag of pipe2.<br>
+ *<br>
+ * It includes three sub tests.<br>
+ * 1) Each write(2) to the pipe is dealt with as a separate packet, and<br>
+ * read(2)s from the pipe will read one packet at a time.<br>
+ * 2) Writes of greater than PIPE_BUF bytes (see pipe(7)) will be split<br>
+ * into multiple packet.<br>
+ * 3)If a read(2) specifies a buffer size that is smaller than the next<br>
+ * packet, then the requested number of bytes are read, and the excess<br>
+ * bytes in the packet are discarded.<br>
+ */<br>
+#define _GNU_SOURCE<br>
+#include <stdio.h><br>
+#include <unistd.h><br>
+#include <stdlib.h><br>
+#include <linux/limits.h><br>
+#include "lapi/fcntl.h"<br>
+#include "tst_test.h"<br>
+<br>
+static int fds[2], packet_num, pipe_size;<br>
+static char *wrbuf;<br>
+static char *rdbuf;<br>
+static void check_peer_rw(void);<br>
+static void check_split(void);<br>
+static void check_discard(void);<br>
+<br>
+static void (*test_func[])(void) = {check_peer_rw, check_split, check_discard};<br>
+<br>
+static void check_peer_rw(void)<br>
+{<br>
+       int i, pid;<br>
+<br>
+       SAFE_PIPE2(fds, O_DIRECT | O_NONBLOCK);<br>
+<br>
+       pid = SAFE_FORK();<br>
+       if (!pid) {<br>
+               SAFE_CLOSE(fds[1]);<br>
+               memset(rdbuf, 0, pipe_size);<br>
+               TST_CHECKPOINT_WAIT(0);<br>
+               for (i = 0; i < packet_num; i++) {<br>
+                       TEST(SAFE_READ(0, fds[0], rdbuf, pipe_size));<br>
+                       if (TST_RET != 1)<br>
+                               tst_res(TFAIL,<br>
+                                       "Each read(2) doesn't read a separate packet, return %ld", TST_RET);<br>
+               }<br>
+               tst_res(TPASS, "Each read(2) reads a separate packet");<br>
+                _exit(0);<br>
+       }<br>
+<br>
+       SAFE_CLOSE(fds[0]);<br>
+       for (i = 0; i < packet_num; i++)<br>
+               SAFE_WRITE(1, fds[1], "x", 1);<br>
+<br></blockquote><div><br></div><div><div class="gmail_default" style="font-size:small">I got a failure on the ppc64le platform(page size: 65536kB).</div><div class="gmail_default" style="font-size:small"><br></div># ./pipe2_03 <br>tst_test.c:1246: INFO: Timeout per run is 0h 05m 00s<br>pipe_size = 1048576<br>PIPE_BUF = 4096<br>packet_num = 256<br>safe_macros.c:457: BROK: pipe2_03.c:58: write(4,0x1001d2b8,18446744073709551615) failed: EAGAIN/EWOULDBLOCK (11)<br><div class="gmail_default" style="font-size:small"></div></div></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div>Regards,<br></div><div>Li Wang<br></div></div></div></div>