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>