svn commit: r293390 - in head: share/man/man4 sys/dev/ioat

Conrad E. Meyer cem at FreeBSD.org
Thu Jan 7 23:02:17 UTC 2016


Author: cem
Date: Thu Jan  7 23:02:15 2016
New Revision: 293390
URL: https://svnweb.freebsd.org/changeset/base/293390

Log:
  ioat(4): Add ioat_acquire_reserve() KPI
  
  ioat_acquire_reserve() is an extended version of ioat_acquire().  It
  allows users to reserve space in the channel for some number of
  descriptors.  If this succeeds, it guarantees that at least submission
  of N valid descriptors will succeed.
  
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  head/share/man/man4/ioat.4
  head/sys/dev/ioat/ioat.c
  head/sys/dev/ioat/ioat.h

Modified: head/share/man/man4/ioat.4
==============================================================================
--- head/share/man/man4/ioat.4	Thu Jan  7 22:59:09 2016	(r293389)
+++ head/share/man/man4/ioat.4	Thu Jan  7 23:02:15 2016	(r293390)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd January 5, 2016
+.Dd January 7, 2016
 .Dt IOAT 4
 .Os
 .Sh NAME
@@ -73,6 +73,8 @@ In
 .Fn ioat_get_max_coalesce_period "bus_dmaengine_t dmaengine"
 .Ft void
 .Fn ioat_acquire "bus_dmaengine_t dmaengine"
+.Ft int
+.Fn ioat_acquire_reserve "bus_dmaengine_t dmaengine" "uint32_t n" "int mflags"
 .Ft void
 .Fn ioat_release "bus_dmaengine_t dmaengine"
 .Ft struct bus_dmadesc *
@@ -178,6 +180,14 @@ When the user wants to offload a copy, t
 the
 .Ar bus_dmaengine_t
 object for exclusive access to enqueue operations on that channel.
+Optionally, the user can reserve space by using
+.Fn ioat_acquire_reserve
+instead.
+If
+.Fn ioat_acquire_reserve
+succeeds, there is guaranteed to be room for
+.Fa N
+new operations in the internal ring buffer.
 Then, they will submit one or more operations using
 .Fn ioat_blockfill ,
 .Fn ioat_copy ,

Modified: head/sys/dev/ioat/ioat.c
==============================================================================
--- head/sys/dev/ioat/ioat.c	Thu Jan  7 22:59:09 2016	(r293389)
+++ head/sys/dev/ioat/ioat.c	Thu Jan  7 23:02:15 2016	(r293390)
@@ -789,6 +789,21 @@ ioat_acquire(bus_dmaengine_t dmaengine)
 	CTR0(KTR_IOAT, __func__);
 }
 
+int
+ioat_acquire_reserve(bus_dmaengine_t dmaengine, unsigned n, int mflags)
+{
+	struct ioat_softc *ioat;
+	int error;
+
+	ioat = to_ioat_softc(dmaengine);
+	ioat_acquire(dmaengine);
+
+	error = ioat_reserve_space(ioat, n, mflags);
+	if (error != 0)
+		ioat_release(dmaengine);
+	return (error);
+}
+
 void
 ioat_release(bus_dmaengine_t dmaengine)
 {

Modified: head/sys/dev/ioat/ioat.h
==============================================================================
--- head/sys/dev/ioat/ioat.h	Thu Jan  7 22:59:09 2016	(r293389)
+++ head/sys/dev/ioat/ioat.h	Thu Jan  7 23:02:15 2016	(r293390)
@@ -96,13 +96,26 @@ uint16_t ioat_get_max_coalesce_period(bu
 
 /*
  * Acquire must be called before issuing an operation to perform. Release is
- * called after. Multiple operations can be issued within the context of one
+ * called after.  Multiple operations can be issued within the context of one
  * acquire and release
  */
 void ioat_acquire(bus_dmaengine_t dmaengine);
 void ioat_release(bus_dmaengine_t dmaengine);
 
 /*
+ * Acquire_reserve can be called to ensure there is room for N descriptors.  If
+ * it succeeds, the next N valid operations will successfully enqueue.
+ *
+ * It may fail with:
+ *   - ENXIO if the channel is in an errored state, or the driver is being
+ *     unloaded
+ *   - EAGAIN if mflags included M_NOWAIT
+ *
+ * On failure, the caller does not hold the dmaengine.
+ */
+int ioat_acquire_reserve(bus_dmaengine_t dmaengine, unsigned n, int mflags);
+
+/*
  * Issue a blockfill operation.  The 64-bit pattern 'fillpattern' is written to
  * 'len' physically contiguous bytes at 'dst'.
  *


More information about the svn-src-head mailing list