git: aefe0a8c32d3 - main - Refactor/optimize cpu_search_*().

Kevin Bowling kevin.bowling at kev009.com
Thu Jul 29 06:07:57 UTC 2021


On Wed, Jul 28, 2021 at 7:00 PM Alexander Motin <mav at freebsd.org> wrote:

> The branch main has been updated by mav:
>
> URL:
> https://cgit.FreeBSD.org/src/commit/?id=aefe0a8c32d370f2fdd0d0771eb59f8845beda17
>
> commit aefe0a8c32d370f2fdd0d0771eb59f8845beda17
> Author:     Alexander Motin <mav at FreeBSD.org>
> AuthorDate: 2021-07-29 01:18:50 +0000
> Commit:     Alexander Motin <mav at FreeBSD.org>
> CommitDate: 2021-07-29 02:00:29 +0000
>
>     Refactor/optimize cpu_search_*().
>
>     Remove cpu_search_both(), unused for many years.  Without it there is
>     less sense for the trick of compiling common cpu_search() into separate
>     cpu_search_lowest() and cpu_search_highest(), so split them completely,
>     making code more readable.  While there, split iteration over children
>     groups and CPUs, complicating code for very small deduplication.
>
>     Stop passing cpuset_t arguments by value and avoid some manipulations.
>     Since MAXCPU bump from 64 to 256, what was a single register turned
>     into 32-byte memory array, requiring memory allocation and accesses.
>     Splitting struct cpu_search into parameter and result parts allows to
>     even more reduce stack usage, since the first can be passed through
>     on recursion.
>
>     Remove CPU_FFS() from the hot paths, precalculating first and last CPU
>     for each CPU group in advance during initialization.  Again, it was
>     not a problem for 64 CPUs before, but for 256 FFS needs much more code.
>
>     With these changes on 80-thread system doing ~260K uncached ZFS reads
>     per second I observe ~30% reduction of time spent in cpu_search_*().


Nice! I recall seeing contention here on other workloads on high core count
systems.

Regards,
Kevin


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