git: 3394d4239b85 - main - cam: allocate CCBs from UMA for SCSI and ATA IO

Gary Jennejohn gljennjohn at gmail.com
Sat May 15 16:03:04 UTC 2021


On Sat, 15 May 2021 11:05:49 GMT
Edward Tomasz Napierala <trasz at FreeBSD.org> wrote:

> The branch main has been updated by trasz:
> 
> URL: https://cgit.FreeBSD.org/src/commit/?id=3394d4239b85b5577845d9e6de4e97b18d3dba58
> 
> commit 3394d4239b85b5577845d9e6de4e97b18d3dba58
> Author:     Edward Tomasz Napierala <trasz at FreeBSD.org>
> AuthorDate: 2021-05-15 10:17:22 +0000
> Commit:     Edward Tomasz Napierala <trasz at FreeBSD.org>
> CommitDate: 2021-05-15 11:03:49 +0000
> 
>     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.
>     

[snip diff]

I built and installed world and kernel and enabled both tunables.

System's been up for about two hours using both ada and da disks
pretty intensely and hasn't trashed any yet.

-- 
Gary Jennejohn


More information about the dev-commits-src-main mailing list