qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves wh


From: Peter Lieven
Subject: Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used
Date: Tue, 19 Nov 2013 13:03:50 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0

On 19.11.2013 11:47, Paolo Bonzini wrote:
Il 19/11/2013 11:25, Peter Lieven ha scritto:
~/git/qemu$ x86_64-softmmu/qemu-system-x86_64 -m 2048 -drive
if=virtio,file=iscsi://172.21.200.45/iqn.2001-05.com.equallogic:0-8a0906-9d95c510a-344001d54795289f-2012-r2-1-7-0/0,format=raw,cache=writeback,aio=native
-smp 2,cores=2,threads=1,sockets=1 -cpu host -monitor stdio -vnc :1
-enable-kvm -usb -usbdevice tablet -vga cirrus -global
virtio-blk-pci.scsi=off  -serial null  -parallel null -boot c
What is your host CPU's topology

With just -smp 2 it works. However, have a look at my other email I
think there is a bug in smp_parse, because -smp 2 yields
cpus=2,cores=1,threads=1,sockets=1 whereas I think cores should
be 2.
The code matching the comment in vl.c ("compute missing values, prefer
sockets over cores over threads") would be like "-smp
cpu=2,cores=1,threads=1,sockets=2", giving this code:

         if (cpus == 0) {
             sockets = sockets > 0 ? sockets : 1;
             cores = cores > 0 ? cores : 1;
             threads = threads > 0 ? threads : 1;
             cpus = cores * threads * sockets;
         } else if (sockets == 0) {
             cores = cores > 0 ? cores : 1;
             threads = threads > 0 ? threads : 1;
             sockets = cpus / (cores * threads);
         } else if (cores == 0) {
             threads = threads > 0 ? threads : 1;
             cores = cpus / (sockets * threads);
         } else {
             threads = cpus / (sockets * cores);
         }

What you suggest is cores over threads over sockets:

         if (cpus == 0) {
             cores = cores > 0 ? cores : 1;
             threads = threads > 0 ? threads : 1;
             sockets = sockets > 0 ? sockets : 1;
             cpus = cores * threads * sockets;
         } else if (cores == 0) {
             threads = threads > 0 ? threads : 1;
             sockets = sockets > 0 ? sockets : 1;
             cores = cpus / (threads * sockets);
         } else if (threads == 0) {
             sockets = sockets > 0 ? sockets : 1;
             threads = cpus / (cores * sockets);
         } else {
             sockets = cpus / (cores * threads);
         }

Can you test which of these two work?  But I agree it's best to disable
cache-leaf forwarding.
The first does make windows boot again and it calculates a
correct combination of cpus, threads, cores and sockets. But
I think the reason it boots is because cores=threads=1.

As its more intuitive (I think) I would prefer your "cores over threads over socket 
".
The last thing I would think of is emulating more than 1 socket. -smp N
would then mean, N cores, no hyper-threading, 1 socket.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]