Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Jul 2016 22:49:47 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r303164 - in head: lib/libc/sys share/man/man4 sys/kern
Message-ID:  <201607212249.u6LMnlEJ076651@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Thu Jul 21 22:49:47 2016
New Revision: 303164
URL: https://svnweb.freebsd.org/changeset/base/303164

Log:
  Add more documentation regarding unsafe AIO requests.
  
  The asynchronous I/O changes made previously result in different
  behavior out of the box. Previously all AIO requests failed with
  ENOSYS / SIGSYS unless aio.ko was explicitly loaded. Now, some AIO
  requests complete and others ("unsafe" requests) fail with EOPNOTSUPP.
  
  Reword the introductory paragraph in aio(4) to add a general
  description of AIO before describing the vfs.aio.enable_unsafe sysctl.
  
  Remove the ENOSYS error description from aio_fsync(2), aio_read(2),
  and aio_write(2) and replace it with a description of EOPNOTSUPP.
  
  Remove the ENOSYS error description from aio_mlock(2).
  
  Log a message to the system log the first time a process requests an
  "unsafe" AIO request that fails with EOPNOTSUPP. This is modeled on
  the log message used for processes using the legacy pty devices.
  
  Reviewed by:	kib (earlier version)
  MFC after:	1 week
  Sponsored by:	Chelsio Communications
  Differential Revision:	https://reviews.freebsd.org/D7151

Modified:
  head/lib/libc/sys/aio_fsync.2
  head/lib/libc/sys/aio_mlock.2
  head/lib/libc/sys/aio_read.2
  head/lib/libc/sys/aio_write.2
  head/share/man/man4/aio.4
  head/sys/kern/vfs_aio.c

Modified: head/lib/libc/sys/aio_fsync.2
==============================================================================
--- head/lib/libc/sys/aio_fsync.2	Thu Jul 21 22:13:40 2016	(r303163)
+++ head/lib/libc/sys/aio_fsync.2	Thu Jul 21 22:49:47 2016	(r303164)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 15, 2016
+.Dd July 21, 2016
 .Dt AIO_FSYNC 2
 .Os
 .Sh NAME
@@ -107,10 +107,10 @@ The request was not queued because of sy
 The asynchronous notification method in
 .Fa iocb->aio_sigevent.sigev_notify
 is invalid or not supported.
-.It Bq Er ENOSYS
-The
-.Fn aio_fsync
-system call is not supported.
+.It Bq Er EOPNOTSUPP
+Asynchronous file synchronization operations on the file descriptor
+.Fa iocb->aio_fildes
+are unsafe and unsafe asynchronous I/O operations are disabled.
 .It Bq Er EINVAL
 A value of the
 .Fa op

Modified: head/lib/libc/sys/aio_mlock.2
==============================================================================
--- head/lib/libc/sys/aio_mlock.2	Thu Jul 21 22:13:40 2016	(r303163)
+++ head/lib/libc/sys/aio_mlock.2	Thu Jul 21 22:49:47 2016	(r303164)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 15, 2016
+.Dd July 21, 2016
 .Dt AIO_MLOCK 2
 .Os
 .Sh NAME
@@ -102,10 +102,6 @@ The request was not queued because of sy
 The asynchronous notification method in
 .Fa iocb->aio_sigevent.sigev_notify
 is invalid or not supported.
-.It Bq Er ENOSYS
-The
-.Fn aio_mlock
-system call is not supported.
 .El
 .Pp
 If the request is successfully enqueued, but subsequently cancelled

Modified: head/lib/libc/sys/aio_read.2
==============================================================================
--- head/lib/libc/sys/aio_read.2	Thu Jul 21 22:13:40 2016	(r303163)
+++ head/lib/libc/sys/aio_read.2	Thu Jul 21 22:49:47 2016	(r303164)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 15, 2016
+.Dd July 21, 2016
 .Dt AIO_READ 2
 .Os
 .Sh NAME
@@ -125,10 +125,10 @@ The request was not queued because of sy
 The asynchronous notification method in
 .Fa iocb->aio_sigevent.sigev_notify
 is invalid or not supported.
-.It Bq Er ENOSYS
-The
-.Fn aio_read
-system call is not supported.
+.It Bq Er EOPNOTSUPP
+Asynchronous read operations on the file descriptor
+.Fa iocb->aio_fildes
+are unsafe and unsafe asynchronous I/O operations are disabled.
 .El
 .Pp
 The following conditions may be synchronously detected when the

Modified: head/lib/libc/sys/aio_write.2
==============================================================================
--- head/lib/libc/sys/aio_write.2	Thu Jul 21 22:13:40 2016	(r303163)
+++ head/lib/libc/sys/aio_write.2	Thu Jul 21 22:49:47 2016	(r303164)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 15, 2016
+.Dd July 21, 2016
 .Dt AIO_WRITE 2
 .Os
 .Sh NAME
@@ -129,10 +129,10 @@ The request was not queued because of sy
 The asynchronous notification method in
 .Fa iocb->aio_sigevent.sigev_notify
 is invalid or not supported.
-.It Bq Er ENOSYS
-The
-.Fn aio_write
-system call is not supported.
+.It Bq Er EOPNOTSUPP
+Asynchronous write operations on the file descriptor
+.Fa iocb->aio_fildes
+are unsafe and unsafe asynchronous I/O operations are disabled.
 .El
 .Pp
 The following conditions may be synchronously detected when the

Modified: head/share/man/man4/aio.4
==============================================================================
--- head/share/man/man4/aio.4	Thu Jul 21 22:13:40 2016	(r303163)
+++ head/share/man/man4/aio.4	Thu Jul 21 22:49:47 2016	(r303164)
@@ -27,7 +27,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 15, 2016
+.Dd July 21, 2016
 .Dt AIO 4
 .Os
 .Sh NAME
@@ -37,17 +37,25 @@
 The
 .Nm
 facility provides system calls for asynchronous I/O.
-However, asynchronous I/O operations are only enabled for certain file
-types by default.
-Asynchronous I/O operations for other file types may block an AIO daemon
-indefinitely resulting in process and/or system hangs.
-Asynchronous I/O operations can be enabled for all file types by setting
+Asynchronous I/O operations are not completed synchronously by the
+calling thread.
+Instead, the calling thread invokes one system call to request an
+asynchronous I/O operation.
+The status of a completed request is retrieved later via a separate
+system call.
+.Pp
+Asynchronous I/O operations on some file descriptor types may block an
+AIO daemon indefinitely resulting in process and/or system hangs.
+Operations on these file descriptor types are considered
+.Dq unsafe
+and disabled by default.
+They can be enabled by setting
 the
 .Va vfs.aio.enable_unsafe
 sysctl node to a non-zero value.
 .Pp
 Asynchronous I/O operations on sockets and raw disk devices do not block
-indefinitely and are enabled by default.
+indefinitely and are always enabled.
 .Pp
 The
 .Nm

Modified: head/sys/kern/vfs_aio.c
==============================================================================
--- head/sys/kern/vfs_aio.c	Thu Jul 21 22:13:40 2016	(r303163)
+++ head/sys/kern/vfs_aio.c	Thu Jul 21 22:49:47 2016	(r303164)
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/syscall.h>
 #include <sys/sysent.h>
 #include <sys/sysctl.h>
+#include <sys/syslog.h>
 #include <sys/sx.h>
 #include <sys/taskqueue.h>
 #include <sys/vnode.h>
@@ -110,6 +111,11 @@ static int enable_aio_unsafe = 0;
 SYSCTL_INT(_vfs_aio, OID_AUTO, enable_unsafe, CTLFLAG_RW, &enable_aio_unsafe, 0,
     "Permit asynchronous IO on all file types, not just known-safe types");
 
+static unsigned int unsafe_warningcnt = 1;
+SYSCTL_UINT(_vfs_aio, OID_AUTO, unsafe_warningcnt, CTLFLAG_RW,
+    &unsafe_warningcnt, 0,
+    "Warnings that will be triggered upon failed IO requests on unsafe files");
+
 static int max_aio_procs = MAX_AIO_PROCS;
 SYSCTL_INT(_vfs_aio, OID_AUTO, max_aio_procs, CTLFLAG_RW, &max_aio_procs, 0,
     "Maximum number of kernel processes to use for handling async IO ");
@@ -1697,8 +1703,11 @@ queueit:
 				safe = true;
 		}
 	}
-	if (!(safe || enable_aio_unsafe))
+	if (!(safe || enable_aio_unsafe)) {
+		counted_warning(&unsafe_warningcnt,
+		    "is attempting to use unsafe AIO requests");
 		return (EOPNOTSUPP);
+	}
 
 	if (opcode == LIO_SYNC) {
 		AIO_LOCK(ki);



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