Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Peter Lieven

On 18.11.2013 17:11, Paolo Bonzini wrote:

Il 18/11/2013 16:37, Peter Lieven ha scritto:


If I specify: -smp 2,sockets=1,cores=2,threads=1 to a Windows 2012 R2
Server it crashes
at boot time. -smp 2 works.

for Linux /proc/cpuinfo reveals no cpu layout information (sibliings,
cores, threads etc.) with
this patch applied and a manual socket,core,thread configuration.

What's the full command line?


~/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


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.

Peter



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Paolo Bonzini
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.

Paolo



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Paolo Bonzini
Il 18/11/2013 20:53, Peter Lieven ha scritto:
 The essential part is -enable-kvm -smp 2,sockets=1,cores=2,threads=1 -cpu 
 host.
 I believe the corect fix could be to disabled the cache leave forwarding as 
 soon
 as the user specifies his own socket/core/thread layout.

Please test this:

diff --git a/include/sysemu/cpus.h b/include/sysemu/cpus.h
index 6502488..170fd70 100644
--- a/include/sysemu/cpus.h
+++ b/include/sysemu/cpus.h
@@ -17,6 +17,7 @@ void qtest_clock_warp(int64_t dest);
 /* vl.c */
 extern int smp_cores;
 extern int smp_threads;
+extern bool smp_manual_topology;
 #else
 /* *-user doesn't have configurable SMP topology */
 #define smp_cores   1
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 864c80e..49b5d45 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1149,7 +1149,7 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def)
 assert(kvm_enabled());
 
 x86_cpu_def-name = host;
-x86_cpu_def-cache_info_passthrough = true;
+x86_cpu_def-cache_info_passthrough = !smp_manual_topology;
 host_cpuid(0x0, 0, eax, ebx, ecx, edx);
 x86_cpu_vendor_words2str(x86_cpu_def-vendor, ebx, edx, ecx);
 
diff --git a/vl.c b/vl.c
index 4ad15b8..f319976 100644
--- a/vl.c
+++ b/vl.c
@@ -207,6 +207,7 @@ CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES];
 CharDriverState *sclp_hds[MAX_SCLP_CONSOLES];
 int win2k_install_hack = 0;
 int singlestep = 0;
+bool smp_manual_topology = false;
 int smp_cpus = 1;
 int max_cpus = 0;
 int smp_cores = 1;
@@ -1391,6 +1392,8 @@ static void smp_parse(QemuOpts *opts)
 unsigned cores   = qemu_opt_get_number(opts, cores, 0);
 unsigned threads = qemu_opt_get_number(opts, threads, 0);
 
+smp_manual_topology = sockets || threads || cores;
+
 /* compute missing values, prefer sockets over cores over threads */
 if (cpus == 0 || sockets == 0) {
 sockets = sockets  0 ? sockets : 1;




Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Peter Lieven

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

I tested it with 1 socket, 2 cores, 2 threads per core (my workstation) and 2 
sockets, 8 cores per socket, 2 threads per thread.
Both crash.



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);
 }

I am fine with either of the both variants, it should just
be consistent ;-)


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 problem is, its broken because at least cpuid index 4 includes a hint
to the number of cores and threads. I think we have to disable the cache
leaf forwarding if the qemu cpu topology does not match the host topology.

I also tried to fix index 4, but this alone seems to be not enough. at least
in index 2 seems also to be some info about cores and threads (which is 
currently
not there).



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Peter Lieven

next question: is cache leaf forwarding a migration blocker?




Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Paolo Bonzini
Il 19/11/2013 12:35, Peter Lieven ha scritto:
 next question: is cache leaf forwarding a migration blocker?

-cpu host in general is interesting at migration time, so I would
say no.

Paolo



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Peter Lieven

On 19.11.2013 12:37, Paolo Bonzini wrote:

Il 19/11/2013 12:35, Peter Lieven ha scritto:

next question: is cache leaf forwarding a migration blocker?

-cpu host in general is interesting at migration time, so I would
say no.

It works for for a long time as long as all cpu features that are supported on 
the source
are also supported on the destination.

As for the cache leaves feature I would go for making it a optional parameter. 
If we
woudl want to support it, we need to adjust several cpuid indexes to reflect 
the emulated
cpu topology. Question would be to what extend the cache information would then
make sense. Or with other words if one wants to use cache leaf pass-thru the 
topology
must match the physical one?

Peter



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Peter Lieven

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.



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Peter Lieven

On 19.11.2013 13:03, Peter Lieven wrote:

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.

Forgot to mention: In this case the information about cores and threads is not 
retreived
from additional indexes. bits 16..23 in ebx in index 0x0001 are zero.

So bottom line, the whole cache leaf passthru thing only worked because of a bug
in smp_parse yielding threads and cores 1 by default.




Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Paolo Bonzini
Il 19/11/2013 13:03, Peter Lieven ha scritto:

 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.

After looking more at the docs, I think I found the bug.  Can you test this?

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 864c80e..16d4db1 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2086,14 +2086,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
 /* cache info: needed for Core compatibility */
 if (cpu-cache_info_passthrough) {
 host_cpuid(index, count, eax, ebx, ecx, edx);
-break;
-}
-if (cs-nr_cores  1) {
-*eax = (cs-nr_cores - 1)  26;
+*eax = ~0xFC00;
 } else {
 *eax = 0;
-}
-switch (count) {
+switch (count) {
 case 0: /* L1 dcache info */
 *eax |= CPUID_4_TYPE_DCACHE | \
 CPUID_4_LEVEL(1) | \
@@ -2118,9 +2114,6 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
 *eax |= CPUID_4_TYPE_UNIFIED | \
 CPUID_4_LEVEL(2) | \
 CPUID_4_SELF_INIT_LEVEL;
-if (cs-nr_threads  1) {
-*eax |= (cs-nr_threads - 1)  14;
-}
 *ebx = (L2_LINE_SIZE - 1) | \
((L2_PARTITIONS - 1)  12) | \
((L2_ASSOCIATIVITY - 1)  22);
@@ -2133,6 +2126,12 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
 *ecx = 0;
 *edx = 0;
 break;
+}
+}
+
+/* We give out APIC IDs ourselves, so force bits 31..26 even for -cpu 
host.  */
+if (cs-nr_cores  1) {
+*eax |= (cs-nr_cores - 1)  26;
 }
 break;
 case 5:

Paolo



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Peter Lieven

On 19.11.2013 13:14, Paolo Bonzini wrote:

Il 19/11/2013 13:03, Peter Lieven ha scritto:

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.

After looking more at the docs, I think I found the bug.  Can you test this?

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 864c80e..16d4db1 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2086,14 +2086,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
  /* cache info: needed for Core compatibility */
  if (cpu-cache_info_passthrough) {
  host_cpuid(index, count, eax, ebx, ecx, edx);
-break;
-}
-if (cs-nr_cores  1) {
-*eax = (cs-nr_cores - 1)  26;
+*eax = ~0xFC00;
  } else {
  *eax = 0;
-}
-switch (count) {
+switch (count) {
  case 0: /* L1 dcache info */
  *eax |= CPUID_4_TYPE_DCACHE | \
  CPUID_4_LEVEL(1) | \
@@ -2118,9 +2114,6 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
  *eax |= CPUID_4_TYPE_UNIFIED | \
  CPUID_4_LEVEL(2) | \
  CPUID_4_SELF_INIT_LEVEL;
-if (cs-nr_threads  1) {
-*eax |= (cs-nr_threads - 1)  14;
-}
  *ebx = (L2_LINE_SIZE - 1) | \
 ((L2_PARTITIONS - 1)  12) | \
 ((L2_ASSOCIATIVITY - 1)  22);
@@ -2133,6 +2126,12 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
  *ecx = 0;
  *edx = 0;
  break;
+}
+}
+
+/* We give out APIC IDs ourselves, so force bits 31..26 even for -cpu 
host.  */
+if (cs-nr_cores  1) {
+*eax |= (cs-nr_cores - 1)  26;
  }
  break;
  case 5:

Paolo

I already tried exactly this fix. Its reading index 0x004 for increasing 
indexes until qemu aborts:

~/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 -cpu host -monitor stdio -vnc :1 
-enable-kvm -usb -usbdevice tablet -vga cirrus -global virtio-blk-pci.scsi=off -smp 4,cores=4,threads=1,sockets=1  -serial null  -parallel null -boot c


(qemu) cpuid_data is full, no space for cpuid(eax:0x4,ecx:0x5d)
Abgebrochen (Speicherabzug geschrieben)

If you really want to have this feature:

a) fix smp_parse and leave it at prefer sockets over cores over threads, but 
use your new 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);
}


b) disable cache leaf pass-thru as soon as threads*cores  1. It seems to work 
as long as there is only one core with one thread per socket.

Peter



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Paolo Bonzini
Il 19/11/2013 13:32, Peter Lieven ha scritto:

 +
 +/* We give out APIC IDs ourselves, so force bits 31..26 even
 for -cpu host.  */
 +if (cs-nr_cores  1) {
 +*eax |= (cs-nr_cores - 1)  26;
   }
   break;
   case 5:

 I already tried exactly this fix. Its reading index 0x004 for
 increasing indexes until qemu aborts:

Oops, it should be I guess if ((*eax  31)  cs-nr_cores  1).

Paolo

 ~/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
 -cpu host -monitor stdio -vnc :1 -enable-kvm -usb -usbdevice tablet -vga
 cirrus -global virtio-blk-pci.scsi=off -smp
 4,cores=4,threads=1,sockets=1  -serial null  -parallel null -boot c




Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Peter Lieven

On 19.11.2013 14:21, Paolo Bonzini wrote:

Il 19/11/2013 13:32, Peter Lieven ha scritto:

+
+/* We give out APIC IDs ourselves, so force bits 31..26 even
for -cpu host.  */
+if (cs-nr_cores  1) {
+*eax |= (cs-nr_cores - 1)  26;
   }
   break;
   case 5:

I already tried exactly this fix. Its reading index 0x004 for
increasing indexes until qemu aborts:

Oops, it should be I guess if ((*eax  31)  cs-nr_cores  1).

Maybe, how should we continue. This should be fixed before 1.7 comes out.

Peter



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Paolo Bonzini
Il 19/11/2013 15:11, Peter Lieven ha scritto:

 I already tried exactly this fix. Its reading index 0x004 for
 increasing indexes until qemu aborts:
 Oops, it should be I guess if ((*eax  31)  cs-nr_cores  1).
 Maybe, how should we continue. This should be fixed before 1.7 comes out.

If this works, I'll post a patch.

Paolo



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Peter Lieven

On 19.11.2013 15:14, Paolo Bonzini wrote:

if ((*eax  31)  cs-nr_cores  1)

at which position exactly do you want to put this condition and take which 
action?

Peter



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Paolo Bonzini
Il 19/11/2013 15:17, Peter Lieven ha scritto:
 if ((*eax  31)  cs-nr_cores  1)
 at which position exactly do you want to put this condition and take
 which action?

Just replace if (cs-nr_cores  1) in the patch I posted, i.e. after the 
switch.

Paolo

-- 8 -
From 781ff96e9d1eeacbd4ff588d4d3773351f14320b Mon Sep 17 00:00:00 2001
From: Paolo Bonzini pbonz...@redhat.com
Date: Tue, 19 Nov 2013 13:19:17 +0100
Subject: [PATCH] target-i386: do not override nr_cores for -cpu host

Commit 787aaf5 (target-i386: forward CPUID cache leaves when -cpu host is
used, 2013-09-02) brings bits 31..26 of CPUID leaf 04h out of sync with
the APIC IDs that QEMU reserves for each package.  This number must come
from -smp options rather than from the host CPUID.

It also turns out that this unsyncing makes Windows Server 2012R2 fail
to boot.

Signed-off-by: Paolo Bonzini pbonz...@redhat.com
---
 target-i386/cpu.c | 14 --
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 864c80e..8df6747 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2086,14 +2086,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
 /* cache info: needed for Core compatibility */
 if (cpu-cache_info_passthrough) {
 host_cpuid(index, count, eax, ebx, ecx, edx);
-break;
-}
-if (cs-nr_cores  1) {
-*eax = (cs-nr_cores - 1)  26;
+*eax = ~0xFC00;
 } else {
 *eax = 0;
-}
-switch (count) {
+switch (count) {
 case 0: /* L1 dcache info */
 *eax |= CPUID_4_TYPE_DCACHE | \
 CPUID_4_LEVEL(1) | \
@@ -2133,6 +2129,12 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
 *ecx = 0;
 *edx = 0;
 break;
+}
+}
+
+/* We give out APIC IDs ourselves, so force bits 31..26 even for -cpu 
host.  */
+if ((*eax  31)  cs-nr_cores  1) {
+*eax |= (cs-nr_cores - 1)  26;
 }
 break;
 case 5:
-- 
1.8.4.2





Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Peter Lieven

On 19.11.2013 15:19, Paolo Bonzini wrote:

Il 19/11/2013 15:17, Peter Lieven ha scritto:

if ((*eax  31)  cs-nr_cores  1)

at which position exactly do you want to put this condition and take
which action?

Just replace if (cs-nr_cores  1) in the patch I posted, i.e. after the 
switch.

This seems to work. What is in bits 0..5 of eax?
What about the number of threads in count == 2?

I would still like to have at least an option to disable the passthru without
recompiling if other issues occur.



Paolo

-- 8 -
 From 781ff96e9d1eeacbd4ff588d4d3773351f14320b Mon Sep 17 00:00:00 2001
From: Paolo Bonzini pbonz...@redhat.com
Date: Tue, 19 Nov 2013 13:19:17 +0100
Subject: [PATCH] target-i386: do not override nr_cores for -cpu host

Commit 787aaf5 (target-i386: forward CPUID cache leaves when -cpu host is
used, 2013-09-02) brings bits 31..26 of CPUID leaf 04h out of sync with
the APIC IDs that QEMU reserves for each package.  This number must come
from -smp options rather than from the host CPUID.

It also turns out that this unsyncing makes Windows Server 2012R2 fail
to boot.

Signed-off-by: Paolo Bonzini pbonz...@redhat.com
---
  target-i386/cpu.c | 14 --
  1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 864c80e..8df6747 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2086,14 +2086,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
  /* cache info: needed for Core compatibility */
  if (cpu-cache_info_passthrough) {
  host_cpuid(index, count, eax, ebx, ecx, edx);
-break;
-}
-if (cs-nr_cores  1) {
-*eax = (cs-nr_cores - 1)  26;
+*eax = ~0xFC00;
  } else {
  *eax = 0;
-}
-switch (count) {
+switch (count) {
  case 0: /* L1 dcache info */
  *eax |= CPUID_4_TYPE_DCACHE | \
  CPUID_4_LEVEL(1) | \
@@ -2133,6 +2129,12 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
  *ecx = 0;
  *edx = 0;
  break;
+}
+}
+
+/* We give out APIC IDs ourselves, so force bits 31..26 even for -cpu 
host.  */
+if ((*eax  31)  cs-nr_cores  1) {
+*eax |= (cs-nr_cores - 1)  26;
  }
  break;
  case 5:


Tested-by: Peter Lieven p...@kamp.de

Peter




Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Paolo Bonzini
Il 19/11/2013 15:46, Peter Lieven ha scritto:

 Just replace if (cs-nr_cores  1) in the patch I posted, i.e. after
 the switch.
 This seems to work. What is in bits 0..5 of eax?

It's the kind of cache.  0 means that there is no cache and the returned
data is not valid.  In theory, Intel says you should only check whether
those bits are 0, and stop iterating when they are, but apparently
something is expecting eax=0.

 What about the number of threads in count == 2?

That's a property of the L2 cache.  It's not related to APIC IDs.

 I would still like to have at least an option to disable the passthru
 without recompiling if other issues occur.

I think of -cpu host in general as a hit-or-miss option.  I'm not sure
whether it makes sense to have such fine grain.

Paolo



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Peter Lieven

On 19.11.2013 15:57, Paolo Bonzini wrote:

Il 19/11/2013 15:46, Peter Lieven ha scritto:

Just replace if (cs-nr_cores  1) in the patch I posted, i.e. after
the switch.

This seems to work. What is in bits 0..5 of eax?

It's the kind of cache.  0 means that there is no cache and the returned
data is not valid.  In theory, Intel says you should only check whether
those bits are 0, and stop iterating when they are, but apparently
something is expecting eax=0.


What about the number of threads in count == 2?

That's a property of the L2 cache.  It's not related to APIC IDs.

okay, but the contents could be wrong if the physical system
has threads while the emulated vserver has not. does this
matter?



I would still like to have at least an option to disable the passthru
without recompiling if other issues occur.

I think of -cpu host in general as a hit-or-miss option.  I'm not sure
whether it makes sense to have such fine grain.

As I explained, I have no trouble with -cpu host for ages when I ensure that
I do not live migrate to a processor that misses a feature that was there
when the vserver was created. With the caching option this could become
a problem or do you think wrong assumption about the cache are just
a performance penalty?

Peter




Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-19 Thread Paolo Bonzini
Il 19/11/2013 16:05, Peter Lieven ha scritto:

 What about the number of threads in count == 2?
 That's a property of the L2 cache.  It's not related to APIC IDs.
 okay, but the contents could be wrong if the physical system
 has threads while the emulated vserver has not. does this
 matter?

If you care about passing cache leaves, you probably can be expected to
pass a number of threads that matches the host, making the vCPUs a
multiple of the number of threads, and pinning the virtual cores to the
physical cores.

But in general, I'd say that the cache _is_ shared with another thread.
 It may be that the thread is not part of the VM---that depends on
things such as the pinning of vCPUs to physical CPUs.

Paolo



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-18 Thread Peter Lieven

I do not know, but this patch might introduce a regression.

If I specify: -smp 2,sockets=1,cores=2,threads=1 to a Windows 2012 R2 Server it 
crashes
at boot time. -smp 2 works.

git bisect start
# good: [62ecc3a0e3c77a4944c92a02dd7fae2ab1f2290d] Update VERSION for 1.6.1 
release
git bisect good 62ecc3a0e3c77a4944c92a02dd7fae2ab1f2290d
# bad: [964668b03d26f0b5baa5e5aff0c966f4fcb76e9e] Update version for 1.7.0-rc0 
release
git bisect bad 964668b03d26f0b5baa5e5aff0c966f4fcb76e9e
# good: [1ee2daeb6448312d6d0e22175f5c1b9b01f8974c] Update version for 1.6.0
git bisect good 1ee2daeb6448312d6d0e22175f5c1b9b01f8974c
# bad: [03cfd8faa7ffb7201e2949b99c2f35b1fef7078b] linux-user: add support of 
binfmt_misc 'O' flag
git bisect bad 03cfd8faa7ffb7201e2949b99c2f35b1fef7078b
# good: [5a93d5c2abc719bd44f6c9fbeed88d3cae712606] Merge remote-tracking branch 
'mjt/trivial-patches' into staging
git bisect good 5a93d5c2abc719bd44f6c9fbeed88d3cae712606
# good: [a27292b5d7545509bfa171922516d2033c570205] virtio-scsi: Make type 
virtio-scsi-common abstract
git bisect good a27292b5d7545509bfa171922516d2033c570205
# good: [469936ae0a9891b2de7e46743f683535b0819bee] target-i386: Fix segment 
cache dump
git bisect good 469936ae0a9891b2de7e46743f683535b0819bee
# bad: [3e4be9c29784df09c364b52a55e826a0b05b950e] Merge remote-tracking branch 
'qemu-kvm/uq/master' into staging
git bisect bad 3e4be9c29784df09c364b52a55e826a0b05b950e
# good: [2571f8f5fbaea5dc3bdcd84737f109b459576e90] Merge remote-tracking branch 
'spice/spice.v74' into staging
git bisect good 2571f8f5fbaea5dc3bdcd84737f109b459576e90
# good: [c5daeae1b4ddff97d605bd954a7c2a2b2cf6040f] linux-headers: update to 3.11
git bisect good c5daeae1b4ddff97d605bd954a7c2a2b2cf6040f
# good: [ceae18bd74e8940ff79935a257c72e665b084bcc] lsi: add 53C810 variant
git bisect good ceae18bd74e8940ff79935a257c72e665b084bcc
# bad: [f010bc643a2759e87e989c3e4e85f15ec71ae98f] target-i386: add feature 
kvm_pv_unhalt
git bisect bad f010bc643a2759e87e989c3e4e85f15ec71ae98f
# bad: [4f2656079f903efcd0d8224cbc79170ad3ee5b70] linux-headers: update to 
3.12-rc1
git bisect bad 4f2656079f903efcd0d8224cbc79170ad3ee5b70
# bad: [787aaf5703a702094f395db6795e74230282cd62] target-i386: forward CPUID 
cache leaves when -cpu host is used
git bisect bad 787aaf5703a702094f395db6795e74230282cd62

Peter

On 20.09.2013 18:24, Paolo Bonzini wrote:

From: Benoît Canet ben...@irqsave.net

Some users running cpu intensive tasks checking the cache CPUID leaves at
startup and making decisions based on the result reported that the guest was
not reflecting the host CPUID leaves when -cpu host is used.

This patch fix this.

Signed-off-by: Benoît Canet ben...@irqsave.net
[Rename new field to cache_info_passthrough - Paolo]
Signed-off-by: Paolo Bonzini pbonz...@redhat.com
---
  target-i386/cpu-qom.h |  3 +++
  target-i386/cpu.c | 19 +++
  2 files changed, 22 insertions(+)

diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h
index c4447c2..f4fab15 100644
--- a/target-i386/cpu-qom.h
+++ b/target-i386/cpu-qom.h
@@ -70,6 +70,9 @@ typedef struct X86CPU {
  bool hyperv_relaxed_timing;
  int hyperv_spinlock_attempts;
  
+/* if true the CPUID code directly forward host cache leaves to the guest */

+bool cache_info_passthrough;
+
  /* Features that were filtered out because of missing host capabilities */
  uint32_t filtered_features[FEATURE_WORDS];
  
diff --git a/target-i386/cpu.c b/target-i386/cpu.c

index c36345e..46edd75 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -486,6 +486,7 @@ typedef struct x86_def_t {
  int stepping;
  FeatureWordArray features;
  char model_id[48];
+bool cache_info_passthrough;
  } x86_def_t;
  
  #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)

@@ -1139,6 +1140,7 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def)
  assert(kvm_enabled());
  
  x86_cpu_def-name = host;

+x86_cpu_def-cache_info_passthrough = true;
  host_cpuid(0x0, 0, eax, ebx, ecx, edx);
  x86_cpu_vendor_words2str(x86_cpu_def-vendor, ebx, edx, ecx);
  
@@ -1888,6 +1890,7 @@ static void cpu_x86_register(X86CPU *cpu, const char *name, Error **errp)

  env-features[FEAT_C000_0001_EDX] = def-features[FEAT_C000_0001_EDX];
  env-features[FEAT_7_0_EBX] = def-features[FEAT_7_0_EBX];
  env-cpuid_xlevel2 = def-xlevel2;
+cpu-cache_info_passthrough = def-cache_info_passthrough;
  
  object_property_set_str(OBJECT(cpu), def-model_id, model-id, errp);

  }
@@ -2062,6 +2065,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
  break;
  case 2:
  /* cache info: needed for Pentium Pro compatibility */
+if (cpu-cache_info_passthrough) {
+host_cpuid(index, 0, eax, ebx, ecx, edx);
+break;
+}
  *eax = 1; /* Number of CPUID[EAX=2] calls required */
  *ebx = 0;
  *ecx = 0;
@@ -2071,6 +2078,10 @@ void cpu_x86_cpuid(CPUX86State *env, 

Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-18 Thread Peter Lieven

On 18.11.2013 16:23, Peter Lieven wrote:

I do not know, but this patch might introduce a regression.

If I specify: -smp 2,sockets=1,cores=2,threads=1 to a Windows 2012 R2 Server it 
crashes
at boot time. -smp 2 works.

for Linux /proc/cpuinfo reveals no cpu layout information (sibliings, cores, 
threads etc.) with
this patch applied and a manual socket,core,thread configuration.


git bisect start
# good: [62ecc3a0e3c77a4944c92a02dd7fae2ab1f2290d] Update VERSION for 1.6.1 
release
git bisect good 62ecc3a0e3c77a4944c92a02dd7fae2ab1f2290d
# bad: [964668b03d26f0b5baa5e5aff0c966f4fcb76e9e] Update version for 1.7.0-rc0 
release
git bisect bad 964668b03d26f0b5baa5e5aff0c966f4fcb76e9e
# good: [1ee2daeb6448312d6d0e22175f5c1b9b01f8974c] Update version for 1.6.0
git bisect good 1ee2daeb6448312d6d0e22175f5c1b9b01f8974c
# bad: [03cfd8faa7ffb7201e2949b99c2f35b1fef7078b] linux-user: add support of 
binfmt_misc 'O' flag
git bisect bad 03cfd8faa7ffb7201e2949b99c2f35b1fef7078b
# good: [5a93d5c2abc719bd44f6c9fbeed88d3cae712606] Merge remote-tracking branch 
'mjt/trivial-patches' into staging
git bisect good 5a93d5c2abc719bd44f6c9fbeed88d3cae712606
# good: [a27292b5d7545509bfa171922516d2033c570205] virtio-scsi: Make type 
virtio-scsi-common abstract
git bisect good a27292b5d7545509bfa171922516d2033c570205
# good: [469936ae0a9891b2de7e46743f683535b0819bee] target-i386: Fix segment 
cache dump
git bisect good 469936ae0a9891b2de7e46743f683535b0819bee
# bad: [3e4be9c29784df09c364b52a55e826a0b05b950e] Merge remote-tracking branch 
'qemu-kvm/uq/master' into staging
git bisect bad 3e4be9c29784df09c364b52a55e826a0b05b950e
# good: [2571f8f5fbaea5dc3bdcd84737f109b459576e90] Merge remote-tracking branch 
'spice/spice.v74' into staging
git bisect good 2571f8f5fbaea5dc3bdcd84737f109b459576e90
# good: [c5daeae1b4ddff97d605bd954a7c2a2b2cf6040f] linux-headers: update to 3.11
git bisect good c5daeae1b4ddff97d605bd954a7c2a2b2cf6040f
# good: [ceae18bd74e8940ff79935a257c72e665b084bcc] lsi: add 53C810 variant
git bisect good ceae18bd74e8940ff79935a257c72e665b084bcc
# bad: [f010bc643a2759e87e989c3e4e85f15ec71ae98f] target-i386: add feature 
kvm_pv_unhalt
git bisect bad f010bc643a2759e87e989c3e4e85f15ec71ae98f
# bad: [4f2656079f903efcd0d8224cbc79170ad3ee5b70] linux-headers: update to 
3.12-rc1
git bisect bad 4f2656079f903efcd0d8224cbc79170ad3ee5b70
# bad: [787aaf5703a702094f395db6795e74230282cd62] target-i386: forward CPUID 
cache leaves when -cpu host is used
git bisect bad 787aaf5703a702094f395db6795e74230282cd62

Peter

On 20.09.2013 18:24, Paolo Bonzini wrote:

From: Benoît Canet ben...@irqsave.net

Some users running cpu intensive tasks checking the cache CPUID leaves at
startup and making decisions based on the result reported that the guest was
not reflecting the host CPUID leaves when -cpu host is used.

This patch fix this.

Signed-off-by: Benoît Canet ben...@irqsave.net
[Rename new field to cache_info_passthrough - Paolo]
Signed-off-by: Paolo Bonzini pbonz...@redhat.com
---
  target-i386/cpu-qom.h |  3 +++
  target-i386/cpu.c | 19 +++
  2 files changed, 22 insertions(+)

diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h
index c4447c2..f4fab15 100644
--- a/target-i386/cpu-qom.h
+++ b/target-i386/cpu-qom.h
@@ -70,6 +70,9 @@ typedef struct X86CPU {
  bool hyperv_relaxed_timing;
  int hyperv_spinlock_attempts;
  +/* if true the CPUID code directly forward host cache leaves to the 
guest */
+bool cache_info_passthrough;
+
  /* Features that were filtered out because of missing host capabilities */
  uint32_t filtered_features[FEATURE_WORDS];
  diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index c36345e..46edd75 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -486,6 +486,7 @@ typedef struct x86_def_t {
  int stepping;
  FeatureWordArray features;
  char model_id[48];
+bool cache_info_passthrough;
  } x86_def_t;
#define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
@@ -1139,6 +1140,7 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def)
  assert(kvm_enabled());
x86_cpu_def-name = host;
+x86_cpu_def-cache_info_passthrough = true;
  host_cpuid(0x0, 0, eax, ebx, ecx, edx);
  x86_cpu_vendor_words2str(x86_cpu_def-vendor, ebx, edx, ecx);
  @@ -1888,6 +1890,7 @@ static void cpu_x86_register(X86CPU *cpu, const char 
*name, Error **errp)
  env-features[FEAT_C000_0001_EDX] = def-features[FEAT_C000_0001_EDX];
  env-features[FEAT_7_0_EBX] = def-features[FEAT_7_0_EBX];
  env-cpuid_xlevel2 = def-xlevel2;
+cpu-cache_info_passthrough = def-cache_info_passthrough;
object_property_set_str(OBJECT(cpu), def-model_id, model-id, errp);
  }
@@ -2062,6 +2065,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
  break;
  case 2:
  /* cache info: needed for Pentium Pro compatibility */
+if (cpu-cache_info_passthrough) {
+host_cpuid(index, 0, eax, ebx, ecx, edx);

Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-18 Thread Paolo Bonzini
Il 18/11/2013 16:37, Peter Lieven ha scritto:


 If I specify: -smp 2,sockets=1,cores=2,threads=1 to a Windows 2012 R2
 Server it crashes
 at boot time. -smp 2 works.
 for Linux /proc/cpuinfo reveals no cpu layout information (sibliings,
 cores, threads etc.) with
 this patch applied and a manual socket,core,thread configuration.

What's the full command line?

Paolo



Re: [Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-11-18 Thread Peter Lieven
Am 18.11.2013 17:11, schrieb Paolo Bonzini:
 Il 18/11/2013 16:37, Peter Lieven ha scritto:

 If I specify: -smp 2,sockets=1,cores=2,threads=1 to a Windows 2012 R2
 Server it crashes
 at boot time. -smp 2 works.
 for Linux /proc/cpuinfo reveals no cpu layout information (sibliings,
 cores, threads etc.) with
 this patch applied and a manual socket,core,thread configuration.
 What's the full command line?

The essential part is -enable-kvm -smp 2,sockets=1,cores=2,threads=1 -cpu host.
I believe the corect fix could be to disabled the cache leave forwarding as soon
as the user specifies his own socket/core/thread layout.

Peter




[Qemu-devel] [PULL 11/13] target-i386: forward CPUID cache leaves when -cpu host is used

2013-09-20 Thread Paolo Bonzini
From: Benoît Canet ben...@irqsave.net

Some users running cpu intensive tasks checking the cache CPUID leaves at
startup and making decisions based on the result reported that the guest was
not reflecting the host CPUID leaves when -cpu host is used.

This patch fix this.

Signed-off-by: Benoît Canet ben...@irqsave.net
[Rename new field to cache_info_passthrough - Paolo]
Signed-off-by: Paolo Bonzini pbonz...@redhat.com
---
 target-i386/cpu-qom.h |  3 +++
 target-i386/cpu.c | 19 +++
 2 files changed, 22 insertions(+)

diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h
index c4447c2..f4fab15 100644
--- a/target-i386/cpu-qom.h
+++ b/target-i386/cpu-qom.h
@@ -70,6 +70,9 @@ typedef struct X86CPU {
 bool hyperv_relaxed_timing;
 int hyperv_spinlock_attempts;
 
+/* if true the CPUID code directly forward host cache leaves to the guest 
*/
+bool cache_info_passthrough;
+
 /* Features that were filtered out because of missing host capabilities */
 uint32_t filtered_features[FEATURE_WORDS];
 
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index c36345e..46edd75 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -486,6 +486,7 @@ typedef struct x86_def_t {
 int stepping;
 FeatureWordArray features;
 char model_id[48];
+bool cache_info_passthrough;
 } x86_def_t;
 
 #define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
@@ -1139,6 +1140,7 @@ static void kvm_cpu_fill_host(x86_def_t *x86_cpu_def)
 assert(kvm_enabled());
 
 x86_cpu_def-name = host;
+x86_cpu_def-cache_info_passthrough = true;
 host_cpuid(0x0, 0, eax, ebx, ecx, edx);
 x86_cpu_vendor_words2str(x86_cpu_def-vendor, ebx, edx, ecx);
 
@@ -1888,6 +1890,7 @@ static void cpu_x86_register(X86CPU *cpu, const char 
*name, Error **errp)
 env-features[FEAT_C000_0001_EDX] = def-features[FEAT_C000_0001_EDX];
 env-features[FEAT_7_0_EBX] = def-features[FEAT_7_0_EBX];
 env-cpuid_xlevel2 = def-xlevel2;
+cpu-cache_info_passthrough = def-cache_info_passthrough;
 
 object_property_set_str(OBJECT(cpu), def-model_id, model-id, errp);
 }
@@ -2062,6 +2065,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
 break;
 case 2:
 /* cache info: needed for Pentium Pro compatibility */
+if (cpu-cache_info_passthrough) {
+host_cpuid(index, 0, eax, ebx, ecx, edx);
+break;
+}
 *eax = 1; /* Number of CPUID[EAX=2] calls required */
 *ebx = 0;
 *ecx = 0;
@@ -2071,6 +2078,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
 break;
 case 4:
 /* cache info: needed for Core compatibility */
+if (cpu-cache_info_passthrough) {
+host_cpuid(index, count, eax, ebx, ecx, edx);
+break;
+}
 if (cs-nr_cores  1) {
 *eax = (cs-nr_cores - 1)  26;
 } else {
@@ -2228,6 +2239,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
 break;
 case 0x8005:
 /* cache info (L1 cache) */
+if (cpu-cache_info_passthrough) {
+host_cpuid(index, 0, eax, ebx, ecx, edx);
+break;
+}
 *eax = (L1_DTLB_2M_ASSOC  24) | (L1_DTLB_2M_ENTRIES  16) | \
(L1_ITLB_2M_ASSOC   8) | (L1_ITLB_2M_ENTRIES);
 *ebx = (L1_DTLB_4K_ASSOC  24) | (L1_DTLB_4K_ENTRIES  16) | \
@@ -2239,6 +2254,10 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
 break;
 case 0x8006:
 /* cache info (L2 cache) */
+if (cpu-cache_info_passthrough) {
+host_cpuid(index, 0, eax, ebx, ecx, edx);
+break;
+}
 *eax = (AMD_ENC_ASSOC(L2_DTLB_2M_ASSOC)  28) | \
(L2_DTLB_2M_ENTRIES  16) | \
(AMD_ENC_ASSOC(L2_ITLB_2M_ASSOC)  12) | \
-- 
1.8.3.1