Linux Test Project
 help / color / mirror / Atom feed
* [LTP] [PATCH v4 1/2] syscalls/splice04: add test for splice() from pipe to pipe
@ 2017-05-12  9:14 bxue
  2017-05-12  9:14 ` [LTP] [PATCH v4 2/2] syscalls/splice05: add test for splice() between pipe and socket bxue
  2017-05-19 14:25 ` [LTP] [PATCH v4 1/2] syscalls/splice04: add test for splice() from pipe to pipe Cyril Hrubis
  0 siblings, 2 replies; 5+ messages in thread
From: bxue @ 2017-05-12  9:14 UTC (permalink / raw)
  To: ltp

From: Boyang Xue <bxue@redhat.com>

This test case covers pipe to pipe splice operation, which was introduced
in kernel commit 7c77f0b3f920 ("splice: implement pipe to pipe splicing").

Signed-off-by: Boyang Xue <bxue@redhat.com>
---
 runtest/syscalls                            |   1 +
 testcases/kernel/syscalls/.gitignore        |   1 +
 testcases/kernel/syscalls/splice/splice04.c | 106 ++++++++++++++++++++++++++++
 3 files changed, 108 insertions(+)
 create mode 100644 testcases/kernel/syscalls/splice/splice04.c

diff --git a/runtest/syscalls b/runtest/syscalls
index 5909456..d6c9ab4 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1224,6 +1224,7 @@ sockioctl01 sockioctl01
 splice01 splice01
 splice02 seq 1 20000 | splice02 splice02-temp
 splice03 splice03
+splice04 splice04
 
 tee01 tee01
 tee02 tee02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index d5985cd..92ddbbe 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -976,6 +976,7 @@
 /splice/splice01
 /splice/splice02
 /splice/splice03
+/splice/splice04
 /ssetmask/ssetmask01
 /stat/stat01
 /stat/stat01_64
diff --git a/testcases/kernel/syscalls/splice/splice04.c b/testcases/kernel/syscalls/splice/splice04.c
new file mode 100644
index 0000000..4fd8226
--- /dev/null
+++ b/testcases/kernel/syscalls/splice/splice04.c
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2017 Red Hat, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Boyang Xue <bxue@redhat.com>
+ */
+
+/*
+ * Functional test for splice(2): pipe to pipe
+ *
+ * This test case tests splice(2) from a pipe to another
+ */
+
+#define _GNU_SOURCE
+#include <fcntl.h>
+#include <stdlib.h>
+#include "tst_test.h"
+
+#define PIPE_MAX (64*1024)
+
+static char *str_len_data;
+static int num_len_data = PIPE_MAX;
+static char *arr_in, *arr_out;
+
+static struct tst_option options[] = {
+	{"l:", &str_len_data, "-l <num> Length of test data (in bytes)"},
+	{NULL, NULL, NULL},
+};
+
+static void setup(void)
+{
+	int i, pipe_max_unpriv, pipe_limit;
+
+	SAFE_FILE_SCANF("/proc/sys/fs/pipe-max-size", "%d", &pipe_max_unpriv);
+	pipe_limit = pipe_max_unpriv < num_len_data ? pipe_max_unpriv :
+		num_len_data;
+	num_len_data = pipe_limit;
+
+	if (tst_parse_int(str_len_data, &num_len_data, 1, pipe_limit))
+		tst_brk(TBROK, "Invalid length of data: '%s', "
+			"valid value: [1, %d]", str_len_data, pipe_limit);
+	tst_res(TINFO, "splice size = %d", num_len_data);
+	arr_in = SAFE_MALLOC(num_len_data);
+	arr_out = SAFE_MALLOC(num_len_data);
+	for (i = 0; i < num_len_data; i++)
+		arr_in[i] = i & 0xff;
+}
+
+static void cleanup(void)
+{
+	free(arr_in);
+	free(arr_out);
+}
+
+static void pipe_pipe(void)
+{
+	int pp1[2], pp2[2], i, ret;
+
+	SAFE_PIPE(pp1);
+	SAFE_PIPE(pp2);
+	SAFE_WRITE(1, pp1[1], arr_in, num_len_data);
+	for (i = 0; i < num_len_data; i++) {
+		ret = splice(pp1[0], NULL, pp2[1], NULL, 1, SPLICE_F_MOVE);
+		if (ret == -1) {
+			tst_res(TFAIL | TERRNO, "splice error");
+			goto exit;
+		}
+		SAFE_READ(1, pp2[0], arr_out + i, 1);
+	}
+
+	for (i = 0; i < num_len_data; i++) {
+		if (arr_in[i] != arr_out[i]) {
+			tst_res(TFAIL, "wrong data@%d: expected: %d, "
+				"actual: %d", i, arr_in[i], arr_out[i]);
+			goto exit;
+		}
+	}
+	tst_res(TPASS, "splice(2) from pipe to pipe run pass.");
+
+exit:
+	SAFE_CLOSE(pp1[1]);
+	SAFE_CLOSE(pp1[0]);
+	SAFE_CLOSE(pp2[1]);
+	SAFE_CLOSE(pp2[0]);
+}
+
+static struct tst_test test = {
+	.tid = "splice04",
+	.test_all = pipe_pipe,
+	.setup = setup,
+	.cleanup = cleanup,
+	.options = options,
+	.min_kver = "2.6.31"
+};
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [LTP] [PATCH v4 2/2] syscalls/splice05: add test for splice() between pipe and socket
  2017-05-12  9:14 [LTP] [PATCH v4 1/2] syscalls/splice04: add test for splice() from pipe to pipe bxue
@ 2017-05-12  9:14 ` bxue
  2017-05-19 14:27   ` Cyril Hrubis
  2017-05-19 14:25 ` [LTP] [PATCH v4 1/2] syscalls/splice04: add test for splice() from pipe to pipe Cyril Hrubis
  1 sibling, 1 reply; 5+ messages in thread
From: bxue @ 2017-05-12  9:14 UTC (permalink / raw)
  To: ltp

From: Boyang Xue <bxue@redhat.com>

This test case covers splice operation between pipe and socket.

Signed-off-by: Boyang Xue <bxue@redhat.com>
---
 runtest/syscalls                            |   1 +
 testcases/kernel/syscalls/.gitignore        |   1 +
 testcases/kernel/syscalls/splice/splice05.c | 122 ++++++++++++++++++++++++++++
 3 files changed, 124 insertions(+)
 create mode 100644 testcases/kernel/syscalls/splice/splice05.c

diff --git a/runtest/syscalls b/runtest/syscalls
index d6c9ab4..0fae11a 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1225,6 +1225,7 @@ splice01 splice01
 splice02 seq 1 20000 | splice02 splice02-temp
 splice03 splice03
 splice04 splice04
+splice05 splice05
 
 tee01 tee01
 tee02 tee02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index 92ddbbe..604730f 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -977,6 +977,7 @@
 /splice/splice02
 /splice/splice03
 /splice/splice04
+/splice/splice05
 /ssetmask/ssetmask01
 /stat/stat01
 /stat/stat01_64
diff --git a/testcases/kernel/syscalls/splice/splice05.c b/testcases/kernel/syscalls/splice/splice05.c
new file mode 100644
index 0000000..ea6ca7c
--- /dev/null
+++ b/testcases/kernel/syscalls/splice/splice05.c
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2017 Red Hat, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Boyang Xue <bxue@redhat.com>
+ */
+
+/*
+ * Functional test for splice(2): pipe <-> socket
+ *
+ * This test case tests splice(2) from a pipe to a socket and vice versa
+ */
+
+#define _GNU_SOURCE
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "tst_test.h"
+
+#define PIPE_MAX (64*1024)
+
+static char *str_len_data;
+static int num_len_data = PIPE_MAX;
+static char *arr_in, *arr_out;
+
+static struct tst_option options[] = {
+	{"l:", &str_len_data, "-l <num> Length of test data (in bytes)"},
+	{NULL, NULL, NULL},
+};
+
+static void setup(void)
+{
+	int i, pipe_max_unpriv, pipe_limit;
+
+	SAFE_FILE_SCANF("/proc/sys/fs/pipe-max-size", "%d", &pipe_max_unpriv);
+	pipe_limit = pipe_max_unpriv < num_len_data ? pipe_max_unpriv :
+		num_len_data;
+	num_len_data = pipe_limit;
+
+	if (tst_parse_int(str_len_data, &num_len_data, 1, pipe_limit))
+		tst_brk(TBROK, "Invalid length of data: '%s', "
+			"valid value: [1, %d]", str_len_data, pipe_limit);
+	tst_res(TINFO, "splice size = %d", num_len_data);
+	arr_in = SAFE_MALLOC(num_len_data);
+	arr_out = SAFE_MALLOC(num_len_data);
+	for (i = 0; i < num_len_data; i++)
+		arr_in[i] = i & 0xff;
+
+}
+
+static void cleanup(void)
+{
+	free(arr_in);
+	free(arr_out);
+}
+
+static void pipe_socket(void)
+{
+	int pp1[2], pp2[2], sv[2], i, ret;
+
+	SAFE_PIPE(pp1);
+	SAFE_PIPE(pp2);
+	if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv))
+		tst_brk(TBROK | TERRNO, "fail to create socket pair.");
+
+	SAFE_WRITE(1, pp1[1], arr_in, num_len_data);
+	for (i = 0; i < num_len_data; i++) {
+		ret = splice(pp1[0], NULL, sv[0], 0, 1, SPLICE_F_MOVE);
+		if (ret == -1) {
+			tst_res(TFAIL | TERRNO, "splice error");
+			goto exit;
+		}
+	}
+	for (i = 0; i < num_len_data; i++) {
+		ret = splice(sv[1], 0, pp2[1], NULL, 1, SPLICE_F_MOVE);
+		if (ret == -1) {
+			tst_res(TFAIL | TERRNO, "splice error");
+			goto exit;
+		}
+		SAFE_READ(1, pp2[0], arr_out + i, 1);
+	}
+
+	for (i = 0; i < num_len_data; i++) {
+		if (arr_in[i] != arr_out[i]) {
+			tst_res(TFAIL, "wrong data@%d: expected: %d, "
+				"actual %d", i, arr_in[i], arr_out[i]);
+			goto exit;
+		}
+	}
+	tst_res(TPASS, "splice(2): pipe <-> socket run pass.");
+exit:
+	for (i = 0; i < 2; i++) {
+		SAFE_CLOSE(pp1[i]);
+		SAFE_CLOSE(pp2[i]);
+		SAFE_CLOSE(sv[i]);
+	}
+}
+
+static struct tst_test test = {
+	.tid = "splice05",
+	.test_all = pipe_socket,
+	.setup = setup,
+	.cleanup = cleanup,
+	.options = options,
+	.min_kver = "2.6.17"
+};
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [LTP] [PATCH v4 1/2] syscalls/splice04: add test for splice() from pipe to pipe
  2017-05-12  9:14 [LTP] [PATCH v4 1/2] syscalls/splice04: add test for splice() from pipe to pipe bxue
  2017-05-12  9:14 ` [LTP] [PATCH v4 2/2] syscalls/splice05: add test for splice() between pipe and socket bxue
@ 2017-05-19 14:25 ` Cyril Hrubis
  2017-05-19 14:38   ` Cyril Hrubis
  1 sibling, 1 reply; 5+ messages in thread
From: Cyril Hrubis @ 2017-05-19 14:25 UTC (permalink / raw)
  To: ltp

Hi!
> +#define _GNU_SOURCE
> +#include <fcntl.h>
> +#include <stdlib.h>
> +#include "tst_test.h"
> +
> +#define PIPE_MAX (64*1024)
> +
> +static char *str_len_data;
> +static int num_len_data = PIPE_MAX;
> +static char *arr_in, *arr_out;
> +
> +static struct tst_option options[] = {
> +	{"l:", &str_len_data, "-l <num> Length of test data (in bytes)"},
> +	{NULL, NULL, NULL},
> +};
> +
> +static void setup(void)
> +{
> +	int i, pipe_max_unpriv, pipe_limit;
> +
> +	SAFE_FILE_SCANF("/proc/sys/fs/pipe-max-size", "%d", &pipe_max_unpriv);
> +	pipe_limit = pipe_max_unpriv < num_len_data ? pipe_max_unpriv :
> +		num_len_data;

Hmm, this is case for a MIN() macro. I guess that I should add MIN() and
MAX*() to the tst_test.h header since we have several uses in the
testcases already.

> +	num_len_data = pipe_limit;
> +
> +	if (tst_parse_int(str_len_data, &num_len_data, 1, pipe_limit))
> +		tst_brk(TBROK, "Invalid length of data: '%s', "
> +			"valid value: [1, %d]", str_len_data, pipe_limit);

There should be curly braces around the multiline statement.

> +	tst_res(TINFO, "splice size = %d", num_len_data);
> +	arr_in = SAFE_MALLOC(num_len_data);
> +	arr_out = SAFE_MALLOC(num_len_data);
> +	for (i = 0; i < num_len_data; i++)
> +		arr_in[i] = i & 0xff;
> +}
> +
> +static void cleanup(void)
> +{
> +	free(arr_in);
> +	free(arr_out);
> +}
> +
> +static void pipe_pipe(void)
> +{
> +	int pp1[2], pp2[2], i, ret;
> +
> +	SAFE_PIPE(pp1);
> +	SAFE_PIPE(pp2);
> +	SAFE_WRITE(1, pp1[1], arr_in, num_len_data);
> +	for (i = 0; i < num_len_data; i++) {
> +		ret = splice(pp1[0], NULL, pp2[1], NULL, 1, SPLICE_F_MOVE);
> +		if (ret == -1) {
> +			tst_res(TFAIL | TERRNO, "splice error");
> +			goto exit;
> +		}
> +		SAFE_READ(1, pp2[0], arr_out + i, 1);
> +	}

I do not understand why we are moving the data byte by byte here?

And also the SPLICE_F_MOVE flag, even if that was correctly implemented,
would be useless here.

> +	for (i = 0; i < num_len_data; i++) {
> +		if (arr_in[i] != arr_out[i]) {
> +			tst_res(TFAIL, "wrong data at %d: expected: %d, "
> +				"actual: %d", i, arr_in[i], arr_out[i]);
> +			goto exit;
> +		}
> +	}
> +	tst_res(TPASS, "splice(2) from pipe to pipe run pass.");
> +
> +exit:
> +	SAFE_CLOSE(pp1[1]);
> +	SAFE_CLOSE(pp1[0]);
> +	SAFE_CLOSE(pp2[1]);
> +	SAFE_CLOSE(pp2[0]);
> +}
> +
> +static struct tst_test test = {
> +	.tid = "splice04",
> +	.test_all = pipe_pipe,
> +	.setup = setup,
> +	.cleanup = cleanup,
> +	.options = options,
> +	.min_kver = "2.6.31"
> +};
> -- 
> 1.8.3.1
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [LTP] [PATCH v4 2/2] syscalls/splice05: add test for splice() between pipe and socket
  2017-05-12  9:14 ` [LTP] [PATCH v4 2/2] syscalls/splice05: add test for splice() between pipe and socket bxue
@ 2017-05-19 14:27   ` Cyril Hrubis
  0 siblings, 0 replies; 5+ messages in thread
From: Cyril Hrubis @ 2017-05-19 14:27 UTC (permalink / raw)
  To: ltp

Hi!
> +static void setup(void)
> +{
> +	int i, pipe_max_unpriv, pipe_limit;
> +
> +	SAFE_FILE_SCANF("/proc/sys/fs/pipe-max-size", "%d", &pipe_max_unpriv);
> +	pipe_limit = pipe_max_unpriv < num_len_data ? pipe_max_unpriv :
> +		num_len_data;
> +	num_len_data = pipe_limit;
> +
> +	if (tst_parse_int(str_len_data, &num_len_data, 1, pipe_limit))
> +		tst_brk(TBROK, "Invalid length of data: '%s', "
> +			"valid value: [1, %d]", str_len_data, pipe_limit);

Here as well.

> +	tst_res(TINFO, "splice size = %d", num_len_data);
> +	arr_in = SAFE_MALLOC(num_len_data);
> +	arr_out = SAFE_MALLOC(num_len_data);
> +	for (i = 0; i < num_len_data; i++)
> +		arr_in[i] = i & 0xff;
> +
> +}
> +
> +static void cleanup(void)
> +{
> +	free(arr_in);
> +	free(arr_out);
> +}
> +
> +static void pipe_socket(void)
> +{
> +	int pp1[2], pp2[2], sv[2], i, ret;
> +
> +	SAFE_PIPE(pp1);
> +	SAFE_PIPE(pp2);
> +	if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv))
> +		tst_brk(TBROK | TERRNO, "fail to create socket pair.");
> +
> +	SAFE_WRITE(1, pp1[1], arr_in, num_len_data);
> +	for (i = 0; i < num_len_data; i++) {
> +		ret = splice(pp1[0], NULL, sv[0], 0, 1, SPLICE_F_MOVE);
> +		if (ret == -1) {
> +			tst_res(TFAIL | TERRNO, "splice error");
> +			goto exit;
> +		}
> +	}
> +	for (i = 0; i < num_len_data; i++) {
> +		ret = splice(sv[1], 0, pp2[1], NULL, 1, SPLICE_F_MOVE);
> +		if (ret == -1) {
> +			tst_res(TFAIL | TERRNO, "splice error");
> +			goto exit;
> +		}
> +		SAFE_READ(1, pp2[0], arr_out + i, 1);
> +	}

And here as well.

> +	for (i = 0; i < num_len_data; i++) {
> +		if (arr_in[i] != arr_out[i]) {
> +			tst_res(TFAIL, "wrong data at %d: expected: %d, "
> +				"actual %d", i, arr_in[i], arr_out[i]);
> +			goto exit;
> +		}
> +	}
> +	tst_res(TPASS, "splice(2): pipe <-> socket run pass.");
> +exit:
> +	for (i = 0; i < 2; i++) {
> +		SAFE_CLOSE(pp1[i]);
> +		SAFE_CLOSE(pp2[i]);
> +		SAFE_CLOSE(sv[i]);
> +	}
> +}
> +
> +static struct tst_test test = {
> +	.tid = "splice05",
> +	.test_all = pipe_socket,
> +	.setup = setup,
> +	.cleanup = cleanup,
> +	.options = options,
> +	.min_kver = "2.6.17"
> +};
> -- 
> 1.8.3.1
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [LTP] [PATCH v4 1/2] syscalls/splice04: add test for splice() from pipe to pipe
  2017-05-19 14:25 ` [LTP] [PATCH v4 1/2] syscalls/splice04: add test for splice() from pipe to pipe Cyril Hrubis
@ 2017-05-19 14:38   ` Cyril Hrubis
  0 siblings, 0 replies; 5+ messages in thread
From: Cyril Hrubis @ 2017-05-19 14:38 UTC (permalink / raw)
  To: ltp

Hi!
> > +	SAFE_PIPE(pp1);
> > +	SAFE_PIPE(pp2);
> > +	SAFE_WRITE(1, pp1[1], arr_in, num_len_data);
> > +	for (i = 0; i < num_len_data; i++) {
> > +		ret = splice(pp1[0], NULL, pp2[1], NULL, 1, SPLICE_F_MOVE);
> > +		if (ret == -1) {
> > +			tst_res(TFAIL | TERRNO, "splice error");
> > +			goto exit;
> > +		}
> > +		SAFE_READ(1, pp2[0], arr_out + i, 1);
> > +	}
> 
> I do not understand why we are moving the data byte by byte here?
> 
> And also the SPLICE_F_MOVE flag, even if that was correctly implemented,
> would be useless here.

Looked at the previous version of the patch and the comment from Jan.

What he meant there was that we should decrease the number of requested
bytes by the number of bytes we spliced already.

-- 
Cyril Hrubis
chrubis@suse.cz

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-05-19 14:38 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-12  9:14 [LTP] [PATCH v4 1/2] syscalls/splice04: add test for splice() from pipe to pipe bxue
2017-05-12  9:14 ` [LTP] [PATCH v4 2/2] syscalls/splice05: add test for splice() between pipe and socket bxue
2017-05-19 14:27   ` Cyril Hrubis
2017-05-19 14:25 ` [LTP] [PATCH v4 1/2] syscalls/splice04: add test for splice() from pipe to pipe Cyril Hrubis
2017-05-19 14:38   ` Cyril Hrubis

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox