This revision is a WIP. I need to add some defines for additional
architectures like arm64, and I haven't finished testing yet. But I'm starting
the revision so I can collect feedback.
Instead of copying data, use BIO_VLISTs to aggregate ZFS I/O.
Mark zio's that represent aggregated I/O with the ZIO_FLAG_AGGREGATED
flag. A ZIO_FLAG_AGGREGATED zio has io_data pointing to an array of
bus_dma_segment_t of length io_vcount.
Handle ZIO_FLAG_AGGREGATED zios.
Use the new aggregating zio type. Additionally, use FreeBSD's
zero_region and bitbucket_region to avoid allocations and copying for
Add an always mapped, write only, VM region for discarding data. This
"bitbucket_region" is intended to be used when aggregated read I/O to a device
spans a region that is not desired, but is included in the I/O to avoid the
extra iop that would otherwise be needed to exclude it from the request.
Make the bitbucket region the same size as the zero region on all
Add the bitbucket_region to FreeBSD's KPI.
Initialize the bitbucket region during VM startup.