Commit 4edaac51 authored by Sukadev Bhattiprolu's avatar Sukadev Bhattiprolu Committed by Michael Ellerman

powerpc/pseries/svm: Disable doorbells in SVM guests

Normally, the HV emulates some instructions like MSGSNDP, MSGCLRP
from a KVM guest. To emulate the instructions, it must first read
the instruction from the guest's memory and decode its parameters.

However for a secure guest (aka SVM), the page containing the
instruction is in secure memory and the HV cannot access directly.
It would need the Ultravisor (UV) to facilitate accessing the
instruction and parameters but the UV currently does not have
the support for such accesses.

Until the UV has such support, disable doorbells in SVMs. This might
incur a performance hit but that is yet to be quantified.

With this patch applied (needed only in SVMs not needed for HV) we
are able to launch SVM guests with multi-core support. Eg:

	qemu -smp sockets=2,cores=2,threads=2.

Fix suggested by Benjamin Herrenschmidt. Thanks to input from
Paul Mackerras, Ram Pai and Michael Anderson.
Signed-off-by: default avatarSukadev Bhattiprolu <sukadev@linux.ibm.com>
Signed-off-by: default avatarThiago Jung Bauermann <bauerman@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20190820021326.6884-13-bauerman@linux.ibm.com
parent 734560ac
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include <asm/dbell.h> #include <asm/dbell.h>
#include <asm/plpar_wrappers.h> #include <asm/plpar_wrappers.h>
#include <asm/code-patching.h> #include <asm/code-patching.h>
#include <asm/svm.h>
#include "pseries.h" #include "pseries.h"
#include "offline_states.h" #include "offline_states.h"
...@@ -221,7 +222,7 @@ static __init void pSeries_smp_probe_xics(void) ...@@ -221,7 +222,7 @@ static __init void pSeries_smp_probe_xics(void)
{ {
xics_smp_probe(); xics_smp_probe();
if (cpu_has_feature(CPU_FTR_DBELL)) if (cpu_has_feature(CPU_FTR_DBELL) && !is_secure_guest())
smp_ops->cause_ipi = smp_pseries_cause_ipi; smp_ops->cause_ipi = smp_pseries_cause_ipi;
else else
smp_ops->cause_ipi = icp_ops->cause_ipi; smp_ops->cause_ipi = icp_ops->cause_ipi;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment