* [LTP] [PATCH V2 1/2] Add Syscall numbers for io_pgetevents
@ 2020-01-24 9:53 Viresh Kumar
2020-01-24 9:53 ` [LTP] [PATCH V2 2/2] syscalls/io_pgetevents Viresh Kumar
2020-01-28 13:42 ` [LTP] [PATCH V2 1/2] Add Syscall numbers for io_pgetevents Cyril Hrubis
0 siblings, 2 replies; 9+ messages in thread
From: Viresh Kumar @ 2020-01-24 9:53 UTC (permalink / raw)
To: ltp
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
V1->V2:
- No changes
include/lapi/syscalls/aarch64.in | 1 +
include/lapi/syscalls/arm.in | 1 +
include/lapi/syscalls/hppa.in | 1 +
include/lapi/syscalls/i386.in | 1 +
include/lapi/syscalls/ia64.in | 1 +
include/lapi/syscalls/powerpc.in | 1 +
include/lapi/syscalls/powerpc64.in | 1 +
include/lapi/syscalls/s390.in | 1 +
include/lapi/syscalls/s390x.in | 1 +
include/lapi/syscalls/sparc.in | 1 +
include/lapi/syscalls/sparc64.in | 1 +
include/lapi/syscalls/x86_64.in | 1 +
12 files changed, 12 insertions(+)
diff --git a/include/lapi/syscalls/aarch64.in b/include/lapi/syscalls/aarch64.in
index 19f3aa4475bd..25e1b27e9867 100644
--- a/include/lapi/syscalls/aarch64.in
+++ b/include/lapi/syscalls/aarch64.in
@@ -269,6 +269,7 @@ pwritev2 287
pkey_mprotect 288
pkey_alloc 289
pkey_free 290
+io_pgetevents 292
pidfd_send_signal 424
pidfd_open 434
_sysctl 1078
diff --git a/include/lapi/syscalls/arm.in b/include/lapi/syscalls/arm.in
index 979a0183d4f5..c4e162662c3e 100644
--- a/include/lapi/syscalls/arm.in
+++ b/include/lapi/syscalls/arm.in
@@ -354,5 +354,6 @@ pkey_mprotect (__NR_SYSCALL_BASE+394)
pkey_alloc (__NR_SYSCALL_BASE+395)
pkey_free (__NR_SYSCALL_BASE+396)
statx (__NR_SYSCALL_BASE+397)
+io_pgetevents (__NR_SYSCALL_BASE+399)
pidfd_send_signal (__NR_SYSCALL_BASE+424)
pidfd_open (__NR_SYSCALL_BASE+434)
diff --git a/include/lapi/syscalls/hppa.in b/include/lapi/syscalls/hppa.in
index b0807ca6b69f..71486f30d8ca 100644
--- a/include/lapi/syscalls/hppa.in
+++ b/include/lapi/syscalls/hppa.in
@@ -26,5 +26,6 @@ mlock2 345
copy_file_range 346
preadv2 347
pwritev2 348
+io_pgetevents 350
pidfd_send_signal 424
pidfd_open 434
diff --git a/include/lapi/syscalls/i386.in b/include/lapi/syscalls/i386.in
index f19e24bd63c9..ec47ca123a1f 100644
--- a/include/lapi/syscalls/i386.in
+++ b/include/lapi/syscalls/i386.in
@@ -353,5 +353,6 @@ pkey_mprotect 380
pkey_alloc 381
pkey_free 382
statx 383
+io_pgetevents 385
pidfd_send_signal 424
pidfd_open 434
diff --git a/include/lapi/syscalls/ia64.in b/include/lapi/syscalls/ia64.in
index 92cc881d933b..e9ae3f0093bf 100644
--- a/include/lapi/syscalls/ia64.in
+++ b/include/lapi/syscalls/ia64.in
@@ -306,6 +306,7 @@ mlock2 1346
copy_file_range 1347
preadv2 1348
pwritev2 1349
+io_pgetevents 1351
pkey_mprotect 1354
pkey_alloc 1355
pkey_free 1356
diff --git a/include/lapi/syscalls/powerpc.in b/include/lapi/syscalls/powerpc.in
index f83f7d233e61..3d27d2f2d0f6 100644
--- a/include/lapi/syscalls/powerpc.in
+++ b/include/lapi/syscalls/powerpc.in
@@ -356,6 +356,7 @@ copy_file_range 379
preadv2 380
pwritev2 381
statx 383
+io_pgetevents 388
pidfd_send_signal 424
pidfd_open 434
pkey_mprotect 386
diff --git a/include/lapi/syscalls/powerpc64.in b/include/lapi/syscalls/powerpc64.in
index f83f7d233e61..3d27d2f2d0f6 100644
--- a/include/lapi/syscalls/powerpc64.in
+++ b/include/lapi/syscalls/powerpc64.in
@@ -356,6 +356,7 @@ copy_file_range 379
preadv2 380
pwritev2 381
statx 383
+io_pgetevents 388
pidfd_send_signal 424
pidfd_open 434
pkey_mprotect 386
diff --git a/include/lapi/syscalls/s390.in b/include/lapi/syscalls/s390.in
index f99aceb71a81..460a17884735 100644
--- a/include/lapi/syscalls/s390.in
+++ b/include/lapi/syscalls/s390.in
@@ -340,6 +340,7 @@ mlock2 374
copy_file_range 375
preadv2 376
pwritev2 377
+io_pgetevents 382
pkey_mprotect 384
pkey_alloc 385
pkey_free 386
diff --git a/include/lapi/syscalls/s390x.in b/include/lapi/syscalls/s390x.in
index 9666095b6bea..00236356df73 100644
--- a/include/lapi/syscalls/s390x.in
+++ b/include/lapi/syscalls/s390x.in
@@ -338,6 +338,7 @@ mlock2 374
copy_file_range 375
preadv2 376
pwritev2 377
+io_pgetevents 382
pkey_mprotect 384
pkey_alloc 385
pkey_free 386
diff --git a/include/lapi/syscalls/sparc.in b/include/lapi/syscalls/sparc.in
index 6c610ba67308..b56b1ae5c748 100644
--- a/include/lapi/syscalls/sparc.in
+++ b/include/lapi/syscalls/sparc.in
@@ -345,6 +345,7 @@ mlock2 356
copy_file_range 357
preadv2 358
pwritev2 359
+io_pgetevents 361
pkey_mprotect 362
pkey_alloc 363
pkey_free 364
diff --git a/include/lapi/syscalls/sparc64.in b/include/lapi/syscalls/sparc64.in
index d20e87926913..8f04d730a5d5 100644
--- a/include/lapi/syscalls/sparc64.in
+++ b/include/lapi/syscalls/sparc64.in
@@ -320,6 +320,7 @@ mlock2 356
copy_file_range 357
preadv2 358
pwritev2 359
+io_pgetevents 361
pkey_mprotect 362
pkey_alloc 363
pkey_free 364
diff --git a/include/lapi/syscalls/x86_64.in b/include/lapi/syscalls/x86_64.in
index cba0080dd27a..8656a84d9b93 100644
--- a/include/lapi/syscalls/x86_64.in
+++ b/include/lapi/syscalls/x86_64.in
@@ -320,5 +320,6 @@ pkey_mprotect 329
pkey_alloc 330
pkey_free 331
statx 332
+io_pgetevents 333
pidfd_send_signal 424
pidfd_open 434
--
2.21.0.rc0.269.g1a574e7a288b
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [LTP] [PATCH V2 2/2] syscalls/io_pgetevents
2020-01-24 9:53 [LTP] [PATCH V2 1/2] Add Syscall numbers for io_pgetevents Viresh Kumar
@ 2020-01-24 9:53 ` Viresh Kumar
2020-01-27 10:50 ` [LTP] [PATCH V3 " Viresh Kumar
2020-01-28 3:01 ` [LTP] [PATCH V4 2/2] syscalls/io_pgetevents: New tests Viresh Kumar
2020-01-28 13:42 ` [LTP] [PATCH V2 1/2] Add Syscall numbers for io_pgetevents Cyril Hrubis
1 sibling, 2 replies; 9+ messages in thread
From: Viresh Kumar @ 2020-01-24 9:53 UTC (permalink / raw)
To: ltp
Add tests to check working of io_pgetevents() syscall.
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
V1->V2:
- Do the failure testing with help of array and .tcnt.
- Use tst_syscall().
- Removed cleanup() routines.
- Improved print messages and few more minor changes.
configure.ac | 1 +
include/lapi/io_pgetevents.h | 49 ++++++++
runtest/syscalls | 4 +
.../kernel/syscalls/io_pgetevents/.gitignore | 2 +
.../kernel/syscalls/io_pgetevents/Makefile | 6 +
.../syscalls/io_pgetevents/io_pgetevents01.c | 69 +++++++++++
.../syscalls/io_pgetevents/io_pgetevents02.c | 111 ++++++++++++++++++
7 files changed, 242 insertions(+)
create mode 100644 include/lapi/io_pgetevents.h
create mode 100644 testcases/kernel/syscalls/io_pgetevents/.gitignore
create mode 100644 testcases/kernel/syscalls/io_pgetevents/Makefile
create mode 100644 testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
create mode 100644 testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
diff --git a/configure.ac b/configure.ac
index 1bf0911d88ad..c7cdff1c422c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -75,6 +75,7 @@ AC_CHECK_FUNCS([ \
getdents \
getdents64 \
kcmp \
+ io_pgetevents \
mkdirat \
mknodat \
name_to_handle_at \
diff --git a/include/lapi/io_pgetevents.h b/include/lapi/io_pgetevents.h
new file mode 100644
index 000000000000..c498db83e7d0
--- /dev/null
+++ b/include/lapi/io_pgetevents.h
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Linaro Limited. All rights reserved.
+ * Author: Viresh Kumar <viresh.kumar@linaro.org>
+ */
+
+#ifndef IO_PGETEVENTS_H
+#define IO_PGETEVENTS_H
+
+#include <sys/types.h>
+
+#include "config.h"
+#include "lapi/syscalls.h"
+
+#ifdef HAVE_LIBAIO
+#include <libaio.h>
+
+#ifndef HAVE_IO_SETUP
+int io_setup(int nr, io_context_t *ctxp)
+{
+ return tst_syscall(__NR_io_setup, nr, ctxp);
+}
+#endif /* HAVE_IO_SETUP */
+
+#ifndef HAVE_IO_DESTROY
+int io_destroy(io_context_t ctx)
+{
+ return tst_syscall(__NR_io_destroy, ctx);
+}
+#endif /* HAVE_IO_DESTROY */
+
+#ifndef HAVE_IO_SUBMIT
+int io_submit(io_context_t ctx, long nr, struct iocb **iocbpp)
+{
+ return tst_syscall(__NR_io_submit, ctx, nr, iocbpp);
+}
+#endif /* HAVE_IO_SUBMIT */
+
+#ifndef HAVE_IO_PGETEVENTS
+int io_pgetevents(io_context_t ctx, long min_nr, long max_nr,
+ struct io_event *events, struct timespec *timeout,
+ sigset_t *sigmask)
+{
+ return syscall(__NR_io_pgetevents, ctx, min_nr, max_nr, events, timeout, sigmask);
+}
+#endif /* HAVE_IO_PGETEVENTS */
+#endif /* HAVE_LIBAIO */
+
+#endif /* IO_PGETEVENTS_H */
diff --git a/runtest/syscalls b/runtest/syscalls
index f083758bc637..33ec1e59e51d 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -556,6 +556,10 @@ ioprio_set03 ioprio_set03
io_cancel01 io_cancel01
io_destroy01 io_destroy01
io_getevents01 io_getevents01
+
+io_pgetevents01 io_pgetevents01
+io_pgetevents02 io_pgetevents02
+
io_setup01 io_setup01
io_submit01 io_submit01
diff --git a/testcases/kernel/syscalls/io_pgetevents/.gitignore b/testcases/kernel/syscalls/io_pgetevents/.gitignore
new file mode 100644
index 000000000000..ae02077ba44b
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/.gitignore
@@ -0,0 +1,2 @@
+io_pgetevents01
+io_pgetevents02
diff --git a/testcases/kernel/syscalls/io_pgetevents/Makefile b/testcases/kernel/syscalls/io_pgetevents/Makefile
new file mode 100644
index 000000000000..5ea7d67db123
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/Makefile
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+top_srcdir ?= ../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
new file mode 100644
index 000000000000..9b34f973c424
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Viresh Kumar <viresh.kumar@linaro.org>
+ *
+ * Description:
+ * Basic io_pgetevents() test to receive 1 event successfully.
+ */
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <fcntl.h>
+#include <string.h>
+#include <inttypes.h>
+
+#include "tst_test.h"
+#include "lapi/io_pgetevents.h"
+#include "lapi/syscalls.h"
+
+#ifdef HAVE_LIBAIO
+static void run(void)
+{
+ struct io_event events[1];
+ struct iocb cb, *cbs[1];
+ io_context_t ctx = 0;
+ sigset_t sigmask;
+ char data[4096];
+ int ret, fd;
+
+ cbs[0] = &cb;
+ sigemptyset(&sigmask);
+
+ fd = SAFE_OPEN("io_pgetevents_file", O_RDWR | O_CREAT);
+ io_prep_pwrite(&cb, fd, data, 4096, 0);
+
+ ret = io_setup(1, &ctx);
+ if (ret < 0) {
+ tst_res(TBROK | TERRNO, "io_setup() failed");
+ goto exit;
+ }
+
+ ret = io_submit(ctx, 1, cbs);
+ if (ret != 1) {
+ tst_res(TBROK | TERRNO, "io_submit() failed");
+ goto exit;
+ }
+
+ /* get the reply */
+ ret = io_pgetevents(ctx, 1, 1, events, NULL, &sigmask);
+
+ if (ret == 1)
+ tst_res(TPASS, "io_pgetevents() worked as expected");
+ else
+ tst_res(TFAIL | TERRNO, "io_pgetevents() failed");
+
+ if (io_destroy(ctx) < 0)
+ tst_res(TBROK | TERRNO, "io_destroy() failed");
+
+exit:
+ SAFE_CLOSE(fd);
+}
+
+static struct tst_test test = {
+ .min_kver = "4.18",
+ .test_all = run,
+ .needs_tmpdir = 1,
+};
+
+#else
+TST_TEST_TCONF("test requires libaio and it's development packages");
+#endif
diff --git a/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
new file mode 100644
index 000000000000..35722c4b21d6
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
@@ -0,0 +1,111 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Viresh Kumar <viresh.kumar@linaro.org>
+ *
+ * Description:
+ * Basic io_pgetevents() test to check various failures.
+ */
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <fcntl.h>
+#include <string.h>
+#include <inttypes.h>
+
+#include "tst_test.h"
+#include "lapi/io_pgetevents.h"
+#include "lapi/syscalls.h"
+
+#ifdef HAVE_LIBAIO
+static struct tcase {
+ char *name;
+ int invalid_ctx;
+ long min_nr;
+ long max_nr;
+ int invalid_events;
+ int invalid_timeout;
+ int invalid_sigmask;
+ int exp_errno;
+} tcases[] = {
+ {"test-invalid-ctx", 1, 1, 1, 0, 0, 0, EINVAL},
+ {"test-invalid-min_nr", 0, -1, 1, 0, 0, 0, EINVAL},
+ {"test-invalid-max_nr", 0, 1, -1, 0, 0, 0, EINVAL},
+ {"test-invalid-events", 0, 1, 1, 1, 0, 0, EFAULT},
+ {"test-invalid-timeout", 0, 1, 1, 0, 1, 0, EFAULT},
+ {"test-invalid-sigmask", 0, 1, 1, 0, 0, 1, EFAULT},
+};
+
+static void run(unsigned int n)
+{
+ struct io_event events[1], *events_ptr = NULL;
+ sigset_t sigmask, *psigmask = (void *)(0xDEAD);
+ struct timespec *timeout = (void *)(0xDEAD);
+ struct tcase *tc = &tcases[n];
+ struct iocb cb, *cbs[1];
+ io_context_t ctx = 0;
+ char data[4096];
+ int ret, fd;
+
+ cbs[0] = &cb;
+
+ if (!tc->invalid_timeout)
+ timeout = NULL;
+
+ if (!tc->invalid_sigmask) {
+ psigmask = &sigmask;
+ sigemptyset(psigmask);
+ }
+
+ if (!tc->invalid_events)
+ events_ptr = events;
+
+ fd = SAFE_OPEN("io_pgetevents_file", O_RDWR | O_CREAT);
+ io_prep_pwrite(&cb, fd, data, 4096, 0);
+
+ if (!tc->invalid_ctx) {
+ ret = io_setup(1, &ctx);
+ if (ret < 0) {
+ tst_res(TBROK | TERRNO, "io_setup() failed");
+ goto exit;
+ }
+
+ ret = io_submit(ctx, 1, cbs);
+ if (ret != 1) {
+ tst_res(TBROK | TERRNO, "io_submit() failed");
+ goto exit;
+ }
+ }
+
+ /* Invalid Max event count */
+ TEST(io_pgetevents(ctx, tc->min_nr, tc->max_nr, events_ptr, timeout,
+ psigmask));
+
+ if (TST_RET == 1) {
+ tst_res(TFAIL, "%s: io_pgetevents() passed unexpectedly",
+ tc->name);
+ } else if (tc->exp_errno != TST_ERR) {
+ tst_res(TFAIL | TTERRNO, "%s: io_pgetevents() should fail with %s",
+ tc->name, tst_strerrno(tc->exp_errno));
+ } else {
+ tst_res(TPASS | TTERRNO, "%s: io_pgetevents() failed as expected",
+ tc->name);
+ }
+
+ if (!tc->invalid_ctx) {
+ if (io_destroy(ctx) < 0)
+ tst_res(TBROK | TERRNO, "io_destroy() failed");
+ }
+
+exit:
+ SAFE_CLOSE(fd);
+}
+
+static struct tst_test test = {
+ .min_kver = "4.18",
+ .needs_tmpdir = 1,
+ .tcnt = ARRAY_SIZE(tcases),
+ .test = run,
+};
+
+#else
+TST_TEST_TCONF("test requires libaio and it's development packages");
+#endif
--
2.21.0.rc0.269.g1a574e7a288b
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [LTP] [PATCH V3 2/2] syscalls/io_pgetevents
2020-01-24 9:53 ` [LTP] [PATCH V2 2/2] syscalls/io_pgetevents Viresh Kumar
@ 2020-01-27 10:50 ` Viresh Kumar
2020-01-27 14:32 ` Cyril Hrubis
2020-01-28 3:01 ` [LTP] [PATCH V4 2/2] syscalls/io_pgetevents: New tests Viresh Kumar
1 sibling, 1 reply; 9+ messages in thread
From: Viresh Kumar @ 2020-01-27 10:50 UTC (permalink / raw)
To: ltp
Add tests to check working of io_pgetevents() syscall.
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
V2->V3:
- Dropped duplicate headers
- Handle failure tests with global variable
- All changes were inspired from the reviews of pidfd_open() patchset.
V1->V2:
- Do the failure testing with help of array and .tcnt.
- Use tst_syscall().
- Removed cleanup() routines.
- Improved print messages and few more minor changes.
configure.ac | 1 +
include/lapi/io_pgetevents.h | 51 +++++++++
runtest/syscalls | 4 +
.../kernel/syscalls/io_pgetevents/.gitignore | 2 +
.../kernel/syscalls/io_pgetevents/Makefile | 6 +
.../syscalls/io_pgetevents/io_pgetevents01.c | 61 +++++++++++
.../syscalls/io_pgetevents/io_pgetevents02.c | 103 ++++++++++++++++++
7 files changed, 228 insertions(+)
create mode 100644 include/lapi/io_pgetevents.h
create mode 100644 testcases/kernel/syscalls/io_pgetevents/.gitignore
create mode 100644 testcases/kernel/syscalls/io_pgetevents/Makefile
create mode 100644 testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
create mode 100644 testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
diff --git a/configure.ac b/configure.ac
index 1bf0911d88ad..c7cdff1c422c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -75,6 +75,7 @@ AC_CHECK_FUNCS([ \
getdents \
getdents64 \
kcmp \
+ io_pgetevents \
mkdirat \
mknodat \
name_to_handle_at \
diff --git a/include/lapi/io_pgetevents.h b/include/lapi/io_pgetevents.h
new file mode 100644
index 000000000000..6ee38c44d419
--- /dev/null
+++ b/include/lapi/io_pgetevents.h
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Linaro Limited. All rights reserved.
+ * Author: Viresh Kumar <viresh.kumar@linaro.org>
+ */
+
+#ifndef IO_PGETEVENTS_H
+#define IO_PGETEVENTS_H
+
+#include <sys/syscall.h>
+#include <sys/types.h>
+
+#include "config.h"
+#include "lapi/syscalls.h"
+#include "tst_test.h"
+
+#ifdef HAVE_LIBAIO
+#include <libaio.h>
+
+#ifndef HAVE_IO_SETUP
+int io_setup(int nr, io_context_t *ctxp)
+{
+ return tst_syscall(__NR_io_setup, nr, ctxp);
+}
+#endif /* HAVE_IO_SETUP */
+
+#ifndef HAVE_IO_DESTROY
+int io_destroy(io_context_t ctx)
+{
+ return tst_syscall(__NR_io_destroy, ctx);
+}
+#endif /* HAVE_IO_DESTROY */
+
+#ifndef HAVE_IO_SUBMIT
+int io_submit(io_context_t ctx, long nr, struct iocb **iocbpp)
+{
+ return tst_syscall(__NR_io_submit, ctx, nr, iocbpp);
+}
+#endif /* HAVE_IO_SUBMIT */
+
+#ifndef HAVE_IO_PGETEVENTS
+int io_pgetevents(io_context_t ctx, long min_nr, long max_nr,
+ struct io_event *events, struct timespec *timeout,
+ sigset_t *sigmask)
+{
+ return syscall(__NR_io_pgetevents, ctx, min_nr, max_nr, events, timeout, sigmask);
+}
+#endif /* HAVE_IO_PGETEVENTS */
+#endif /* HAVE_LIBAIO */
+
+#endif /* IO_PGETEVENTS_H */
diff --git a/runtest/syscalls b/runtest/syscalls
index a28a1f2ecd45..0743cf4e3f74 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -556,6 +556,10 @@ ioprio_set03 ioprio_set03
io_cancel01 io_cancel01
io_destroy01 io_destroy01
io_getevents01 io_getevents01
+
+io_pgetevents01 io_pgetevents01
+io_pgetevents02 io_pgetevents02
+
io_setup01 io_setup01
io_submit01 io_submit01
diff --git a/testcases/kernel/syscalls/io_pgetevents/.gitignore b/testcases/kernel/syscalls/io_pgetevents/.gitignore
new file mode 100644
index 000000000000..ae02077ba44b
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/.gitignore
@@ -0,0 +1,2 @@
+io_pgetevents01
+io_pgetevents02
diff --git a/testcases/kernel/syscalls/io_pgetevents/Makefile b/testcases/kernel/syscalls/io_pgetevents/Makefile
new file mode 100644
index 000000000000..5ea7d67db123
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/Makefile
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+top_srcdir ?= ../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
new file mode 100644
index 000000000000..d685adb48759
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Viresh Kumar <viresh.kumar@linaro.org>
+ *
+ * Description:
+ * Basic io_pgetevents() test to receive 1 event successfully.
+ */
+#include "lapi/io_pgetevents.h"
+
+#ifdef HAVE_LIBAIO
+static void run(void)
+{
+ struct io_event events[1];
+ struct iocb cb, *cbs[1];
+ io_context_t ctx = 0;
+ sigset_t sigmask;
+ char data[4096];
+ int ret, fd;
+
+ cbs[0] = &cb;
+ sigemptyset(&sigmask);
+
+ fd = SAFE_OPEN("io_pgetevents_file", O_RDWR | O_CREAT);
+ io_prep_pwrite(&cb, fd, data, 4096, 0);
+
+ ret = io_setup(1, &ctx);
+ if (ret < 0) {
+ tst_res(TBROK | TERRNO, "io_setup() failed");
+ goto exit;
+ }
+
+ ret = io_submit(ctx, 1, cbs);
+ if (ret != 1) {
+ tst_res(TBROK | TERRNO, "io_submit() failed");
+ goto exit;
+ }
+
+ /* get the reply */
+ ret = io_pgetevents(ctx, 1, 1, events, NULL, &sigmask);
+
+ if (ret == 1)
+ tst_res(TPASS, "io_pgetevents() works as expected");
+ else
+ tst_res(TFAIL | TERRNO, "io_pgetevents() failed");
+
+ if (io_destroy(ctx) < 0)
+ tst_res(TBROK | TERRNO, "io_destroy() failed");
+
+exit:
+ SAFE_CLOSE(fd);
+}
+
+static struct tst_test test = {
+ .min_kver = "4.18",
+ .test_all = run,
+ .needs_tmpdir = 1,
+};
+
+#else
+TST_TEST_TCONF("test requires libaio and it's development packages");
+#endif
diff --git a/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
new file mode 100644
index 000000000000..c612c3f0a2b2
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
@@ -0,0 +1,103 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Viresh Kumar <viresh.kumar@linaro.org>
+ *
+ * Description:
+ * Basic io_pgetevents() test to check various failures.
+ */
+#include "lapi/io_pgetevents.h"
+
+#ifdef HAVE_LIBAIO
+static sigset_t sigmask;
+static struct io_event events[1];
+static io_context_t ctx, invalid_ctx = 0;
+static int fd;
+
+static struct tcase {
+ char *name;
+ io_context_t *ctx;
+ long min_nr;
+ long max_nr;
+ struct io_event *events;
+ struct timespec *timeout;
+ sigset_t *sigmask;
+ int exp_errno;
+} tcases[] = {
+ {"invalid ctx", &invalid_ctx, 1, 1, events, NULL, &sigmask, EINVAL},
+ {"invalid min_nr", &ctx, -1, 1, events, NULL, &sigmask, EINVAL},
+ {"invalid max_nr", &ctx, 1, -1, events, NULL, &sigmask, EINVAL},
+ {"invalid events", &ctx, 1, 1, NULL, NULL, &sigmask, EFAULT},
+ {"invalid timeout", &ctx, 1, 1, events, (void *)(0xDEAD), &sigmask, EFAULT},
+ {"invalid sigmask", &ctx, 1, 1, events, NULL, (void *)(0xDEAD), EFAULT},
+};
+
+static void setup(void)
+{
+ struct iocb cb, *cbs[1];
+ char data[4096];
+ int ret;
+
+ cbs[0] = &cb;
+
+ sigemptyset(&sigmask);
+
+ fd = SAFE_OPEN("io_pgetevents_file", O_RDWR | O_CREAT);
+ io_prep_pwrite(&cb, fd, data, 4096, 0);
+
+ ret = io_setup(1, &ctx);
+ if (ret < 0) {
+ tst_res(TBROK | TERRNO, "io_setup() failed");
+ goto exit;
+ }
+
+ ret = io_submit(ctx, 1, cbs);
+ if (ret != 1) {
+ tst_res(TBROK | TERRNO, "io_submit() failed");
+ goto exit;
+ }
+
+ return;
+
+exit:
+ SAFE_CLOSE(fd);
+}
+
+static void cleanup(void)
+{
+ if (io_destroy(ctx) < 0)
+ tst_res(TBROK | TERRNO, "io_destroy() failed");
+
+ SAFE_CLOSE(fd);
+}
+
+static void run(unsigned int n)
+{
+ struct tcase *tc = &tcases[n];
+
+ TEST(io_pgetevents(*tc->ctx, tc->min_nr, tc->max_nr, tc->events,
+ tc->timeout, tc->sigmask));
+
+ if (TST_RET == 1) {
+ tst_res(TFAIL, "%s: io_pgetevents() passed unexpectedly",
+ tc->name);
+ } else if (tc->exp_errno != TST_ERR) {
+ tst_res(TFAIL | TTERRNO, "%s: io_pgetevents() should fail with %s",
+ tc->name, tst_strerrno(tc->exp_errno));
+ } else {
+ tst_res(TPASS | TTERRNO, "%s: io_pgetevents() failed as expected",
+ tc->name);
+ }
+}
+
+static struct tst_test test = {
+ .min_kver = "4.18",
+ .needs_tmpdir = 1,
+ .tcnt = ARRAY_SIZE(tcases),
+ .test = run,
+ .setup = setup,
+ .cleanup = cleanup,
+};
+
+#else
+TST_TEST_TCONF("test requires libaio and it's development packages");
+#endif
--
2.21.0.rc0.269.g1a574e7a288b
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [LTP] [PATCH V3 2/2] syscalls/io_pgetevents
2020-01-27 10:50 ` [LTP] [PATCH V3 " Viresh Kumar
@ 2020-01-27 14:32 ` Cyril Hrubis
0 siblings, 0 replies; 9+ messages in thread
From: Cyril Hrubis @ 2020-01-27 14:32 UTC (permalink / raw)
To: ltp
Hi!
> Add tests to check working of io_pgetevents() syscall.
>
> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
> ---
> V2->V3:
> - Dropped duplicate headers
> - Handle failure tests with global variable
> - All changes were inspired from the reviews of pidfd_open() patchset.
>
> V1->V2:
> - Do the failure testing with help of array and .tcnt.
> - Use tst_syscall().
> - Removed cleanup() routines.
> - Improved print messages and few more minor changes.
>
> configure.ac | 1 +
> include/lapi/io_pgetevents.h | 51 +++++++++
> runtest/syscalls | 4 +
> .../kernel/syscalls/io_pgetevents/.gitignore | 2 +
> .../kernel/syscalls/io_pgetevents/Makefile | 6 +
> .../syscalls/io_pgetevents/io_pgetevents01.c | 61 +++++++++++
> .../syscalls/io_pgetevents/io_pgetevents02.c | 103 ++++++++++++++++++
> 7 files changed, 228 insertions(+)
> create mode 100644 include/lapi/io_pgetevents.h
> create mode 100644 testcases/kernel/syscalls/io_pgetevents/.gitignore
> create mode 100644 testcases/kernel/syscalls/io_pgetevents/Makefile
> create mode 100644 testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
> create mode 100644 testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
>
> diff --git a/configure.ac b/configure.ac
> index 1bf0911d88ad..c7cdff1c422c 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -75,6 +75,7 @@ AC_CHECK_FUNCS([ \
> getdents \
> getdents64 \
> kcmp \
> + io_pgetevents \
> mkdirat \
> mknodat \
> name_to_handle_at \
> diff --git a/include/lapi/io_pgetevents.h b/include/lapi/io_pgetevents.h
> new file mode 100644
> index 000000000000..6ee38c44d419
> --- /dev/null
> +++ b/include/lapi/io_pgetevents.h
> @@ -0,0 +1,51 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2020 Linaro Limited. All rights reserved.
> + * Author: Viresh Kumar <viresh.kumar@linaro.org>
> + */
> +
> +#ifndef IO_PGETEVENTS_H
> +#define IO_PGETEVENTS_H
> +
> +#include <sys/syscall.h>
> +#include <sys/types.h>
> +
> +#include "config.h"
> +#include "lapi/syscalls.h"
> +#include "tst_test.h"
> +
> +#ifdef HAVE_LIBAIO
> +#include <libaio.h>
> +
> +#ifndef HAVE_IO_SETUP
> +int io_setup(int nr, io_context_t *ctxp)
> +{
> + return tst_syscall(__NR_io_setup, nr, ctxp);
> +}
> +#endif /* HAVE_IO_SETUP */
> +
> +#ifndef HAVE_IO_DESTROY
> +int io_destroy(io_context_t ctx)
> +{
> + return tst_syscall(__NR_io_destroy, ctx);
> +}
> +#endif /* HAVE_IO_DESTROY */
> +
> +#ifndef HAVE_IO_SUBMIT
> +int io_submit(io_context_t ctx, long nr, struct iocb **iocbpp)
> +{
> + return tst_syscall(__NR_io_submit, ctx, nr, iocbpp);
> +}
> +#endif /* HAVE_IO_SUBMIT */
I'm not sure this is correct, the libaio.h does define these wrappers
and the rest of LTP seems to use these syscalls only guarded by
HAVE_LIBAIO, so I guess these cannot be missing if libaio.h is present.
Furthermore there are no checks for io_setup, io_destroy and io_submit
calls in the configure.ac so presumbly this macros are never used
anyway.
> +#ifndef HAVE_IO_PGETEVENTS
> +int io_pgetevents(io_context_t ctx, long min_nr, long max_nr,
> + struct io_event *events, struct timespec *timeout,
> + sigset_t *sigmask)
> +{
> + return syscall(__NR_io_pgetevents, ctx, min_nr, max_nr, events, timeout, sigmask);
> +}
> +#endif /* HAVE_IO_PGETEVENTS */
This is the only function that seems to be missing from the libaio.h
header, so I guess that all we have to do here is to define it if it's
not defined.
> +#endif /* HAVE_LIBAIO */
> +
> +#endif /* IO_PGETEVENTS_H */
> diff --git a/runtest/syscalls b/runtest/syscalls
> index a28a1f2ecd45..0743cf4e3f74 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -556,6 +556,10 @@ ioprio_set03 ioprio_set03
> io_cancel01 io_cancel01
> io_destroy01 io_destroy01
> io_getevents01 io_getevents01
> +
> +io_pgetevents01 io_pgetevents01
> +io_pgetevents02 io_pgetevents02
> +
> io_setup01 io_setup01
> io_submit01 io_submit01
>
> diff --git a/testcases/kernel/syscalls/io_pgetevents/.gitignore b/testcases/kernel/syscalls/io_pgetevents/.gitignore
> new file mode 100644
> index 000000000000..ae02077ba44b
> --- /dev/null
> +++ b/testcases/kernel/syscalls/io_pgetevents/.gitignore
> @@ -0,0 +1,2 @@
> +io_pgetevents01
> +io_pgetevents02
> diff --git a/testcases/kernel/syscalls/io_pgetevents/Makefile b/testcases/kernel/syscalls/io_pgetevents/Makefile
> new file mode 100644
> index 000000000000..5ea7d67db123
> --- /dev/null
> +++ b/testcases/kernel/syscalls/io_pgetevents/Makefile
> @@ -0,0 +1,6 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +
> +top_srcdir ?= ../../../..
> +
> +include $(top_srcdir)/include/mk/testcases.mk
> +include $(top_srcdir)/include/mk/generic_leaf_target.mk
> diff --git a/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
> new file mode 100644
> index 000000000000..d685adb48759
> --- /dev/null
> +++ b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
> @@ -0,0 +1,61 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2020 Viresh Kumar <viresh.kumar@linaro.org>
> + *
> + * Description:
> + * Basic io_pgetevents() test to receive 1 event successfully.
> + */
> +#include "lapi/io_pgetevents.h"
> +
> +#ifdef HAVE_LIBAIO
> +static void run(void)
> +{
> + struct io_event events[1];
> + struct iocb cb, *cbs[1];
> + io_context_t ctx = 0;
> + sigset_t sigmask;
> + char data[4096];
> + int ret, fd;
> +
> + cbs[0] = &cb;
> + sigemptyset(&sigmask);
> +
> + fd = SAFE_OPEN("io_pgetevents_file", O_RDWR | O_CREAT);
> + io_prep_pwrite(&cb, fd, data, 4096, 0);
> +
> + ret = io_setup(1, &ctx);
> + if (ret < 0) {
> + tst_res(TBROK | TERRNO, "io_setup() failed");
> + goto exit;
> + }
> +
> + ret = io_submit(ctx, 1, cbs);
> + if (ret != 1) {
> + tst_res(TBROK | TERRNO, "io_submit() failed");
> + goto exit;
> + }
> +
> + /* get the reply */
> + ret = io_pgetevents(ctx, 1, 1, events, NULL, &sigmask);
> +
> + if (ret == 1)
> + tst_res(TPASS, "io_pgetevents() works as expected");
> + else
> + tst_res(TFAIL | TERRNO, "io_pgetevents() failed");
> +
> + if (io_destroy(ctx) < 0)
> + tst_res(TBROK | TERRNO, "io_destroy() failed");
> +
> +exit:
> + SAFE_CLOSE(fd);
> +}
> +
> +static struct tst_test test = {
> + .min_kver = "4.18",
> + .test_all = run,
> + .needs_tmpdir = 1,
> +};
> +
> +#else
> +TST_TEST_TCONF("test requires libaio and it's development packages");
> +#endif
> diff --git a/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
> new file mode 100644
> index 000000000000..c612c3f0a2b2
> --- /dev/null
> +++ b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
> @@ -0,0 +1,103 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2020 Viresh Kumar <viresh.kumar@linaro.org>
> + *
> + * Description:
> + * Basic io_pgetevents() test to check various failures.
> + */
> +#include "lapi/io_pgetevents.h"
> +
> +#ifdef HAVE_LIBAIO
> +static sigset_t sigmask;
> +static struct io_event events[1];
> +static io_context_t ctx, invalid_ctx = 0;
> +static int fd;
> +
> +static struct tcase {
> + char *name;
> + io_context_t *ctx;
> + long min_nr;
> + long max_nr;
> + struct io_event *events;
> + struct timespec *timeout;
> + sigset_t *sigmask;
> + int exp_errno;
> +} tcases[] = {
> + {"invalid ctx", &invalid_ctx, 1, 1, events, NULL, &sigmask, EINVAL},
> + {"invalid min_nr", &ctx, -1, 1, events, NULL, &sigmask, EINVAL},
> + {"invalid max_nr", &ctx, 1, -1, events, NULL, &sigmask, EINVAL},
> + {"invalid events", &ctx, 1, 1, NULL, NULL, &sigmask, EFAULT},
> + {"invalid timeout", &ctx, 1, 1, events, (void *)(0xDEAD), &sigmask, EFAULT},
> + {"invalid sigmask", &ctx, 1, 1, events, NULL, (void *)(0xDEAD), EFAULT},
> +};
> +
> +static void setup(void)
> +{
> + struct iocb cb, *cbs[1];
> + char data[4096];
> + int ret;
> +
> + cbs[0] = &cb;
> +
> + sigemptyset(&sigmask);
> +
> + fd = SAFE_OPEN("io_pgetevents_file", O_RDWR | O_CREAT);
> + io_prep_pwrite(&cb, fd, data, 4096, 0);
> +
> + ret = io_setup(1, &ctx);
> + if (ret < 0) {
> + tst_res(TBROK | TERRNO, "io_setup() failed");
> + goto exit;
> + }
> +
> + ret = io_submit(ctx, 1, cbs);
> + if (ret != 1) {
> + tst_res(TBROK | TERRNO, "io_submit() failed");
> + goto exit;
> + }
> +
> + return;
> +
> +exit:
> + SAFE_CLOSE(fd);
We do close the fd in test cleanup() so this should be removed.
Also we will attempt to continue the test here even when the io_setup()
or io_submit() have failed.
What we should do here instead is to call tst_brk() in the checks for
io_setup() and io_submit() failures. The fd will be closed in the
cleanup that way.
> +}
> +
> +static void cleanup(void)
> +{
> + if (io_destroy(ctx) < 0)
> + tst_res(TBROK | TERRNO, "io_destroy() failed");
> +
> + SAFE_CLOSE(fd);
The cleanup could be called when any of the SAFE_ calls fails, which
especially means that if SAFE_OPEN() fails we will attempt to destroy
uninitialized context and close fd -1.
What we do in cleanups to cope with this is to check if the fd is valid
fist, i.e.
if (fd > 0)
SAFE_CLOSE(fd);
For the io_destroy(ctx) it's probably easiest to create a global flag
ctx_initalized and set it to 1 right after the io_setup(). Then we can
do:
if (ctx_initialized) {
if (io_destroy(ctx) < 0)
...
}
> +}
> +
> +static void run(unsigned int n)
> +{
> + struct tcase *tc = &tcases[n];
> +
> + TEST(io_pgetevents(*tc->ctx, tc->min_nr, tc->max_nr, tc->events,
> + tc->timeout, tc->sigmask));
> +
> + if (TST_RET == 1) {
> + tst_res(TFAIL, "%s: io_pgetevents() passed unexpectedly",
> + tc->name);
> + } else if (tc->exp_errno != TST_ERR) {
> + tst_res(TFAIL | TTERRNO, "%s: io_pgetevents() should fail with %s",
> + tc->name, tst_strerrno(tc->exp_errno));
> + } else {
> + tst_res(TPASS | TTERRNO, "%s: io_pgetevents() failed as expected",
> + tc->name);
> + }
We usually use return to avoid if-else mazes like this one, i.e.
if (TST_RET == 1) {
tst_res(TFAIL, ...);
return;
}
if (tc->exp_errno != TST_ERR) {
tst_res(TFAIL ...);
return;
}
tst_res(TPASS, ...);
I find this a bit more readable.
> +}
> +
> +static struct tst_test test = {
> + .min_kver = "4.18",
> + .needs_tmpdir = 1,
> + .tcnt = ARRAY_SIZE(tcases),
> + .test = run,
> + .setup = setup,
> + .cleanup = cleanup,
> +};
> +
> +#else
> +TST_TEST_TCONF("test requires libaio and it's development packages");
> +#endif
Other than the minor issues the rest looks good.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 9+ messages in thread
* [LTP] [PATCH V4 2/2] syscalls/io_pgetevents: New tests
2020-01-24 9:53 ` [LTP] [PATCH V2 2/2] syscalls/io_pgetevents Viresh Kumar
2020-01-27 10:50 ` [LTP] [PATCH V3 " Viresh Kumar
@ 2020-01-28 3:01 ` Viresh Kumar
2020-01-28 13:40 ` Cyril Hrubis
1 sibling, 1 reply; 9+ messages in thread
From: Viresh Kumar @ 2020-01-28 3:01 UTC (permalink / raw)
To: ltp
Add tests to check working of io_pgetevents() syscall.
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
V3->V4:
- Dropped few helpers from io_pgetevents.h as loading the AIO_LIBS from
Makefile made the warnings go away.
- Better handling of the failure in setup() path.
- Use "return" to avoid using if/else maze.
V2->V3:
- Dropped duplicate headers
- Handle failure tests with global variable
- All changes were inspired from the reviews of pidfd_open() patchset.
V1->V2:
- Do the failure testing with help of array and .tcnt.
- Use tst_syscall().
- Removed cleanup() routines.
- Improved print messages and few more minor changes.
configure.ac | 1 +
include/lapi/io_pgetevents.h | 30 +++++
runtest/syscalls | 4 +
.../kernel/syscalls/io_pgetevents/.gitignore | 2 +
.../kernel/syscalls/io_pgetevents/Makefile | 9 ++
.../syscalls/io_pgetevents/io_pgetevents01.c | 61 +++++++++++
.../syscalls/io_pgetevents/io_pgetevents02.c | 103 ++++++++++++++++++
7 files changed, 210 insertions(+)
create mode 100644 include/lapi/io_pgetevents.h
create mode 100644 testcases/kernel/syscalls/io_pgetevents/.gitignore
create mode 100644 testcases/kernel/syscalls/io_pgetevents/Makefile
create mode 100644 testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
create mode 100644 testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
diff --git a/configure.ac b/configure.ac
index 1bf0911d88ad..c7cdff1c422c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -75,6 +75,7 @@ AC_CHECK_FUNCS([ \
getdents \
getdents64 \
kcmp \
+ io_pgetevents \
mkdirat \
mknodat \
name_to_handle_at \
diff --git a/include/lapi/io_pgetevents.h b/include/lapi/io_pgetevents.h
new file mode 100644
index 000000000000..5cdaffb6b15d
--- /dev/null
+++ b/include/lapi/io_pgetevents.h
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Linaro Limited. All rights reserved.
+ * Author: Viresh Kumar <viresh.kumar@linaro.org>
+ */
+
+#ifndef IO_PGETEVENTS_H
+#define IO_PGETEVENTS_H
+
+#include <sys/syscall.h>
+#include <sys/types.h>
+
+#include "config.h"
+#include "lapi/syscalls.h"
+#include "tst_test.h"
+
+#ifdef HAVE_LIBAIO
+#include <libaio.h>
+
+#ifndef HAVE_IO_PGETEVENTS
+int io_pgetevents(io_context_t ctx, long min_nr, long max_nr,
+ struct io_event *events, struct timespec *timeout,
+ sigset_t *sigmask)
+{
+ return syscall(__NR_io_pgetevents, ctx, min_nr, max_nr, events, timeout, sigmask);
+}
+#endif /* HAVE_IO_PGETEVENTS */
+#endif /* HAVE_LIBAIO */
+
+#endif /* IO_PGETEVENTS_H */
diff --git a/runtest/syscalls b/runtest/syscalls
index a28a1f2ecd45..0743cf4e3f74 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -556,6 +556,10 @@ ioprio_set03 ioprio_set03
io_cancel01 io_cancel01
io_destroy01 io_destroy01
io_getevents01 io_getevents01
+
+io_pgetevents01 io_pgetevents01
+io_pgetevents02 io_pgetevents02
+
io_setup01 io_setup01
io_submit01 io_submit01
diff --git a/testcases/kernel/syscalls/io_pgetevents/.gitignore b/testcases/kernel/syscalls/io_pgetevents/.gitignore
new file mode 100644
index 000000000000..ae02077ba44b
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/.gitignore
@@ -0,0 +1,2 @@
+io_pgetevents01
+io_pgetevents02
diff --git a/testcases/kernel/syscalls/io_pgetevents/Makefile b/testcases/kernel/syscalls/io_pgetevents/Makefile
new file mode 100644
index 000000000000..c26cffd37f39
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/Makefile
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+top_srcdir ?= ../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+LDLIBS += $(AIO_LIBS)
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
new file mode 100644
index 000000000000..d685adb48759
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents01.c
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Viresh Kumar <viresh.kumar@linaro.org>
+ *
+ * Description:
+ * Basic io_pgetevents() test to receive 1 event successfully.
+ */
+#include "lapi/io_pgetevents.h"
+
+#ifdef HAVE_LIBAIO
+static void run(void)
+{
+ struct io_event events[1];
+ struct iocb cb, *cbs[1];
+ io_context_t ctx = 0;
+ sigset_t sigmask;
+ char data[4096];
+ int ret, fd;
+
+ cbs[0] = &cb;
+ sigemptyset(&sigmask);
+
+ fd = SAFE_OPEN("io_pgetevents_file", O_RDWR | O_CREAT);
+ io_prep_pwrite(&cb, fd, data, 4096, 0);
+
+ ret = io_setup(1, &ctx);
+ if (ret < 0) {
+ tst_res(TBROK | TERRNO, "io_setup() failed");
+ goto exit;
+ }
+
+ ret = io_submit(ctx, 1, cbs);
+ if (ret != 1) {
+ tst_res(TBROK | TERRNO, "io_submit() failed");
+ goto exit;
+ }
+
+ /* get the reply */
+ ret = io_pgetevents(ctx, 1, 1, events, NULL, &sigmask);
+
+ if (ret == 1)
+ tst_res(TPASS, "io_pgetevents() works as expected");
+ else
+ tst_res(TFAIL | TERRNO, "io_pgetevents() failed");
+
+ if (io_destroy(ctx) < 0)
+ tst_res(TBROK | TERRNO, "io_destroy() failed");
+
+exit:
+ SAFE_CLOSE(fd);
+}
+
+static struct tst_test test = {
+ .min_kver = "4.18",
+ .test_all = run,
+ .needs_tmpdir = 1,
+};
+
+#else
+TST_TEST_TCONF("test requires libaio and it's development packages");
+#endif
diff --git a/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
new file mode 100644
index 000000000000..0c7fc59024df
--- /dev/null
+++ b/testcases/kernel/syscalls/io_pgetevents/io_pgetevents02.c
@@ -0,0 +1,103 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2020 Viresh Kumar <viresh.kumar@linaro.org>
+ *
+ * Description:
+ * Basic io_pgetevents() test to check various failures.
+ */
+#include "lapi/io_pgetevents.h"
+
+#ifdef HAVE_LIBAIO
+static sigset_t sigmask;
+static struct io_event events[1];
+static io_context_t ctx, invalid_ctx = 0;
+static int fd, ctx_initialized;
+
+static struct tcase {
+ char *name;
+ io_context_t *ctx;
+ long min_nr;
+ long max_nr;
+ struct io_event *events;
+ struct timespec *timeout;
+ sigset_t *sigmask;
+ int exp_errno;
+} tcases[] = {
+ {"invalid ctx", &invalid_ctx, 1, 1, events, NULL, &sigmask, EINVAL},
+ {"invalid min_nr", &ctx, -1, 1, events, NULL, &sigmask, EINVAL},
+ {"invalid max_nr", &ctx, 1, -1, events, NULL, &sigmask, EINVAL},
+ {"invalid events", &ctx, 1, 1, NULL, NULL, &sigmask, EFAULT},
+ {"invalid timeout", &ctx, 1, 1, events, (void *)(0xDEAD), &sigmask, EFAULT},
+ {"invalid sigmask", &ctx, 1, 1, events, NULL, (void *)(0xDEAD), EFAULT},
+};
+
+static void setup(void)
+{
+ struct iocb cb, *cbs[1];
+ char data[4096];
+ int ret;
+
+ cbs[0] = &cb;
+
+ sigemptyset(&sigmask);
+
+ fd = SAFE_OPEN("io_pgetevents_file", O_RDWR | O_CREAT);
+ io_prep_pwrite(&cb, fd, data, 4096, 0);
+
+ ret = io_setup(1, &ctx);
+ if (ret < 0)
+ tst_brk(TBROK | TERRNO, "io_setup() failed");
+
+ ctx_initialized = 1;
+
+ ret = io_submit(ctx, 1, cbs);
+ if (ret != 1)
+ tst_brk(TBROK | TERRNO, "io_submit() failed");
+}
+
+static void cleanup(void)
+{
+ if (ctx_initialized) {
+ if (io_destroy(ctx) < 0)
+ tst_res(TBROK | TERRNO, "io_destroy() failed");
+ }
+
+ if (fd > 0)
+ SAFE_CLOSE(fd);
+}
+
+static void run(unsigned int n)
+{
+ struct tcase *tc = &tcases[n];
+
+ TEST(io_pgetevents(*tc->ctx, tc->min_nr, tc->max_nr, tc->events,
+ tc->timeout, tc->sigmask));
+
+ if (TST_RET == 1) {
+ tst_res(TFAIL, "%s: io_pgetevents() passed unexpectedly",
+ tc->name);
+ return;
+ }
+
+ if (tc->exp_errno != TST_ERR) {
+ tst_res(TFAIL | TTERRNO, "%s: io_pgetevents() should fail with %s",
+ tc->name, tst_strerrno(tc->exp_errno));
+ return;
+ }
+
+ tst_res(TPASS | TTERRNO, "%s: io_pgetevents() failed as expected",
+ tc->name);
+}
+
+static struct tst_test test = {
+ .min_kver = "4.18",
+ .needs_tmpdir = 1,
+ .tcnt = ARRAY_SIZE(tcases),
+ .test = run,
+ .setup = setup,
+ .cleanup = cleanup,
+};
+
+#else
+TST_TEST_TCONF("test requires libaio and it's development packages");
+#endif
--
2.21.0.rc0.269.g1a574e7a288b
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [LTP] [PATCH V4 2/2] syscalls/io_pgetevents: New tests
2020-01-28 3:01 ` [LTP] [PATCH V4 2/2] syscalls/io_pgetevents: New tests Viresh Kumar
@ 2020-01-28 13:40 ` Cyril Hrubis
2020-01-29 0:46 ` Viresh Kumar
0 siblings, 1 reply; 9+ messages in thread
From: Cyril Hrubis @ 2020-01-28 13:40 UTC (permalink / raw)
To: ltp
Hi!
Pushed with one minor adjustement, thanks.
I've removed the tst_test.h include from the lapi header and put it into
the two test sources. Since that is the main header the tests should
include it's better when they include it explicitely.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 9+ messages in thread
* [LTP] [PATCH V2 1/2] Add Syscall numbers for io_pgetevents
2020-01-24 9:53 [LTP] [PATCH V2 1/2] Add Syscall numbers for io_pgetevents Viresh Kumar
2020-01-24 9:53 ` [LTP] [PATCH V2 2/2] syscalls/io_pgetevents Viresh Kumar
@ 2020-01-28 13:42 ` Cyril Hrubis
1 sibling, 0 replies; 9+ messages in thread
From: Cyril Hrubis @ 2020-01-28 13:42 UTC (permalink / raw)
To: ltp
Hi!
Pushed as well, thanks.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 9+ messages in thread
* [LTP] [PATCH V4 2/2] syscalls/io_pgetevents: New tests
2020-01-28 13:40 ` Cyril Hrubis
@ 2020-01-29 0:46 ` Viresh Kumar
2020-01-29 9:50 ` Cyril Hrubis
0 siblings, 1 reply; 9+ messages in thread
From: Viresh Kumar @ 2020-01-29 0:46 UTC (permalink / raw)
To: ltp
On 28-01-20, 14:40, Cyril Hrubis wrote:
> Hi!
> Pushed with one minor adjustement, thanks.
>
> I've removed the tst_test.h include from the lapi header and put it into
> the two test sources. Since that is the main header the tests should
> include it's better when they include it explicitely.
That was a very intentional change I kept because the header should
also take care of its dependencies. An earlier version was using few
tst_syscall() calls in lapi header and so it should have directly
included tst_test.h file, which I did.
But the same got removed in the latest version and so the same isn't
required. Though changing the order of lapi header and tst_test.h in
the io_pgetevents0*.c files still generate compilation errors as
definition of syscall() isn't found as well and the header should now
explicitly include <unistd.h>.
I have a question now :)
In the pidfd_open() lapi header I used tst_syscall() and in
io_pgetevents() lapi header I used syscall(). Should I use
tst_syscall() in both of them ? If yes, then I will include tst_test.h
as well in both of them and send you a patch.
--
viresh
^ permalink raw reply [flat|nested] 9+ messages in thread
* [LTP] [PATCH V4 2/2] syscalls/io_pgetevents: New tests
2020-01-29 0:46 ` Viresh Kumar
@ 2020-01-29 9:50 ` Cyril Hrubis
0 siblings, 0 replies; 9+ messages in thread
From: Cyril Hrubis @ 2020-01-29 9:50 UTC (permalink / raw)
To: ltp
Hi!
> > Pushed with one minor adjustement, thanks.
> >
> > I've removed the tst_test.h include from the lapi header and put it into
> > the two test sources. Since that is the main header the tests should
> > include it's better when they include it explicitely.
>
> That was a very intentional change I kept because the header should
> also take care of its dependencies. An earlier version was using few
> tst_syscall() calls in lapi header and so it should have directly
> included tst_test.h file, which I did.
The tst_syscall() is defined in lapi/syscalls.h and I doubt that this
header is incldued from tst_test.h and even if it is we should include
the lapi/syscall.h instead.
> But the same got removed in the latest version and so the same isn't
> required. Though changing the order of lapi header and tst_test.h in
> the io_pgetevents0*.c files still generate compilation errors as
> definition of syscall() isn't found as well and the header should now
> explicitly include <unistd.h>.
>
> I have a question now :)
>
> In the pidfd_open() lapi header I used tst_syscall() and in
> io_pgetevents() lapi header I used syscall(). Should I use
> tst_syscall() in both of them ? If yes, then I will include tst_test.h
> as well in both of them and send you a patch.
The difference between plain syscall() and tst_syscall() is twofold, it
takes care of undefined __NR_foo as well as of ENOSYS return from
kernel, so generally tst_syscall() should be used instead.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2020-01-29 9:50 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-01-24 9:53 [LTP] [PATCH V2 1/2] Add Syscall numbers for io_pgetevents Viresh Kumar
2020-01-24 9:53 ` [LTP] [PATCH V2 2/2] syscalls/io_pgetevents Viresh Kumar
2020-01-27 10:50 ` [LTP] [PATCH V3 " Viresh Kumar
2020-01-27 14:32 ` Cyril Hrubis
2020-01-28 3:01 ` [LTP] [PATCH V4 2/2] syscalls/io_pgetevents: New tests Viresh Kumar
2020-01-28 13:40 ` Cyril Hrubis
2020-01-29 0:46 ` Viresh Kumar
2020-01-29 9:50 ` Cyril Hrubis
2020-01-28 13:42 ` [LTP] [PATCH V2 1/2] Add Syscall numbers for io_pgetevents Cyril Hrubis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox