What's the downsides of using "host-model" rather than "host-passthrough" on Ryzen 3000 CPUs?

I have been playing all my games on a Windows VM using PCI passthrough for upwards of a year now. I remember at some point after a system update, I was no longer able to use “cpu-passthrough” because it caused a “security check” BSOD loop, so I had to switch to “cpu-model”.

This causes my VM to see my CPU model as “AMD EPYC Processor (with IBPB)”.

What consequences does this have for CPU performance?


The main reason I’m asking is that I recently got a new RTX 3000 series graphics card, and I was getting very unimpressive performance. After debugging for a while I tried enabling “Hardware Accelerated GPU scheduling” in Windows, and it immediately massively increased my FPS in games, to a shocking degree. This is strange, because from what I’ve read, this option shouldn’t impact performance much.

My take-away from that is that I was CPU-bound before, and after moving some GPU scheduling work over to the GPU, that bottleneck was partly removed.

But I have a Ryzen 3950X CPU and I’ve passed 8 cores to the VM. There is no reason I should be CPU bottlenecked. Is it possible that since Windows can’t see accurate model information about my CPU, it can’t properly schedule threads on the most appropriate cores?

Also, why did “host-passthrough” stop working in the first place? Is there a bug reported anywhere that I can watch?

I think the only way it could mess up thread scheduling is if you told it to pin cores and then lied about the topology.

For my Windows VM I pinned 12 cores of my Ryzen 3900 and told the VM it had one socket, 12 cores with 1 thread each.

If you tell the VM it has hyperthreads it will try to schedule tasks using that information.

I was never really clear on which pinned vcpu’s go to each hyperthread pair so I just avoided the issue. I’m also not entirely sure that the QEMU host scheduler will go to any effort to match up host hyperthread pairs with guest hyperthread pairs if you let the VM cores float without pinning.

1 Like

Passthrough is always the best way to go, it gives a more direct approach to virtualizing the CPU. Also with passthrough, Windows is usually able to display the CPU name correctly in task manager and the system spec pages.

Also i believe they may effect specified CPU features when specifying them on the libvirt page, but again iam not 100% positive on that front.

When it says with IBPB it means it is using the security mitigations, which can effect performance.

This is why i disable specter and meltdown kernel patches.

The chance of having code exploited on a consumer system is slim to none.

Also exploiting those vulnerabilities is much harder than your basic wifi and brute force attacks. At least to my knowledge, but i could be wrong.

Specter and meltdown have some pretty drastic performance impacts along with TSC clock source synchronization.

Sound like you just need a better libvirt xml, disable some of the security mitigations. Make sure you are running TSC clock source.

Anything around a 1600 score for passmark in single thread should be able to push a RTX 3080 at higher frames no problem.

Your Epyc problem has around the same single treaded performance my E5-2687W v2s do for performance.

Your restart is probably a bios security mitigation setting i would guess. Either way it sound like something i could help you with.

Iam very good at KVM configurations and i have pretty good knowledge on how to screen the most performance out of 1.

Just about every guide out there for KVMs is missing vital information…

Do you have a discord tag you can PM me ?

My old Xeons dont have any issue with any games besides starcraft 2 and thats because its almost fully single threaded. It is also demands alot of CPU for as do most RTS games.

Anyway sounds like your config is bad. Can you post your libvirt xml file please?

1 Like

I think the only way it could mess up thread scheduling is if you told it to pin cores and then lied about the topology.

For my Windows VM I pinned 12 cores of my Ryzen 3900 and told the VM it had one socket, 12 cores with 1 thread each.

If you tell the VM it has hyperthreads it will try to schedule tasks using that information.

I was never really clear on which pinned vcpu’s go to each hyperthread pair so I just avoided the issue. I’m also not entirely sure that the QEMU host scheduler will go to any effort to match up host hyperthread pairs with guest hyperthread pairs if you let the VM cores float without pinning.

Everyone that uses isolcpus is messing up their scheduling for the QEMU process. It is what iam currently trying to find some one to help me make a libvirt hooks script for.

I updated my system to kernel 5.9.9 a few days ago, so I thought it was about time to try “host-passthrough” again, and apparently the “security check” BSOD loop has been fixed :grin: My task manager now correctly states “AMD Ryzen 9 3950X 16-Core Processor”.

At this point, how do I know if I have specter/meltdown mitigations enabled?

I downloaded and ran the PassMark CPU Single Threaded benchmark and I’m getting a score of 2399. This appears to be a pretty awful score for a Ryzen 3950X, which has a model average of 2702 according to PassMark :confused:

I’ll PM you my Discord tag, even though at this point my original question is moot… :slight_smile:

They are enabled by default you need to add the following to your /etc/default/grub file and update grub again

mitigations=off mds=off nopti

There are a few others for mitigations but on the later kernels you don’t need as many parameters to make sure they are disable. Unfortunately kernel parameters get depreciated often and you have to change the command. But for newer kernels that should be it.

pcie_aspm=off This one disables pcie power management

Also disable cstates in bios. Helps maintain a stable TSC clock source. (VERY IMPORTANT)

If you want more help my discord is
Fixapc#4399

2 Likes