Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Dec 2020 04:52:18 +0000 (UTC)
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r368627 - in projects/aio_writev: lib/libc/sys sys/bsm sys/compat/freebsd32 sys/kern sys/sys tests/sys/aio
Message-ID:  <202012140452.0BE4qILC096928@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202012140452.0BE4qILC096928>