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

Re: [Xen-devel] [PATCH 2/4] xen/arm: read ACTLR on the pcpu where the vcpu will run

Hi Stefano,

On 15/02/18 23:16, Stefano Stabellini wrote:
On big.LITTLE systems not all cores have the same ACTLR. Instead of
reading ACTLR and setting v->arch.actlr in vcpu_initialise, which is run
always on pcpu 0, do it later on the same pcpu where the vcpu will run.

While the Hardware domain vCPUs will always be created on pCPU 0, this may not be the case for other domain as it is done via an hypercall.

This way, assuming that the vcpu has been created with the right pcpu
affinity, the guest will be able to read the right ACTLR value, matching
the one of the physical cpu.

Signed-off-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
  xen/arch/arm/domain.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index a010443..532e824 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -314,6 +314,8 @@ static void schedule_tail(struct vcpu *prev)
static void continue_new_vcpu(struct vcpu *prev)
+    current->arch.actlr = READ_SYSREG32(ACTLR_EL1);

This is not enough, you also need to move the call of processor_vcpu_initialise here. For instance on Cortex-A15, this will set/clear the SMP bit in ACTLR.

Also, I just noticed that processor_vcpu_initialize (in arch/arm/processor.c) assumes all the processor will be the same. We probably want to turn the variable processor into a per-cpu value.

if ( is_idle_vcpu(current) )
@@ -540,8 +542,6 @@ int vcpu_initialise(struct vcpu *v)
v->arch.vmpidr = MPIDR_SMP | vcpuid_to_vaffinity(v->vcpu_id); - v->arch.actlr = READ_SYSREG32(ACTLR_EL1);
      v->arch.hcr_el2 = get_default_hcr_flags();


Julien Grall

Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.