2 .\" Copyright (c) 2009 Advanced Computing Technologies LLC
3 .\" Written by: John H. Baldwin <jhb@FreeBSD.org>
4 .\" All rights reserved.
6 .\" Redistribution and use in source and binary forms, with or without
7 .\" modification, are permitted provided that the following conditions
9 .\" 1. Redistributions of source code must retain the above copyright
10 .\" notice, this list of conditions and the following disclaimer.
11 .\" 2. Redistributions in binary form must reproduce the above copyright
12 .\" notice, this list of conditions and the following disclaimer in the
13 .\" documentation and/or other materials provided with the distribution.
15 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 .Nm sglist_append_mbuf ,
37 .Nm sglist_append_phys ,
38 .Nm sglist_append_uio ,
39 .Nm sglist_append_user ,
42 .Nm sglist_consume_uio ,
52 .Nd manage a scatter/gather list of physical memory addresses
57 .Fn sglist_alloc "int nsegs" "int mflags"
59 .Fn sglist_append "struct sglist *sg" "void *buf" "size_t len"
61 .Fn sglist_append_mbuf "struct sglist *sg" "struct mbuf *m"
63 .Fn sglist_append_phys "struct sglist *sg" "vm_paddr_t paddr" "size_t len"
65 .Fn sglist_append_uio "struct sglist *sg" "struct uio *uio"
67 .Fn sglist_append_user "struct sglist *sg" "void *buf" "size_t len" "struct thread *td"
69 .Fn sglist_build "void *buf" "size_t len" "int mflags"
71 .Fn sglist_clone "struct sglist *sg" "int mflags"
73 .Fn sglist_consume_uio "struct sglist *sg" "struct uio *uio" "int resid"
75 .Fn sglist_count "void *buf" "size_t len"
77 .Fn sglist_free "struct sglist *sg"
79 .Fn sglist_hold "struct sglist *sg"
81 .Fn sglist_init "struct sglist *sg" "int maxsegs" "struct sglist_seg *segs"
83 .Fn sglist_join "struct sglist *first" "struct sglist *second"
85 .Fn sglist_length "struct sglist *sg"
87 .Fn sglist_reset "struct sglist *sg"
89 .Fn sglist_slice "struct sglist *original" "struct sglist **slice" "size_t offset" "size_t length" "int mflags"
91 .Fn sglist_split "struct sglist *original" "struct sglist **head" "size_t length" "int mflags"
95 API manages physical address ranges.
96 Each list contains one or more elements.
97 Each element contains a starting physical address and a length.
98 Scatter/gather lists are read-only while they are shared.
99 If one wishes to alter an existing scatter/gather list and does not hold the
100 sole reference to the list,
101 then one should create a new list instead of modifying the existing list.
103 Each scatter/gather list object contains a reference count.
104 New lists are created with a single reference.
105 New references are obtained by calling
107 and are released by calling
109 .Ss Allocating and Initializing Lists
112 object consists of a header structure and a variable-length array of
113 scatter/gather list elements.
116 function allocates a new list that contains a header and
118 scatter/gather list elements.
121 argument can be set to either
128 function returns the number of scatter/gather list elements needed to describe
129 the physical address ranges mapped by a single kernel virtual address range.
130 The kernel virtual address range starts at
138 function allocates a new scatter/gather list object that describes the physical
139 address ranges mapped by a single kernel virtual address range.
140 The kernel virtual address range starts at
147 argument can be set to either
154 function returns a copy of an exising scatter/gather list object
158 argument can be set to either
162 This can be used to obtain a private copy of a scatter/gather list before
167 function initializes a scatter/gather list header.
168 The header is pointed to by
170 and is initialized to manage an array of
172 scatter/gather list elements pointed to by
174 This can be used to initialize a scatter/gather list header whose storage
177 In that case, the caller should not call
179 to release its own reference and is responsible for ensuring all other
180 references to the list are dropped before it releases the storage for
184 .Ss Constructing Scatter/Gather Lists
187 API provides several routines for building a scatter/gather list to describe
191 family of routines can be used to append the physical address ranges described
192 by an object to the end of a scatter/gather list.
193 All of these routines return 0 on success or an error on failure.
197 function appends the physical address ranges described by a single kernel
198 virtual address range to the scatter/gather list
200 The kernel virtual address range starts at
207 .Nm sglist_append_mbuf
208 function appends the physical address ranges described by an entire mbuf
211 to the scatter/gather list
215 .Nm sglist_append_phys
216 function appends a single physical address range to the scatter/gather list
218 The physical address range starts at
225 .Nm sglist_append_uio
226 function appends the physical address ranges described by a
228 object to the scatter/gather list
230 Note that it is the caller's responsibility to ensure that the pages backing
231 the I/O request are wired for the lifetime of
233 Note also that this routine does not modify
237 .Nm sglist_append_user
238 function appends the physical address ranges described by a single user
239 virtual address range to the scatter/gather list
241 The user virtual address range is relative to the address space of the thread
248 Note that it is the caller's responsibility to ensure that the pages backing
249 the user buffer are wired for the lifetime of
253 .Nm sglist_consume_uio
254 function is a variation of
255 .Nm sglist_append_uio .
257 .Nm sglist_append_uio ,
258 it appends the physical address ranges described by
260 to the scatter/gather list
263 .Nm sglist_append_uio ,
265 .Nm sglist_consume_uio
266 modifies the I/O request to indicate that the appended address ranges have
267 been processed similar to calling
269 This routine will only append ranges that describe up to
271 total bytes in length.
272 If the available segments in the scatter/gather list are exhausted before
277 structure will be updated to reflect the actual number of bytes processed,
279 .Nm sglist_consume_io
280 will return zero to indicate success.
281 In effect, this function will perform partial reads or writes.
282 The caller can compare the
286 before and after calling
287 .Nm sglist_consume_uio
288 to determine the actual number of bytes processed.
289 .Ss Manipulating Scatter/Gather Lists
292 function appends physical address ranges from the scatter/gather list
299 It returns zero on success or an error on failure.
303 function splits an existing scatter/gather list into two lists.
306 bytes described by the list
308 are moved to a new list
312 describes a total address range that is smaller than
315 then all of the address ranges will be moved to the new list at
319 will be an empty list.
320 The caller may supply an existing scatter/gather list in
322 If so, the list must be empty.
323 Otherwise, the caller may set
327 in which case a new scatter/gather list will be allocated.
336 list is modified by this call, it must be a private list with no other
340 function returns zero on success or an error on failure.
344 function generates a new scatter/gather list from a sub-range of an existing
347 The sub-range to extract is specified by the
352 The new scatter/gather list is stored in
358 the caller may either provide an empty scatter/gather list,
365 will allocate a new list subject to
372 and does not require it to be a private list.
375 function returns zero on success or an error on failure.
376 .Ss Miscellaneous Routines
379 function clears the scatter/gather list
381 so that it no longer maps any address ranges.
382 This can allow reuse of a single scatter/gather list object for multiple
387 function returns the total length of the physical address ranges described
388 by the scatter/gather list
396 functions return a new scatter/gather list on success or
402 family of functions and the
403 .Nm sglist_consume_uio ,
408 functions return zero on success or an error on failure.
412 function returns a count of scatter/gather list elements.
416 function returns a count of address space described by a scatter/gather list
421 functions return the following errors on failure:
424 The scatter/gather list has zero segments.
426 There are not enough available segments in the scatter/gather list to append
427 the specified physical address ranges.
431 .Nm sglist_consume_uio
432 function returns the following error on failure:
435 The scatter/gather list has zero segments.
440 function returns the following error on failure:
443 There are not enough available segments in the scatter/gather list
445 to append the physical address ranges from
450 function returns the following errors on failure:
455 scatter/gather list does not describe enough address space to cover the
458 The caller-supplied scatter/gather list in
462 An attempt to allocate a new scatter/gather list with
468 There are not enough available segments in the caller-supplied scatter/gather
471 to describe the requested physical address ranges.
475 function returns the following errors on failure:
480 scatter/gather list has more than one reference.
482 The caller-supplied scatter/gather list in
486 An attempt to allocate a new scatter/gather list with
492 There are not enough available segments in the caller-supplied scatter/gather
495 to describe the requested physical address ranges.
502 This API was first introduced in