diff options
| author | Piotr Kubaj <pkubaj@FreeBSD.org> | 2026-09-08 11:22:58 +0000 |
|---|---|---|
| committer | Piotr Kubaj <pkubaj@FreeBSD.org> | 2026-09-17 08:08:11 +0000 |
| commit | 1d4a00d455617e150da5a7c3076579a7e612d33d (patch) | |
| tree | cdca61e6e26a1c56c6d68dc526f3ca4cb6c68a2c /cli/(developers-only) | |
| parent | d38e0889d20eed3885a020993b72dc9855148ba3 (diff) | |
pagezero() was a plain store loop (bzero), which under the kernel build
flags (-mno-vsx -msoft-float) compiles to byte stores. dcbz
establishes a zeroed cache line directly in the cache without a
read-for-ownership fetch from memory, roughly halving the memory
transactions of page zeroing.
Measured on POWER9 (Raptor Blackbird, DD2.3, bare metal), zeroing a
cold 256 MB buffer with 128-byte scalar loops:
byte stores (current libkern memset) 8.6 GB/s
doubleword (std) stores 26.8 GB/s
dcbz 34.6 GB/s
dcbz raises an alignment interrupt on caching-inhibited mappings, and
the kernel does not emulate it, so mmu_radix_zero_page() falls back to
bzero() for any page whose memattr is not the write-back default. The
internal pagezero() callers only touch freshly allocated page-table
pages, which are always write-back.
Note: dcbz helps only zeroing, where there is no source to read. For
page copying it is a pessimization (it adds a redundant zeroing pass on
top of the mandatory source read), so mmu_radix_copy_page() is left as a
plain bcopy().
Differential Revision: https://reviews.freebsd.org/D59507
Reviewed by: jhibbits
Diffstat (limited to 'cli/(developers-only)')
0 files changed, 0 insertions, 0 deletions
