ULE uses the CPU topology to try and make locality-preserving scheduling
decisions. On NUMA systems we should provide info about the NUMA
topology so that the kernel avoids migrating threads between domains as
much as possible. Add some checking to make sure that each domain's CPU
set is contiguous before trying to use the generic SMP topology-building
routines.
On arm64 we also have the affinity values from mpidr registers to
provide more fine-grained locality information, but the values seem to
be largely arbitrary on systems that I've looked at. They are used by
the gicv3 driver and seem to have some arbitrary contraints. So don't
use them for now.
Tested on an Ampere Altra with a single package partitioned into four
NUMA domains.