Re: [PATCH] KVM: Disable preemption in kvm_get_running_vcpu()

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

 



On 07/02/20 17:34, Marc Zyngier wrote:
> Accessing a per-cpu variable only makes sense when preemption is
> disabled (and the kernel does check this when the right debug options
> are switched on).
> 
> For kvm_get_running_vcpu(), it is fine to return the value after
> re-enabling preemption, as the preempt notifiers will make sure that
> this is kept consistent across task migration (the comment above the
> function hints at it, but lacks the crucial preemption management).
> 
> While we're at it, move the comment from the ARM code, which explains
> why the whole thing works.
> 
> Fixes: 7495e22bb165 ("KVM: Move running VCPU from ARM to common code").
> Cc: Peter Xu <peterx@xxxxxxxxxx>
> Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx>
> Reported-by: Zenghui Yu <yuzenghui@xxxxxxxxxx>
> Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx>
> Link: https://lore.kernel.org/r/318984f6-bc36-33a3-abc6-bf2295974b06@xxxxxxxxxxx

Queued, thanks.

Paolo

> ---
>  virt/kvm/arm/vgic/vgic-mmio.c | 12 ------------
>  virt/kvm/kvm_main.c           | 16 +++++++++++++---
>  2 files changed, 13 insertions(+), 15 deletions(-)
> 
> diff --git a/virt/kvm/arm/vgic/vgic-mmio.c b/virt/kvm/arm/vgic/vgic-mmio.c
> index d656ebd5f9d4..97fb2a40e6ba 100644
> --- a/virt/kvm/arm/vgic/vgic-mmio.c
> +++ b/virt/kvm/arm/vgic/vgic-mmio.c
> @@ -179,18 +179,6 @@ unsigned long vgic_mmio_read_pending(struct kvm_vcpu *vcpu,
>  	return value;
>  }
>  
> -/*
> - * This function will return the VCPU that performed the MMIO access and
> - * trapped from within the VM, and will return NULL if this is a userspace
> - * access.
> - *
> - * We can disable preemption locally around accessing the per-CPU variable,
> - * and use the resolved vcpu pointer after enabling preemption again, because
> - * even if the current thread is migrated to another CPU, reading the per-CPU
> - * value later will give us the same value as we update the per-CPU variable
> - * in the preempt notifier handlers.
> - */
> -
>  /* Must be called with irq->irq_lock held */
>  static void vgic_hw_irq_spending(struct kvm_vcpu *vcpu, struct vgic_irq *irq,
>  				 bool is_uaccess)
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 67ae2d5c37b2..70f03ce0e5c1 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -4409,12 +4409,22 @@ static void kvm_sched_out(struct preempt_notifier *pn,
>  
>  /**
>   * kvm_get_running_vcpu - get the vcpu running on the current CPU.
> - * Thanks to preempt notifiers, this can also be called from
> - * preemptible context.
> + *
> + * We can disable preemption locally around accessing the per-CPU variable,
> + * and use the resolved vcpu pointer after enabling preemption again,
> + * because even if the current thread is migrated to another CPU, reading
> + * the per-CPU value later will give us the same value as we update the
> + * per-CPU variable in the preempt notifier handlers.
>   */
>  struct kvm_vcpu *kvm_get_running_vcpu(void)
>  {
> -        return __this_cpu_read(kvm_running_vcpu);
> +	struct kvm_vcpu *vcpu;
> +
> +	preempt_disable();
> +	vcpu = __this_cpu_read(kvm_running_vcpu);
> +	preempt_enable();
> +
> +	return vcpu;
>  }
>  
>  /**
> 

_______________________________________________
kvmarm mailing list
kvmarm@xxxxxxxxxxxxxxxxxxxxx
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm



[Index of Archives]     [Linux KVM]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux