Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cpu-topology corrupt #753

Open
tm-up opened this issue Jan 8, 2024 · 2 comments
Open

cpu-topology corrupt #753

tm-up opened this issue Jan 8, 2024 · 2 comments
Assignees

Comments

@tm-up
Copy link

tm-up commented Jan 8, 2024

Hello everyone!

FreeBSD version ( uname -a ):
FreeBSD tm4 14.0-RELEASE FreeBSD 14.0-RELEASE #0 releng/14.0-n265380-f9716eee8ab4: Fri Nov 10 05:57:23 UTC 2023 root@releng1.nyi.freebsd.org:/usr/obj/usr/src/amd64.amd64/sys/GENERIC amd64

CBSD version ( cbsd version ): 14.0.2

I've got a dual socket Xeon E5-2640 v4 machine, which has 10 cores/20 threads per socket. That are 20 cores in total with 40 threads.
cbsd cpu-topology shows two times 10 threads on the two cores 0, and a total of 40 SMT cores and counts them together as 60 cores max.
A cbsd bhyve vm with windows 11 can be installed up to the second boot, then it stops after a long timeout (using even only 1 socket, 1 cpu, 1 thread; same with 1/1/2).
Here is the output of cbsd cpu-topology:

Model: Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
Sockets num: 2
Cores num: 40
Threads num: 20
NUMA domains: 2
--
Core max: 60
Socket 0:
+-----------------------+
|                       |
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 19 (SMT)       | - Bhyve:windows1
|   core 18 (SMT)       | - Bhyve:windows1
|   core 17 (SMT)       | - Bhyve:windows1
|   core 16 (SMT)       | - Bhyve:windows1
|   core 15 (SMT)       | - Bhyve:windows1
|   core 14 (SMT)       | - Bhyve:windows1
|   core 13 (SMT)       | - Bhyve:windows1
|   core 12 (SMT)       | - Bhyve:windows1
|   core 11 (SMT)       | - Bhyve:windows1
|   core 10 (SMT)       | - Bhyve:windows1
|   core 9 (SMT)        | - Bhyve:windows1
|   core 8 (SMT)        | - Bhyve:windows1
|   core 7 (SMT)        | - Bhyve:windows1
|   core 6 (SMT)        | - Bhyve:windows1
|   core 5 (SMT)        | - Bhyve:windows1
|   core 4 (SMT)        | - Bhyve:windows1
|   core 3 (SMT)        | - Bhyve:windows1
|   core 2 (SMT)        | - Bhyve:windows1
|   core 1 (SMT)        | - Bhyve:windows1
|   core 0 (SMT)        | - Bhyve:windows1
|                       |
+-----------------------+
Socket 1:
+-----------------------+
|                       |
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 0 (THR)        | - Bhyve:windows1
|   core 39 (SMT)       | - Bhyve:windows1
|   core 38 (SMT)       | - Bhyve:windows1
|   core 37 (SMT)       | - Bhyve:windows1
|   core 36 (SMT)       | - Bhyve:windows1
|   core 35 (SMT)       | - Bhyve:windows1
|   core 34 (SMT)       | - Bhyve:windows1
|   core 33 (SMT)       | - Bhyve:windows1
|   core 32 (SMT)       | - Bhyve:windows1
|   core 31 (SMT)       | - Bhyve:windows1
|   core 30 (SMT)       | - Bhyve:windows1
|   core 29 (SMT)       | - Bhyve:windows1
|   core 28 (SMT)       | - Bhyve:windows1
|   core 27 (SMT)       | - Bhyve:windows1
|   core 26 (SMT)       | - Bhyve:windows1
|   core 25 (SMT)       | - Bhyve:windows1
|   core 24 (SMT)       | - Bhyve:windows1
|   core 23 (SMT)       | - Bhyve:windows1
|   core 22 (SMT)       | - Bhyve:windows1
|   core 21 (SMT)       | - Bhyve:windows1
|   core 20 (SMT)       | - Bhyve:windows1
|                       |
+-----------------------+

I have installed cbsd-bhyve-windows11 successfully on a single socket machine.
So I guess the reason is the strange cpu-topology above.
Any ideas how to fix it?

Thanks and best regards,
-Urs

@olevole
Copy link
Member

olevole commented Jan 8, 2024

@tm-up Hi! Yes, topology parsing has been asking for refactoring for a long time ;-)
Can you post/share sysctl -qn sysctl kern.sched.topology_spec ?

Also, cpu-topology script has nothing to do with Windows 11 problems: if Windows 11 guest requires specific CPU topology, you can use cbsd vm-cpu-topology-tui to create custom bhyve topology and apply it via cbsd jconfig or cbsd jconstruct-tui or cbsd jset (vm_cpu_topology options). Or use bhyve_flags to pass cpu-related bhyve options as-is.

AFAIK, Windows 11 requires for TPM ( passthru added in development CBSD version, but bhyve_flags also usefull ). TPM emulation via https://github.com/stefanberger/swtpm still WIP.

In addition, if you use virtio drivers on Windows, you may need to patch the bhyve, checkout https://github.com/cbsd/cbsd/tree/develop/upgrade/patch/iov-14.0 , e.g.:

cp /usr/local/cbsd/upgrade/patch/iov-14.0/patch* /usr/src/usr.sbin/bhyve/
cd /usr/src/usr.sbin/bhyve
patch < patch-usr-sbin-bhyve-block_if.h
patch < patch-usr-sbin-bhyve-virtio.c
make clean
make
make install

@olevole olevole self-assigned this Jan 8, 2024
@tm-up
Copy link
Author

tm-up commented Jan 8, 2024

Hi Oleg!
Many thanks for the quick response and the pointer to your virtio improvement. I will look into this.
I have played with the cbsd vm-cpu-topology-tui, I have tried 1/1/1 and 1/1/2 and 1/1/4. None worked.
Then I used the BypassTPMCheck hack to avoid the need for a TPM module.

Here is the output of sysctl -qn sysctl kern.sched.topology_spec:

<groups>
 <group level="1" cache-level="0">
  <cpu count="40" mask="ffffffffff,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39</cpu>
  <children>
   <group level="2" cache-level="3">
    <cpu count="20" mask="fffff,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19</cpu>
    <flags><flag name="NODE">NUMA node</flag></flags>
    <children>
     <group level="3" cache-level="2">
      <cpu count="2" mask="3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">0, 1</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="c,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">2, 3</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">4, 5</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="c0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">6, 7</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">8, 9</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="c00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">10, 11</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="3000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">12, 13</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="c000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">14, 15</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="30000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">16, 17</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="c0000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">18, 19</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
    </children>
   </group>
   <group level="2" cache-level="3">
    <cpu count="20" mask="fffff00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39</cpu>
    <flags><flag name="NODE">NUMA node</flag></flags>
    <children>
     <group level="3" cache-level="2">
      <cpu count="2" mask="300000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">20, 21</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="c00000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">22, 23</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="3000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">24, 25</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="c000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">26, 27</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="30000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">28, 29</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="c0000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">30, 31</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="300000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">32, 33</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="c00000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">34, 35</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="3000000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">36, 37</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
     <group level="3" cache-level="2">
      <cpu count="2" mask="c000000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0">38, 39</cpu>
      <flags><flag name="THREAD">THREAD group</flag><flag name="SMT">SMT group</flag></flags>
     </group>
    </children>
   </group>
  </children>
 </group>
</groups>

Best regards,
-Urs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants