Zhao Liu <zhao1.liu@xxxxxxxxxxxxxxx> writes: > From: Zhao Liu <zhao1.liu@xxxxxxxxx> > > Hi list, > > This is the our v8 patch series, rebased on the master branch at the > commit 11be70677c70 ("Merge tag 'pull-vfio-20240129' of > https://github.com/legoater/qemu into staging"). > > Compared with v7 [1], v8 mainly has the following changes: > * Introduced smp.modules for x86 instead of reusing current > smp.clusters. > * Reworte the CPUID[0x1F] encoding. > > Given the code change, I dropped the most previously gotten tags > (Acked-by/Reviewed-by/Tested-by from Michael & Babu, thanks for your > previous reviews and tests!) in v8. > > With the description of the new modules added to x86 arch code in v7 [1] > cover letter, the following sections are mainly the description of > the newly added smp.modules (since v8) as supplement. > > Welcome your comments! > > > Why We Need a New CPU Topology Level > ==================================== > > For the discussion in v7 about whether we should reuse current > smp.clusters for x86 module, the core point is what's the essential > differences between x86 module and general cluster. > > Since, cluster (for ARM/riscv) lacks a comprehensive and rigorous > hardware definition, and judging from the description of smp.clusters > [2] when it was introduced by QEMU, x86 module is very similar to > general smp.clusters: they are all a layer above existing core level > to organize the physical cores and share L2 cache. > > However, after digging deeper into the description and use cases of > cluster in the device tree [3], I realized that the essential > difference between clusters and modules is that cluster is an extremely > abstract concept: > * Cluster supports nesting though currently QEMU doesn't support > nested cluster topology. However, modules will not support nesting. > * Also due to nesting, there is great flexibility in sharing resources > on clusters, rather than narrowing cluster down to sharing L2 (and > L3 tags) as the lowest topology level that contains cores. > * Flexible nesting of cluster allows it to correspond to any level > between the x86 package and core. > > Based on the above considerations, and in order to eliminate the naming > confusion caused by the mapping between general cluster and x86 module > in v7, we now formally introduce smp.modules as the new topology level. > > > Where to Place Module in Existing Topology Levels > ================================================= > > The module is, in existing hardware practice, the lowest layer that > contains the core, while the cluster is able to have a higher topological > scope than the module due to its nesting. > > Thereby, we place the module between the cluster and the core, viz: > > drawer/book/socket/die/cluster/module/core/thread > > > Additional Consideration on CPU Topology > ======================================== > > Beyond this patchset, nowadays, different arches have different topology > requirements, and maintaining arch-agnostic general topology in SMP > becomes to be an increasingly difficult thing due to differences in > sharing resources and special flexibility (e.g., nesting): > * It becomes difficult to put together all CPU topology hierarchies of > different arches to define complete topology order. > * It also becomes complex to ensure the correctness of the topology > calculations. > - Now the max_cpus is calculated by multiplying all topology > levels, and too many topology levels can easily cause omissions. > > Maybe we should consider implementing arch-specfic topology hierarchies. > > > [1]: https://lore.kernel.org/qemu-devel/20240108082727.420817-1-zhao1.liu@xxxxxxxxxxxxxxx/ > [2]: https://lists.gnu.org/archive/html/qemu-devel/2023-02/msg04051.html > [3]: https://www.kernel.org/doc/Documentation/devicetree/bindings/cpu/cpu-topology.txt Have you considered putting an abridged version of your lovely rationale into a commit message, so it can be found later more easily?