svn commit: r368627 - in projects/aio_writev: lib/libc/sys sys/bsm sys/compat/freebsd32 sys/kern sys/sys tests/sys/aio
Alan Somers
asomers at FreeBSD.org
Mon Dec 14 04:52:22 UTC 2020
Author: asomers
Date: Mon Dec 14 04:52:17 2020
New Revision: 368627
URL: https://svnweb.freebsd.org/changeset/base/368627
Log:
Add aio_readv
Like aio_writev, it doesn't yet work for sockets, nor work with lio_listio.
Modified:
projects/aio_writev/lib/libc/sys/Makefile.inc
projects/aio_writev/lib/libc/sys/Symbol.map
projects/aio_writev/lib/libc/sys/aio_read.2
projects/aio_writev/sys/bsm/audit_kevents.h
projects/aio_writev/sys/compat/freebsd32/freebsd32_proto.h
projects/aio_writev/sys/compat/freebsd32/freebsd32_syscall.h
projects/aio_writev/sys/compat/freebsd32/freebsd32_syscalls.c
projects/aio_writev/sys/compat/freebsd32/freebsd32_sysent.c
projects/aio_writev/sys/compat/freebsd32/freebsd32_systrace_args.c
projects/aio_writev/sys/compat/freebsd32/syscalls.master
projects/aio_writev/sys/kern/capabilities.conf
projects/aio_writev/sys/kern/init_sysent.c
projects/aio_writev/sys/kern/syscalls.c
projects/aio_writev/sys/kern/syscalls.master
projects/aio_writev/sys/kern/systrace_args.c
projects/aio_writev/sys/kern/vfs_aio.c
projects/aio_writev/sys/sys/aio.h
projects/aio_writev/sys/sys/syscall.h
projects/aio_writev/sys/sys/syscall.mk
projects/aio_writev/sys/sys/sysproto.h
projects/aio_writev/tests/sys/aio/aio_test.c
Modified: projects/aio_writev/lib/libc/sys/Makefile.inc
==============================================================================
--- projects/aio_writev/lib/libc/sys/Makefile.inc Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/lib/libc/sys/Makefile.inc Mon Dec 14 04:52:17 2020 (r368627)
@@ -353,6 +353,7 @@ MAN+= sctp_generic_recvmsg.2 \
write.2 \
_umtx_op.2
+MLINKS+=aio_read.2 aio_readv.2
MLINKS+=aio_write.2 aio_writev.2
MLINKS+=accept.2 accept4.2
MLINKS+=access.2 eaccess.2 \
Modified: projects/aio_writev/lib/libc/sys/Symbol.map
==============================================================================
--- projects/aio_writev/lib/libc/sys/Symbol.map Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/lib/libc/sys/Symbol.map Mon Dec 14 04:52:17 2020 (r368627)
@@ -414,6 +414,7 @@ FBSD_1.6 {
shm_create_largepage;
shm_rename;
aio_writev;
+ aio_readv;
};
FBSDprivate_1.0 {
Modified: projects/aio_writev/lib/libc/sys/aio_read.2
==============================================================================
--- projects/aio_writev/lib/libc/sys/aio_read.2 Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/lib/libc/sys/aio_read.2 Mon Dec 14 04:52:17 2020 (r368627)
@@ -24,11 +24,12 @@
.\"
.\" $FreeBSD$
.\"
-.Dd August 19, 2016
+.Dd December 13, 2020
.Dt AIO_READ 2
.Os
.Sh NAME
-.Nm aio_read
+.Nm aio_read ,
+.Nm aio_readv
.Nd asynchronous read from a file (REALTIME)
.Sh LIBRARY
.Lb libc
@@ -36,18 +37,31 @@
.In aio.h
.Ft int
.Fn aio_read "struct aiocb *iocb"
+.Ft int
+.Fn aio_readv "struct aiocb *iocb"
.Sh DESCRIPTION
The
.Fn aio_read
-system call allows the calling process to read
-.Fa iocb->aio_nbytes
+and
+.Fn aio_readv
+system calls allow the calling process to read
from the descriptor
.Fa iocb->aio_fildes
beginning at the offset
-.Fa iocb->aio_offset
-into the buffer pointed to by
-.Fa iocb->aio_buf .
-The call returns immediately after the read request has
+.Fa iocb->aio_offset .
+.Fn aio_read
+will read
+.Fa iocb->aio_nbytes
+from the buffer pointed to by
+.Fa iocb->aio_buf ,
+whereas
+.Fn aio_readv
+reads the data into the
+.Fa iocb->aio_iovcnt
+buffers specified by the members of the
+.Fa iocb->aio_iov
+array.
+Both syscalls return immediately after the read request has
been enqueued to the descriptor; the read may or may not have
completed at the time the call returns.
.Pp
@@ -61,7 +75,9 @@ The
argument
is ignored by the
.Fn aio_read
-system call.
+and
+.Fn aio_readv
+system calls.
.Pp
The
.Fa iocb
@@ -108,13 +124,15 @@ is past the offset maximum for
.Fa iocb->aio_fildes ,
no I/O will occur.
.Sh RETURN VALUES
-.Rv -std aio_read
+.Rv -std aio_read aio_readv
.Sh DIAGNOSTICS
None.
.Sh ERRORS
The
.Fn aio_read
-system call will fail if:
+and
+.Fn aio_readv
+system calls will fail if:
.Bl -tag -width Er
.It Bq Er EAGAIN
The request was not queued because of system resource limitations.
@@ -130,10 +148,14 @@ are unsafe and unsafe asynchronous I/O operations are
.Pp
The following conditions may be synchronously detected when the
.Fn aio_read
+or
+.Fn aio_readv
system call is made, or asynchronously, at any time thereafter.
If they
are detected at call time,
.Fn aio_read
+or
+.Fn aio_readv
returns -1 and sets
.Va errno
appropriately; otherwise the
@@ -207,11 +229,18 @@ The
system call is expected to conform to the
.St -p1003.1
standard.
+The
+.Fn aio_readv
+system call is a FreeBSD extension, and should not be used in portable code.
.Sh HISTORY
The
.Fn aio_read
system call first appeared in
.Fx 3.0 .
+The
+.Fn aio_readv
+system call first appeared in
+.Fx 13.0 .
.Sh AUTHORS
This
manual page was written by
Modified: projects/aio_writev/sys/bsm/audit_kevents.h
==============================================================================
--- projects/aio_writev/sys/bsm/audit_kevents.h Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/bsm/audit_kevents.h Mon Dec 14 04:52:17 2020 (r368627)
@@ -660,6 +660,7 @@
#define AUE_REALPATHAT 43264 /* FreeBSD-specific. */
#define AUE_CLOSERANGE 43265 /* FreeBSD-specific. */
#define AUE_AIO_WRITEV 43266 /* FreeBSD-specific. */
+#define AUE_AIO_READV 43267 /* FreeBSD-specific. */
/*
* Darwin BSM uses a number of AUE_O_* definitions, which are aliased to the
Modified: projects/aio_writev/sys/compat/freebsd32/freebsd32_proto.h
==============================================================================
--- projects/aio_writev/sys/compat/freebsd32/freebsd32_proto.h Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/compat/freebsd32/freebsd32_proto.h Mon Dec 14 04:52:17 2020 (r368627)
@@ -254,6 +254,9 @@ struct freebsd32_lio_listio_args {
struct freebsd32_aio_writev_args {
char aiocbp_l_[PADL_(struct aiocb32 *)]; struct aiocb32 * aiocbp; char aiocbp_r_[PADR_(struct aiocb32 *)];
};
+struct freebsd32_aio_readv_args {
+ char aiocbp_l_[PADL_(struct aiocb32 *)]; struct aiocb32 * aiocbp; char aiocbp_r_[PADR_(struct aiocb32 *)];
+};
struct freebsd32_lutimes_args {
char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
char tptr_l_[PADL_(struct timeval32 *)]; struct timeval32 * tptr; char tptr_r_[PADR_(struct timeval32 *)];
@@ -793,6 +796,7 @@ int freebsd32_aio_read(struct thread *, struct freebsd
int freebsd32_aio_write(struct thread *, struct freebsd32_aio_write_args *);
int freebsd32_lio_listio(struct thread *, struct freebsd32_lio_listio_args *);
int freebsd32_aio_writev(struct thread *, struct freebsd32_aio_writev_args *);
+int freebsd32_aio_readv(struct thread *, struct freebsd32_aio_readv_args *);
int freebsd32_lutimes(struct thread *, struct freebsd32_lutimes_args *);
int freebsd32_preadv(struct thread *, struct freebsd32_preadv_args *);
int freebsd32_pwritev(struct thread *, struct freebsd32_pwritev_args *);
@@ -1379,6 +1383,7 @@ int freebsd11_freebsd32_fstatat(struct thread *, struc
#define FREEBSD32_SYS_AUE_freebsd32_aio_write AUE_AIO_WRITE
#define FREEBSD32_SYS_AUE_freebsd32_lio_listio AUE_LIO_LISTIO
#define FREEBSD32_SYS_AUE_freebsd32_aio_writev AUE_AIO_WRITEV
+#define FREEBSD32_SYS_AUE_freebsd32_aio_readv AUE_AIO_READV
#define FREEBSD32_SYS_AUE_freebsd11_freebsd32_getdents AUE_O_GETDENTS
#define FREEBSD32_SYS_AUE_freebsd32_lutimes AUE_LUTIMES
#define FREEBSD32_SYS_AUE_freebsd32_preadv AUE_PREADV
Modified: projects/aio_writev/sys/compat/freebsd32/freebsd32_syscall.h
==============================================================================
--- projects/aio_writev/sys/compat/freebsd32/freebsd32_syscall.h Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/compat/freebsd32/freebsd32_syscall.h Mon Dec 14 04:52:17 2020 (r368627)
@@ -230,6 +230,7 @@
#define FREEBSD32_SYS_freebsd32_aio_write 256
#define FREEBSD32_SYS_freebsd32_lio_listio 257
#define FREEBSD32_SYS_freebsd32_aio_writev 258
+#define FREEBSD32_SYS_freebsd32_aio_readv 259
#define FREEBSD32_SYS_freebsd11_freebsd32_getdents 272
#define FREEBSD32_SYS_lchmod 274
/* 275 is obsolete netbsd_lchown */
Modified: projects/aio_writev/sys/compat/freebsd32/freebsd32_syscalls.c
==============================================================================
--- projects/aio_writev/sys/compat/freebsd32/freebsd32_syscalls.c Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/compat/freebsd32/freebsd32_syscalls.c Mon Dec 14 04:52:17 2020 (r368627)
@@ -268,7 +268,7 @@ const char *freebsd32_syscallnames[] = {
"freebsd32_aio_write", /* 256 = freebsd32_aio_write */
"freebsd32_lio_listio", /* 257 = freebsd32_lio_listio */
"freebsd32_aio_writev", /* 258 = freebsd32_aio_writev */
- "#259", /* 259 = nosys */
+ "freebsd32_aio_readv", /* 259 = freebsd32_aio_readv */
"#260", /* 260 = nosys */
"#261", /* 261 = nosys */
"#262", /* 262 = nosys */
Modified: projects/aio_writev/sys/compat/freebsd32/freebsd32_sysent.c
==============================================================================
--- projects/aio_writev/sys/compat/freebsd32/freebsd32_sysent.c Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/compat/freebsd32/freebsd32_sysent.c Mon Dec 14 04:52:17 2020 (r368627)
@@ -320,8 +320,8 @@ struct sysent freebsd32_sysent[] = {
{ .sy_narg = AS(freebsd32_aio_read_args), .sy_call = (sy_call_t *)freebsd32_aio_read, .sy_auevent = AUE_AIO_READ, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 255 = freebsd32_aio_read */
{ .sy_narg = AS(freebsd32_aio_write_args), .sy_call = (sy_call_t *)freebsd32_aio_write, .sy_auevent = AUE_AIO_WRITE, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 256 = freebsd32_aio_write */
{ .sy_narg = AS(freebsd32_lio_listio_args), .sy_call = (sy_call_t *)freebsd32_lio_listio, .sy_auevent = AUE_LIO_LISTIO, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 257 = freebsd32_lio_listio */
- { .sy_narg = AS(freebsd32_aio_writev_args), .sy_call = (sy_call_t *)freebsd32_aio_writev, .sy_auevent = AUE_AIO_WRITEV, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 258 = freebsd32_aio_writev */
- { .sy_narg = 0, .sy_call = (sy_call_t *)nosys, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_ABSENT }, /* 259 = nosys */
+ { .sy_narg = AS(freebsd32_aio_writev_args), .sy_call = (sy_call_t *)freebsd32_aio_writev, .sy_auevent = AUE_AIO_WRITEV, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 258 = freebsd32_aio_writev */
+ { .sy_narg = AS(freebsd32_aio_readv_args), .sy_call = (sy_call_t *)freebsd32_aio_readv, .sy_auevent = AUE_AIO_READV, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 259 = freebsd32_aio_readv */
{ .sy_narg = 0, .sy_call = (sy_call_t *)nosys, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_ABSENT }, /* 260 = nosys */
{ .sy_narg = 0, .sy_call = (sy_call_t *)nosys, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_ABSENT }, /* 261 = nosys */
{ .sy_narg = 0, .sy_call = (sy_call_t *)nosys, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_ABSENT }, /* 262 = nosys */
Modified: projects/aio_writev/sys/compat/freebsd32/freebsd32_systrace_args.c
==============================================================================
--- projects/aio_writev/sys/compat/freebsd32/freebsd32_systrace_args.c Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/compat/freebsd32/freebsd32_systrace_args.c Mon Dec 14 04:52:17 2020 (r368627)
@@ -1291,6 +1291,13 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
*n_args = 1;
break;
}
+ /* freebsd32_aio_readv */
+ case 259: {
+ struct freebsd32_aio_readv_args *p = params;
+ uarg[0] = (intptr_t) p->aiocbp; /* struct aiocb32 * */
+ *n_args = 1;
+ break;
+ }
/* lchmod */
case 274: {
struct lchmod_args *p = params;
@@ -5428,6 +5435,16 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
break;
};
break;
+ /* freebsd32_aio_readv */
+ case 259:
+ switch(ndx) {
+ case 0:
+ p = "userland struct aiocb32 *";
+ break;
+ default:
+ break;
+ };
+ break;
/* lchmod */
case 274:
switch(ndx) {
@@ -9887,6 +9904,11 @@ systrace_return_setargdesc(int sysnum, int ndx, char *
break;
/* freebsd32_aio_writev */
case 258:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
+ /* freebsd32_aio_readv */
+ case 259:
if (ndx == 0 || ndx == 1)
p = "int";
break;
Modified: projects/aio_writev/sys/compat/freebsd32/syscalls.master
==============================================================================
--- projects/aio_writev/sys/compat/freebsd32/syscalls.master Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/compat/freebsd32/syscalls.master Mon Dec 14 04:52:17 2020 (r368627)
@@ -495,7 +495,8 @@
int nent, struct sigevent32 *sig); }
258 AUE_AIO_WRITEV STD { int freebsd32_aio_writev( \
struct aiocb32 *aiocbp); }
-259 AUE_NULL UNIMPL nosys
+259 AUE_AIO_READV STD { int freebsd32_aio_readv( \
+ struct aiocb32 *aiocbp); }
260 AUE_NULL UNIMPL nosys
261 AUE_NULL UNIMPL nosys
262 AUE_NULL UNIMPL nosys
Modified: projects/aio_writev/sys/kern/capabilities.conf
==============================================================================
--- projects/aio_writev/sys/kern/capabilities.conf Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/kern/capabilities.conf Mon Dec 14 04:52:17 2020 (r368627)
@@ -96,6 +96,7 @@ aio_suspend
aio_waitcomplete
aio_write
aio_writev
+aio_readv
##
## audit(2) is a global operation, submitting to the global trail, but it is
Modified: projects/aio_writev/sys/kern/init_sysent.c
==============================================================================
--- projects/aio_writev/sys/kern/init_sysent.c Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/kern/init_sysent.c Mon Dec 14 04:52:17 2020 (r368627)
@@ -313,8 +313,8 @@ struct sysent sysent[] = {
{ .sy_narg = AS(aio_read_args), .sy_call = (sy_call_t *)sys_aio_read, .sy_auevent = AUE_AIO_READ, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 255 = aio_read */
{ .sy_narg = AS(aio_write_args), .sy_call = (sy_call_t *)sys_aio_write, .sy_auevent = AUE_AIO_WRITE, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 256 = aio_write */
{ .sy_narg = AS(lio_listio_args), .sy_call = (sy_call_t *)sys_lio_listio, .sy_auevent = AUE_LIO_LISTIO, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 257 = lio_listio */
- { .sy_narg = AS(aio_writev_args), .sy_call = (sy_call_t *)sys_aio_writev, .sy_auevent = AUE_AIO_WRITEV, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 258 = aio_writev */
- { .sy_narg = 0, .sy_call = (sy_call_t *)nosys, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_ABSENT }, /* 259 = nosys */
+ { .sy_narg = AS(aio_writev_args), .sy_call = (sy_call_t *)sys_aio_writev, .sy_auevent = AUE_AIO_WRITEV, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 258 = aio_writev */
+ { .sy_narg = AS(aio_readv_args), .sy_call = (sy_call_t *)sys_aio_readv, .sy_auevent = AUE_AIO_READV, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 259 = aio_readv */
{ .sy_narg = 0, .sy_call = (sy_call_t *)nosys, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_ABSENT }, /* 260 = nosys */
{ .sy_narg = 0, .sy_call = (sy_call_t *)nosys, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_ABSENT }, /* 261 = nosys */
{ .sy_narg = 0, .sy_call = (sy_call_t *)nosys, .sy_auevent = AUE_NULL, .sy_flags = 0, .sy_thrcnt = SY_THR_ABSENT }, /* 262 = nosys */
Modified: projects/aio_writev/sys/kern/syscalls.c
==============================================================================
--- projects/aio_writev/sys/kern/syscalls.c Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/kern/syscalls.c Mon Dec 14 04:52:17 2020 (r368627)
@@ -265,7 +265,7 @@ const char *syscallnames[] = {
"aio_write", /* 256 = aio_write */
"lio_listio", /* 257 = lio_listio */
"aio_writev", /* 258 = aio_writev */
- "#259", /* 259 = nosys */
+ "aio_readv", /* 259 = aio_readv */
"#260", /* 260 = nosys */
"#261", /* 261 = nosys */
"#262", /* 262 = nosys */
Modified: projects/aio_writev/sys/kern/syscalls.master
==============================================================================
--- projects/aio_writev/sys/kern/syscalls.master Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/kern/syscalls.master Mon Dec 14 04:52:17 2020 (r368627)
@@ -1482,7 +1482,12 @@
_Inout_ struct aiocb *aiocbp
);
}
-259-271 AUE_NULL UNIMPL nosys
+259 AUE_AIO_READV STD {
+ int aio_readv(
+ _Inout_ struct aiocb *aiocbp
+ );
+ }
+260-271 AUE_NULL UNIMPL nosys
272 AUE_O_GETDENTS COMPAT11 {
int getdents(
int fd,
Modified: projects/aio_writev/sys/kern/systrace_args.c
==============================================================================
--- projects/aio_writev/sys/kern/systrace_args.c Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/kern/systrace_args.c Mon Dec 14 04:52:17 2020 (r368627)
@@ -1327,6 +1327,13 @@ systrace_args(int sysnum, void *params, uint64_t *uarg
*n_args = 1;
break;
}
+ /* aio_readv */
+ case 259: {
+ struct aio_readv_args *p = params;
+ uarg[0] = (intptr_t) p->aiocbp; /* struct aiocb * */
+ *n_args = 1;
+ break;
+ }
/* lchmod */
case 274: {
struct lchmod_args *p = params;
@@ -5479,6 +5486,16 @@ systrace_entry_setargdesc(int sysnum, int ndx, char *d
break;
};
break;
+ /* aio_readv */
+ case 259:
+ switch(ndx) {
+ case 0:
+ p = "userland struct aiocb *";
+ break;
+ default:
+ break;
+ };
+ break;
/* lchmod */
case 274:
switch(ndx) {
@@ -9814,6 +9831,11 @@ systrace_return_setargdesc(int sysnum, int ndx, char *
break;
/* aio_writev */
case 258:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
+ /* aio_readv */
+ case 259:
if (ndx == 0 || ndx == 1)
p = "int";
break;
Modified: projects/aio_writev/sys/kern/vfs_aio.c
==============================================================================
--- projects/aio_writev/sys/kern/vfs_aio.c Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/kern/vfs_aio.c Mon Dec 14 04:52:17 2020 (r368627)
@@ -765,9 +765,11 @@ aio_process_rw(struct kaiocb *job)
long msgrcv_st, msgrcv_end;
long oublock_st, oublock_end;
long inblock_st, inblock_end;
- int error;
+ int error, opcode;
+ bool vectored;
KASSERT(job->uaiocb.aio_lio_opcode == LIO_READ ||
+ job->uaiocb.aio_lio_opcode == LIO_READV ||
job->uaiocb.aio_lio_opcode == LIO_WRITE ||
job->uaiocb.aio_lio_opcode == LIO_WRITEV,
("%s: opcode %d", __func__, job->uaiocb.aio_lio_opcode));
@@ -779,7 +781,9 @@ aio_process_rw(struct kaiocb *job)
cb = &job->uaiocb;
fp = job->fd_file;
- if (job->uaiocb.aio_lio_opcode == LIO_WRITEV) {
+ opcode = job->uaiocb.aio_lio_opcode;
+ vectored = opcode == LIO_WRITEV || opcode == LIO_READV;
+ if (vectored) {
error = copyinuio(job->uaiocb.aio_iov, job->uaiocb.aio_iovcnt,
&auiop);
if (error)
@@ -807,7 +811,7 @@ aio_process_rw(struct kaiocb *job)
* aio_aqueue() acquires a reference to the file that is
* released in aio_free_entry().
*/
- if (cb->aio_lio_opcode == LIO_READ) {
+ if (opcode == LIO_READ || opcode == LIO_READV) {
auiop->uio_rw = UIO_READ;
if (auiop->uio_resid == 0)
error = 0;
@@ -832,7 +836,9 @@ aio_process_rw(struct kaiocb *job)
if ((error) && (auiop->uio_resid != cnt)) {
if (error == ERESTART || error == EINTR || error == EWOULDBLOCK)
error = 0;
- if ((error == EPIPE) && (cb->aio_lio_opcode == LIO_WRITE)) {
+ if ((error == EPIPE) &&
+ (opcode == LIO_WRITE || opcode == LIO_WRITEV))
+ {
PROC_LOCK(job->userproc);
kern_psignal(job->userproc, SIGPIPE);
PROC_UNLOCK(job->userproc);
@@ -840,7 +846,7 @@ aio_process_rw(struct kaiocb *job)
}
cnt -= auiop->uio_resid;
- if (job->uaiocb.aio_lio_opcode == LIO_WRITEV)
+ if (vectored)
free(auiop, M_IOV);
out:
td->td_ucred = td_savedcred;
@@ -1248,7 +1254,8 @@ aio_qbio(struct proc *p, struct kaiocb *job)
if (!(opcode == LIO_WRITE ||
opcode == LIO_WRITEV ||
- opcode == LIO_READ))
+ opcode == LIO_READ ||
+ opcode == LIO_READV))
return (-1);
if (fp == NULL || fp->f_type != DTYPE_VNODE)
return (-1);
@@ -1261,7 +1268,7 @@ aio_qbio(struct proc *p, struct kaiocb *job)
bio_cmd = opcode == LIO_WRITE || opcode == LIO_WRITEV ? BIO_WRITE :
BIO_READ;
- vectored = opcode == LIO_WRITEV;
+ vectored = opcode == LIO_WRITEV || opcode == LIO_READV;
if (vectored) {
iovcnt = cb->aio_iovcnt;
if (iovcnt > max_buf_aio)
@@ -1271,11 +1278,6 @@ aio_qbio(struct proc *p, struct kaiocb *job)
return (error);
for (i = 0; i < iovcnt; i++) {
if (auiop->uio_iov[i].iov_len % vp->v_bufobj.bo_bsize) {
- // TODO: are there any disk-like devices that
- // would balk here but would work with
- // aio_process_rw? I don't know of any. With
- // md, at least, aio_process_rw calls physio,
- // which has this same problem.
error = -1;
goto free_uio;
}
@@ -1358,7 +1360,7 @@ aio_qbio(struct proc *p, struct kaiocb *job)
bp->bio_caller2 = (void *)pbuf;
prot = VM_PROT_READ;
- if (cb->aio_lio_opcode == LIO_READ)
+ if (opcode == LIO_READ || opcode == LIO_READV)
prot |= VM_PROT_WRITE; /* Less backwards than it looks */
npages = vm_fault_quick_hold_pages(&curproc->p_vmspace->vm_map,
(vm_offset_t)buf, bp->bio_length, prot, pages,
@@ -1608,6 +1610,7 @@ aio_aqueue(struct thread *td, struct aiocb *ujob, stru
error = fget_write(td, fd, &cap_pwrite_rights, &fp);
break;
case LIO_READ:
+ case LIO_READV:
error = fget_read(td, fd, &cap_pread_rights, &fp);
break;
case LIO_SYNC:
@@ -1633,7 +1636,8 @@ aio_aqueue(struct thread *td, struct aiocb *ujob, stru
goto aqueue_fail;
}
- if ((opcode == LIO_READ || opcode == LIO_WRITE || opcode == LIO_WRITEV)
+ if ((opcode == LIO_READ || opcode == LIO_READV
+ || opcode == LIO_WRITE || opcode == LIO_WRITEV)
&& job->uaiocb.aio_offset < 0
&& (fp->f_vnode == NULL || fp->f_vnode->v_type != VCHR)) {
error = EINVAL;
@@ -1691,7 +1695,7 @@ no_kqueue:
error = 0;
} else if (fp->f_ops->fo_aio_queue == NULL)
error = aio_queue_file(fp, job);
- else if (opcode == LIO_WRITEV)
+ else if (opcode == LIO_WRITEV || opcode == LIO_READV)
error = EOPNOTSUPP;
else
error = fo_aio_queue(fp, job);
@@ -1797,6 +1801,7 @@ aio_queue_file(struct file *fp, struct kaiocb *job)
switch (job->uaiocb.aio_lio_opcode) {
case LIO_READ:
+ case LIO_READV:
case LIO_WRITE:
case LIO_WRITEV:
aio_schedule(job, aio_process_rw);
@@ -2172,6 +2177,13 @@ sys_aio_read(struct thread *td, struct aio_read_args *
return (aio_aqueue(td, uap->aiocbp, NULL, LIO_READ, &aiocb_ops));
}
+int
+sys_aio_readv(struct thread *td, struct aio_readv_args *uap)
+{
+
+ return (aio_aqueue(td, uap->aiocbp, NULL, LIO_READV, &aiocb_ops));
+}
+
/* syscall - asynchronous write to a file (REALTIME) */
#ifdef COMPAT_FREEBSD6
int
@@ -2425,8 +2437,10 @@ aio_biowakeup(struct bio *bp)
struct kaioinfo *ki;
struct buf *pbuf = (struct buf*)bp->bio_caller2;;
size_t nbytes;
- int error, nblks;
+ int error, opcode, nblks;
+ opcode = job->uaiocb.aio_lio_opcode;
+
/* Release mapping into kernel space. */
if (pbuf != NULL) {
pmap_qremove((vm_offset_t)pbuf->b_data, bp->bio_ma_n);
@@ -2451,7 +2465,7 @@ aio_biowakeup(struct bio *bp)
// of whichever failed bio completed last.
if (bp->bio_flags & BIO_ERROR)
atomic_set_int(&job->error, bp->bio_error);
- if (job->uaiocb.aio_lio_opcode == LIO_WRITE)
+ if (opcode == LIO_WRITE || opcode == LIO_WRITEV)
atomic_add_int(&job->outblock, nblks);
else
atomic_add_int(&job->inblock, nblks);
@@ -2923,6 +2937,14 @@ freebsd32_aio_read(struct thread *td, struct freebsd32
{
return (aio_aqueue(td, (struct aiocb *)uap->aiocbp, NULL, LIO_READ,
+ &aiocb32_ops));
+}
+
+int
+freebsd32_aio_readv(struct thread *td, struct freebsd32_aio_readv_args *uap)
+{
+
+ return (aio_aqueue(td, (struct aiocb *)uap->aiocbp, NULL, LIO_READV,
&aiocb32_ops));
}
Modified: projects/aio_writev/sys/sys/aio.h
==============================================================================
--- projects/aio_writev/sys/sys/aio.h Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/sys/aio.h Mon Dec 14 04:52:17 2020 (r368627)
@@ -216,6 +216,7 @@ __BEGIN_DECLS
* Asynchronously read from a file
*/
int aio_read(struct aiocb *);
+int aio_readv(struct aiocb *);
/*
* Asynchronously write to file
Modified: projects/aio_writev/sys/sys/syscall.h
==============================================================================
--- projects/aio_writev/sys/sys/syscall.h Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/sys/syscall.h Mon Dec 14 04:52:17 2020 (r368627)
@@ -235,6 +235,7 @@
#define SYS_aio_write 256
#define SYS_lio_listio 257
#define SYS_aio_writev 258
+#define SYS_aio_readv 259
#define SYS_freebsd11_getdents 272
#define SYS_lchmod 274
/* 275 is obsolete netbsd_lchown */
Modified: projects/aio_writev/sys/sys/syscall.mk
==============================================================================
--- projects/aio_writev/sys/sys/syscall.mk Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/sys/syscall.mk Mon Dec 14 04:52:17 2020 (r368627)
@@ -169,6 +169,7 @@ MIASM = \
aio_write.o \
lio_listio.o \
aio_writev.o \
+ aio_readv.o \
freebsd11_getdents.o \
lchmod.o \
lutimes.o \
Modified: projects/aio_writev/sys/sys/sysproto.h
==============================================================================
--- projects/aio_writev/sys/sys/sysproto.h Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/sys/sys/sysproto.h Mon Dec 14 04:52:17 2020 (r368627)
@@ -717,6 +717,9 @@ struct lio_listio_args {
struct aio_writev_args {
char aiocbp_l_[PADL_(struct aiocb *)]; struct aiocb * aiocbp; char aiocbp_r_[PADR_(struct aiocb *)];
};
+struct aio_readv_args {
+ char aiocbp_l_[PADL_(struct aiocb *)]; struct aiocb * aiocbp; char aiocbp_r_[PADR_(struct aiocb *)];
+};
struct lchmod_args {
char path_l_[PADL_(const char *)]; const char * path; char path_r_[PADR_(const char *)];
char mode_l_[PADL_(mode_t)]; mode_t mode; char mode_r_[PADR_(mode_t)];
@@ -1995,6 +1998,7 @@ int sys_aio_read(struct thread *, struct aio_read_args
int sys_aio_write(struct thread *, struct aio_write_args *);
int sys_lio_listio(struct thread *, struct lio_listio_args *);
int sys_aio_writev(struct thread *, struct aio_writev_args *);
+int sys_aio_readv(struct thread *, struct aio_readv_args *);
int sys_lchmod(struct thread *, struct lchmod_args *);
int sys_lutimes(struct thread *, struct lutimes_args *);
int sys_preadv(struct thread *, struct preadv_args *);
@@ -2906,6 +2910,7 @@ int freebsd12_closefrom(struct thread *, struct freebs
#define SYS_AUE_aio_write AUE_AIO_WRITE
#define SYS_AUE_lio_listio AUE_LIO_LISTIO
#define SYS_AUE_aio_writev AUE_AIO_WRITEV
+#define SYS_AUE_aio_readv AUE_AIO_READV
#define SYS_AUE_freebsd11_getdents AUE_O_GETDENTS
#define SYS_AUE_lchmod AUE_LCHMOD
#define SYS_AUE_lutimes AUE_LUTIMES
Modified: projects/aio_writev/tests/sys/aio/aio_test.c
==============================================================================
--- projects/aio_writev/tests/sys/aio/aio_test.c Mon Dec 14 00:54:05 2020 (r368626)
+++ projects/aio_writev/tests/sys/aio/aio_test.c Mon Dec 14 04:52:17 2020 (r368627)
@@ -302,11 +302,9 @@ aio_writev_test(struct aio_context *ac, completion com
aio.aio_offset = 0;
len0 = ac->ac_buflen * 3 / 4;
len1 = ac->ac_buflen / 4;
- // TODO: once aio_readv is ready, swap the offsets of the two parts of
- // the buffer.
- iov[0].iov_base = ac->ac_buffer;
+ iov[0].iov_base = ac->ac_buffer + len1;
iov[0].iov_len = len0;
- iov[1].iov_base = ac->ac_buffer + len0;
+ iov[1].iov_base = ac->ac_buffer;
iov[1].iov_len = len1;
aio.aio_iov = iov;
aio.aio_iovcnt = 2;
@@ -357,6 +355,43 @@ aio_read_test(struct aio_context *ac, completion comp,
atf_tc_fail("buffer mismatched");
}
+static void
+aio_readv_test(struct aio_context *ac, completion comp, struct sigevent *sev)
+{
+ struct aiocb aio;
+ struct iovec iov[2];
+ size_t len0, len1;
+ ssize_t len;
+
+ bzero(ac->ac_buffer, ac->ac_buflen);
+ bzero(&aio, sizeof(aio));
+ aio.aio_fildes = ac->ac_write_fd;
+ aio.aio_offset = 0;
+ len0 = ac->ac_buflen * 3 / 4;
+ len1 = ac->ac_buflen / 4;
+ iov[0].iov_base = ac->ac_buffer + len1;
+ iov[0].iov_len = len0;
+ iov[1].iov_base = ac->ac_buffer;
+ iov[1].iov_len = len1;
+ aio.aio_iov = iov;
+ aio.aio_iovcnt = 2;
+ if (sev)
+ aio.aio_sigevent = *sev;
+
+ if (aio_readv(&aio) < 0)
+ atf_tc_fail("aio_read failed: %s", strerror(errno));
+
+ len = comp(&aio);
+ if (len < 0)
+ atf_tc_fail("aio failed: %s", strerror(errno));
+
+ ATF_REQUIRE_EQ_MSG(len, ac->ac_buflen,
+ "aio short read (%jd)", (intmax_t)len);
+
+ if (aio_test_buffer(ac->ac_buffer, ac->ac_buflen, ac->ac_seed) == 0)
+ atf_tc_fail("buffer mismatched");
+}
+
/*
* Series of type-specific tests for AIO. For now, we just make sure we can
* issue a write and then a read to each type. We assume that once a write
@@ -383,11 +418,13 @@ aio_file_test(completion comp, struct sigevent *sev, b
ATF_REQUIRE_MSG(fd != -1, "open failed: %s", strerror(errno));
aio_context_init(&ac, fd, fd, FILE_LEN);
- if (vectored)
+ if (vectored) {
aio_writev_test(&ac, comp, sev);
- else
+ aio_readv_test(&ac, comp, sev);
+ } else {
aio_write_test(&ac, comp, sev);
- aio_read_test(&ac, comp, sev);
+ aio_read_test(&ac, comp, sev);
+ }
close(fd);
}
@@ -754,11 +791,13 @@ aio_md_test(completion comp, struct sigevent *sev, boo
fd = aio_md_setup();
aio_context_init(&ac, fd, fd, MD_LEN);
- if (vectored)
+ if (vectored) {
aio_writev_test(&ac, comp, sev);
- else
+ aio_readv_test(&ac, comp, sev);
+ } else {
aio_write_test(&ac, comp, sev);
- aio_read_test(&ac, comp, sev);
+ aio_read_test(&ac, comp, sev);
+ }
close(fd);
}
@@ -1441,7 +1480,26 @@ ATF_TC_BODY(vectored_big_iovcnt, tc)
if (len != buflen)
atf_tc_fail("aio short write (%jd)", (intmax_t)len);
- // TODO: aio_readv
+
+ bzero(&aio, sizeof(aio));
+ aio.aio_fildes = fd;
+ aio.aio_offset = 0;
+ aio.aio_iov = iov;
+ aio.aio_iovcnt = max_buf_aio + 1;
+
+ if (aio_readv(&aio) < 0)
+ atf_tc_fail("aio_readv failed: %s", strerror(errno));
+
+ len = poll(&aio);
+ if (len < 0)
+ atf_tc_fail("aio failed: %s", strerror(errno));
+
+ if (len != buflen)
+ atf_tc_fail("aio short read (%jd)", (intmax_t)len);
+
+ if (aio_test_buffer(buffer, buflen, seed) == 0)
+ atf_tc_fail("buffer mismatched");
+
close(fd);
}
ATF_TC_CLEANUP(vectored_big_iovcnt, tc)
@@ -1532,7 +1590,20 @@ ATF_TC_BODY(vectored_unaligned, tc)
if (len != total_len)
atf_tc_fail("aio short write (%jd)", (intmax_t)len);
- // TODO: aio_readv
+
+ bzero(&aio, sizeof(aio));
+ aio.aio_fildes = ac.ac_read_fd;
+ aio.aio_offset = 0;
+ aio.aio_iov = iov;
+ aio.aio_iovcnt = 3;
+
+ if (aio_readv(&aio) < 0)
+ atf_tc_fail("aio_readv failed: %s", strerror(errno));
+ len = poll(&aio);
+
+ ATF_REQUIRE_MSG(aio_test_buffer(ac.ac_buffer, total_len,
+ ac.ac_seed) != 0, "aio_test_buffer: internal error");
+
close(fd);
}
ATF_TC_CLEANUP(vectored_unaligned, tc)
@@ -1548,11 +1619,13 @@ aio_zvol_test(completion comp, struct sigevent *sev, b
fd = aio_zvol_setup();
aio_context_init(&ac, fd, fd, MD_LEN);
- if (vectored)
+ if (vectored) {
aio_writev_test(&ac, comp, sev);
- else
+ aio_readv_test(&ac, comp, sev);
+ } else {
aio_write_test(&ac, comp, sev);
- aio_read_test(&ac, comp, sev);
+ aio_read_test(&ac, comp, sev);
+ }
close(fd);
}
More information about the svn-src-projects
mailing list