diff options
| author | Alexander Motin <mav@FreeBSD.org> | 2026-08-28 23:44:44 +0000 |
|---|---|---|
| committer | Alexander Motin <mav@FreeBSD.org> | 2026-08-29 00:32:15 +0000 |
| commit | 7dc4284615495464d6e18123ad6726ed5a9fe798 (patch) | |
| tree | fea660de7ac7ee93fbdf0fe48baf7da08a84f8d8 /lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp | |
| parent | 7ac94594260f6be72216159afd226d614aedb45a (diff) | |
Originally gstripe created a separate child I/O for every accessed
stripe, making it very inefficient for small stripe sizes. Later
introduced "fast" mode reduced that count for read/write requests
by copying the data to/from temporary contiguous buffers, wasting
memory bandwidth and CPU time. This commit implements alternative
method, utilizing unmapped I/O mechanism to assemble children I/Os
from pages of the original I/O, avoiding any copying. This method
though has some limitations, such as stripe size can not be smaller
than CPU page size, or buffer and offset page phases should match
(may be page aligned, but not necessarily). But those limitations
are not an issue in many cases, since ZFS, for example, can often
align its buffers (BTW, dd doesn't). Plus, unlike "fast" method,
this one can receive (and even prefers) unmapped I/Os.
While there, re-implement also BIO_DELETE. Since they don't have
any data, there is no any reason to create more than one child I/O
per disk. It also dramatically improves performance there.
And for dessert, add rotation rate attribute support, reporting one
if all the children report the same. ZFS is using it more and more.
Diffstat (limited to 'lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp')
0 files changed, 0 insertions, 0 deletions
