[Bug 262263] ahci: Unaligned free to UMA zone (ada_ccb)

From: <bugzilla-noreply_at_freebsd.org>
Date: Tue, 01 Mar 2022 09:40:46 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=262263

--- Comment #5 from Hans Petter Selasky <hselasky@FreeBSD.org> ---
I suspect it has something to do with this change. There has been a couple of
issues fixed since then:

commit 3394d4239b85b5577845d9e6de4e97b18d3dba58
Author: Edward Tomasz Napierala <trasz@FreeBSD.org>
Date:   Sat May 15 11:17:22 2021 +0100

    cam: allocate CCBs from UMA for SCSI and ATA IO

    This patch makes it possible for CAM to use small CCBs allocated
    from an periph-specific UMA zone instead of the usual, huge ones.
    The end result is that CCBs issued via da(4) take 544B (size of
    ccb_scsiio) instead of the usual 2kB (size of 'union ccb', ~1.5kB,
    rounded up by malloc(9)).  For ATA it's 272B.  We waste less
    memory, we avoid zeroing the unused 1kB, and it should be easier
    to allocate those CCBs in low memory conditions.  It should also
    be possible to use uma_zone_reserve(9) to improve behaviour
    in low memory conditions even further.

    Note that this does not change the size, or the layout, of CCBs
    as such.  CCBs get allocated in various different ways, in particular
    on the stack, and I don't want to redo all that.  Instead, this
    provides an opt-in mechanism for the periph to declare "my start()
    callback is fine with receiving a CCB allocated from this UMA zone".
    In other words, most of the code works exactly as it used to; the
    change only happens to IOs issued by xpt_run_allockq(), which
    is - conveniently - pretty much all that matters for performance.

    The reason for doing it this way is that it's pretty small, localized
    change, and can be implemented gradually and iteratively: take a
    periph, make sure its start() callback only casts the CCBs it takes
    to a particular type of CCB, for example ccb_scsiio, and that it only
    casts CCBs returned by cam_periph_getccb() to that type, then add UMA
    zone for that size, and declare it safe to XPT.

    This is disabled by default.  Set 'kern.cam.ada.enable_uma_ccbs=1'
    and 'kern.cam.da.enable_uma_ccbs=1' tunables to enable it.  Testing
    is welcome; I will flip the default to enable in two weeks from now.

    Reviewed By:    imp
    Sponsored by:   NetApp, Inc.
    Sponsored by:   Klara, Inc.
    Differential Revision:  https://reviews.freebsd.org/D28674

-- 
You are receiving this mail because:
You are the assignee for the bug.