All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoffer Dall <cdall@linaro.org>
To: Marc Zyngier <marc.zyngier@arm.com>
Cc: linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org,
	Christoffer Dall <christoffer.dall@linaro.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Jason Cooper <jason@lakedaemon.net>,
	Eric Auger <eric.auger@redhat.com>,
	Shanker Donthineni <shankerd@codeaurora.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Shameerali Kolothum Thodi  <shameerali.kolothum.thodi@huawei.com>
Subject: Re: [PATCH v3 41/59] KVM: arm/arm64: GICv4: Wire mapping/unmapping of VLPIs in VFIO irq bypass
Date: Wed, 30 Aug 2017 21:59:30 +0200	[thread overview]
Message-ID: <20170830195930.GJ24522@cbox> (raw)
In-Reply-To: <9fc83ca2-bdae-ffbc-9d81-c77c331b47d2@arm.com>

On Wed, Aug 30, 2017 at 01:53:30PM +0100, Marc Zyngier wrote:
> On 30/08/17 12:46, Christoffer Dall wrote:
> > On Wed, Aug 30, 2017 at 11:28:08AM +0100, Marc Zyngier wrote:
> >> On 26/08/17 20:48, Christoffer Dall wrote:
> >>> On Mon, Jul 31, 2017 at 06:26:19PM +0100, Marc Zyngier wrote:
> >>>> Let's use the irq bypass mechanism introduced for platform device
> >>>> interrupts to intercept the virtual PCIe endpoint configuration
> >>>> and establish our LPI->VLPI mapping.
> >>>>
> >>>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> >>>> ---
> >>>>  include/kvm/arm_vgic.h      |   8 ++++
> >>>>  virt/kvm/arm/arm.c          |  27 ++++++++----
> >>>>  virt/kvm/arm/vgic/vgic-v4.c | 103 ++++++++++++++++++++++++++++++++++++++++++++
> >>>>  3 files changed, 130 insertions(+), 8 deletions(-)
> >>>>
> >>>> diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h
> >>>> index 359eeffe9857..050f78d4fb42 100644
> >>>> --- a/include/kvm/arm_vgic.h
> >>>> +++ b/include/kvm/arm_vgic.h
> >>>> @@ -367,4 +367,12 @@ int kvm_vgic_set_forwarding(struct kvm *kvm, unsigned int host_irq,
> >>>>  void kvm_vgic_unset_forwarding(struct kvm *kvm, unsigned int host_irq,
> >>>>  			       unsigned int vintid);
> >>>>  
> >>>> +struct kvm_kernel_irq_routing_entry;
> >>>> +
> >>>> +int kvm_vgic_v4_set_forwarding(struct kvm *kvm, int irq,
> >>>> +			       struct kvm_kernel_irq_routing_entry *irq_entry);
> >>>> +
> >>>> +int kvm_vgic_v4_unset_forwarding(struct kvm *kvm, int irq,
> >>>> +				 struct kvm_kernel_irq_routing_entry *irq_entry);
> >>>> +
> >>>>  #endif /* __KVM_ARM_VGIC_H */
> >>>> diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
> >>>> index ebab6c29e3be..6803ea27c47d 100644
> >>>> --- a/virt/kvm/arm/arm.c
> >>>> +++ b/virt/kvm/arm/arm.c
> >>>> @@ -1457,11 +1457,16 @@ int kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *cons,
> >>>>  	struct kvm_kernel_irqfd *irqfd =
> >>>>  		container_of(cons, struct kvm_kernel_irqfd, consumer);
> >>>>  
> >>>> -	if (prod->type != IRQ_BYPASS_VFIO_PLATFORM)
> >>>> +	switch (prod->type) {
> >>>> +	case IRQ_BYPASS_VFIO_PLATFORM:
> >>>> +		return kvm_vgic_set_forwarding(irqfd->kvm, prod->irq,
> >>>> +					       irqfd->gsi + VGIC_NR_PRIVATE_IRQS);
> >>>> +	case IRQ_BYPASS_VFIO_PCI_MSI:
> >>>> +		return kvm_vgic_v4_set_forwarding(irqfd->kvm, prod->irq,
> >>>> +						  &irqfd->irq_entry);
> >>>> +	default:
> >>>>  		return 0;
> >>>> -
> >>>> -	return kvm_vgic_set_forwarding(irqfd->kvm, prod->irq,
> >>>> -				       irqfd->gsi + VGIC_NR_PRIVATE_IRQS);
> >>>> +	}
> >>>>  }
> >>>>  void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *cons,
> >>>>  				      struct irq_bypass_producer *prod)
> >>>> @@ -1469,11 +1474,17 @@ void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *cons,
> >>>>  	struct kvm_kernel_irqfd *irqfd =
> >>>>  		container_of(cons, struct kvm_kernel_irqfd, consumer);
> >>>>  
> >>>> -	if (prod->type != IRQ_BYPASS_VFIO_PLATFORM)
> >>>> -		return;
> >>>> +	switch (prod->type) {
> >>>> +	case IRQ_BYPASS_VFIO_PLATFORM:
> >>>> +		kvm_vgic_unset_forwarding(irqfd->kvm, prod->irq,
> >>>> +					  irqfd->gsi + VGIC_NR_PRIVATE_IRQS);
> >>>> +		break;
> >>>>  
> >>>> -	kvm_vgic_unset_forwarding(irqfd->kvm, prod->irq,
> >>>> -				  irqfd->gsi + VGIC_NR_PRIVATE_IRQS);
> >>>> +	case IRQ_BYPASS_VFIO_PCI_MSI:
> >>>> +		kvm_vgic_v4_unset_forwarding(irqfd->kvm, prod->irq,
> >>>> +					     &irqfd->irq_entry);
> >>>> +		break;
> >>>> +	}
> >>>>  }
> >>>>  
> >>>>  void kvm_arch_irq_bypass_stop(struct irq_bypass_consumer *cons)
> >>>> diff --git a/virt/kvm/arm/vgic/vgic-v4.c b/virt/kvm/arm/vgic/vgic-v4.c
> >>>> index 207e1fda0dcd..338c86c5159f 100644
> >>>> --- a/virt/kvm/arm/vgic/vgic-v4.c
> >>>> +++ b/virt/kvm/arm/vgic/vgic-v4.c
> >>>> @@ -72,3 +72,106 @@ void vgic_v4_teardown(struct kvm *kvm)
> >>>>  	its_vm->nr_vpes = 0;
> >>>>  	its_vm->vpes = NULL;
> >>>>  }
> >>>> +
> >>>> +static struct vgic_its *vgic_get_its(struct kvm *kvm,
> >>>> +				     struct kvm_kernel_irq_routing_entry *irq_entry)
> >>>> +{
> >>>> +	struct kvm_msi msi  = (struct kvm_msi) {
> >>>> +		.address_lo	= irq_entry->msi.address_lo,
> >>>> +		.address_hi	= irq_entry->msi.address_hi,
> >>>> +		.data		= irq_entry->msi.data,
> >>>> +		.flags		= irq_entry->msi.flags,
> >>>> +		.devid		= irq_entry->msi.devid,
> >>>> +	};
> >>>> +
> >>>> +	/*
> >>>> +	 * Get a reference on the LPI. If NULL, this is not a valid
> >>>> +	 * translation for any of our vITSs.
> >>>> +	 */
> >>>> +	return vgic_msi_to_its(kvm, &msi);
> >>>> +}
> >>>> +
> >>>> +int kvm_vgic_v4_set_forwarding(struct kvm *kvm, int virq,
> >>>> +			       struct kvm_kernel_irq_routing_entry *irq_entry)
> >>>> +{
> >>>> +	struct vgic_its *its;
> >>>> +	struct vgic_irq *irq;
> >>>> +	struct its_vlpi_map map;
> >>>> +	int ret;
> >>>> +
> >>>> +	if (!vgic_is_v4_capable(kvm))
> >>>> +		return 0;
> >>>> +
> >>>> +	/*
> >>>> +	 * Get the ITS, and escape early on error (not a valid
> >>>> +	 * doorbell for any of our vITSs).
> >>>> +	 */
> >>>> +	its = vgic_get_its(kvm, irq_entry);
> >>>> +	if (IS_ERR(its))
> >>>> +		return 0;
> >>>> +
> >>>> +	mutex_lock(&its->its_lock);
> >>>> +
> >>>> +	/* Perform then actual DevID/EventID -> LPI translation. */
> >>>> +	ret = vgic_its_resolve_lpi(kvm, its, irq_entry->msi.devid,
> >>>> +				   irq_entry->msi.data, &irq);
> >>>> +	if (ret)
> >>>> +		goto out;
> >>>> +
> >>>> +	/*
> >>>> +	 * Emit the mapping request. If it fails, the ITS probably
> >>>> +	 * isn't v4 compatible, so let's silently bail out. Holding
> >>>> +	 * the ITS lock should ensure that nothing can modify the
> >>>> +	 * target vcpu.
> >>>> +	 */
> >>>> +	map = (struct its_vlpi_map) {
> >>>> +		.vm		= &kvm->arch.vgic.its_vm,
> >>>> +		.vintid		= irq->intid,
> >>>> +		.db_enabled	= true,
> >>>> +		.vpe_idx	= irq->target_vcpu->vcpu_id,
> >>
> >> This is just wrong. We cannot assume that the vcpu_id has anything to do
> >> with the vpe_idx. It happens to be the same thing now, but the two things
> >> should be clearly disconnected.
> >>
> >> I suggest the following (untested):
> >>
> >> diff --git a/virt/kvm/arm/vgic/vgic-v4.c b/virt/kvm/arm/vgic/vgic-v4.c
> >> index cf5d6e2de6b8..0146e004401a 100644
> >> --- a/virt/kvm/arm/vgic/vgic-v4.c
> >> +++ b/virt/kvm/arm/vgic/vgic-v4.c
> >> @@ -251,13 +251,27 @@ static void dump_routing(int virq, struct kvm_kernel_irq_routing_entry *irq_entr
> >>  
> >>  }
> >>  
> >> +static int vgic_v4_vcpu_to_index(struct its_vm *its_vm, struct kvm_vcpu *vcpu)
> >> +{
> >> +	int i;
> >> +
> >> +	for (i = 0; i < its_vm->nr_vpes; i++) {
> >> +		struct its_vpe *vpe = &vcpu->arch.vgic_cpu.vgic_v3.its_vpe;
> >> +
> >> +		if (its_vm->vpes[i] == vpe)
> >> +			return i;
> >> +	}
> >> +
> >> +	return -ENODEV;
> >> +}
> >> +
> > 
> > Stupid question: Can we change the struct its_vlpi_map to contain a
> > vpe pointer or in stead of or in addition to the index?
> 
> This is obviously the right solution, because the *index* of the VPE 
> doesn't really matter for a map/unmap (it only matters for doorbell 
> operations, and that's a very different code path).
> 
> I came up with the following (untested, again), which is much more
> appealing:
> 
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index b47097a3e4b4..0607541fcafc 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -900,7 +900,7 @@ static void its_send_vmapti(struct its_device *dev, u32 id)
>  	struct its_vlpi_map *map = &dev->event_map.vlpi_maps[id];
>  	struct its_cmd_desc desc;
>  
> -	desc.its_vmapti_cmd.vpe = map->vm->vpes[map->vpe_idx];
> +	desc.its_vmapti_cmd.vpe = map->vpe;
>  	desc.its_vmapti_cmd.dev = dev;
>  	desc.its_vmapti_cmd.virt_id = map->vintid;
>  	desc.its_vmapti_cmd.event_id = id;
> @@ -914,7 +914,7 @@ static void its_send_vmovi(struct its_device *dev, u32 id)
>  	struct its_vlpi_map *map = &dev->event_map.vlpi_maps[id];
>  	struct its_cmd_desc desc;
>  
> -	desc.its_vmovi_cmd.vpe = map->vm->vpes[map->vpe_idx];
> +	desc.its_vmovi_cmd.vpe = map->vpe;
>  	desc.its_vmovi_cmd.dev = dev;
>  	desc.its_vmovi_cmd.event_id = id;
>  	desc.its_vmovi_cmd.db_enabled = map->db_enabled;
> diff --git a/include/linux/irqchip/arm-gic-v4.h b/include/linux/irqchip/arm-gic-v4.h
> index 52661b838821..58a4d89aa82c 100644
> --- a/include/linux/irqchip/arm-gic-v4.h
> +++ b/include/linux/irqchip/arm-gic-v4.h
> @@ -62,15 +62,15 @@ struct its_vpe {
>   * irq_set_vcpu_affinity().
>   *
>   * @vm:		Pointer to the GICv4 notion of a VM
> + * @vpe:	Pointer to the GICv4 notion of a virtual CPU (VPE)
>   * @vintid:	Virtual LPI number
>   * @db_enabled:	Is the VPE doorbell to be generated?
> - * @vpe_idx:	Index (0-based) of the VPE in this VM. Not the vpe_id!
>   */
>  struct its_vlpi_map {
>  	struct its_vm		*vm;
> +	struct its_vpe		*vpe;
>  	u32			vintid;
>  	bool			db_enabled;
> -	u16			vpe_idx;
>  };
>  
>  enum its_vcpu_info_cmd_type {
> diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c
> index d790d0c74b8b..6ba3d73e0f70 100644
> --- a/virt/kvm/arm/vgic/vgic-its.c
> +++ b/virt/kvm/arm/vgic/vgic-its.c
> @@ -715,7 +715,7 @@ static int vgic_its_cmd_handle_movi(struct kvm *kvm, struct vgic_its *its,
>  		if (ret)
>  			return ret;
>  
> -		map.vpe_idx = vcpu->vcpu_id;
> +		map.vpe = &vcpu->arch.vgic_cpu.vgic_v3.its_vpe;
>  
>  		return its_map_vlpi(ite->irq->host_irq, &map);
>  	}
> @@ -1184,7 +1184,7 @@ static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its,
>  			struct its_vlpi_map map;
>  
>  			if (!its_get_vlpi(irq->host_irq, &map)) {
> -				map.vpe_idx = vcpu2->vcpu_id;
> +				map.vpe = &vcpu2->arch.vgic_cpu.vgic_v3.its_vpe;
>  				its_map_vlpi(irq->host_irq, &map);
>  			}
>  		}
> diff --git a/virt/kvm/arm/vgic/vgic-v4.c b/virt/kvm/arm/vgic/vgic-v4.c
> index cf5d6e2de6b8..6ece88322013 100644
> --- a/virt/kvm/arm/vgic/vgic-v4.c
> +++ b/virt/kvm/arm/vgic/vgic-v4.c
> @@ -288,9 +288,9 @@ int kvm_vgic_v4_set_forwarding(struct kvm *kvm, int virq,
>  	 */
>  	map = (struct its_vlpi_map) {
>  		.vm		= &kvm->arch.vgic.its_vm,
> +		.vpe		= &irq->target_vcpu->arch.vgic_cpu.vgic_v3.its_vpe,
>  		.vintid		= irq->intid,
>  		.db_enabled	= true,
> -		.vpe_idx	= irq->target_vcpu->vcpu_id,
>  	};
>  
>  	if (its_map_vlpi(virq, &map))
> 
> Maybe I'll introduce a vcpu_to_vpe() helper, but it already looks much 
> better to me...
> 
Yes, indeed.  Looks good to me as well.

The only thing that makes me slightly nervous is the use of target_vcpu,
but I think we rely on it never being NULL for LPIs elsewhere in the
code, so we should be fine.

Thanks,
-Christoffer

WARNING: multiple messages have this Message-ID (diff)
From: cdall@linaro.org (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 41/59] KVM: arm/arm64: GICv4: Wire mapping/unmapping of VLPIs in VFIO irq bypass
Date: Wed, 30 Aug 2017 21:59:30 +0200	[thread overview]
Message-ID: <20170830195930.GJ24522@cbox> (raw)
In-Reply-To: <9fc83ca2-bdae-ffbc-9d81-c77c331b47d2@arm.com>

On Wed, Aug 30, 2017 at 01:53:30PM +0100, Marc Zyngier wrote:
> On 30/08/17 12:46, Christoffer Dall wrote:
> > On Wed, Aug 30, 2017 at 11:28:08AM +0100, Marc Zyngier wrote:
> >> On 26/08/17 20:48, Christoffer Dall wrote:
> >>> On Mon, Jul 31, 2017 at 06:26:19PM +0100, Marc Zyngier wrote:
> >>>> Let's use the irq bypass mechanism introduced for platform device
> >>>> interrupts to intercept the virtual PCIe endpoint configuration
> >>>> and establish our LPI->VLPI mapping.
> >>>>
> >>>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> >>>> ---
> >>>>  include/kvm/arm_vgic.h      |   8 ++++
> >>>>  virt/kvm/arm/arm.c          |  27 ++++++++----
> >>>>  virt/kvm/arm/vgic/vgic-v4.c | 103 ++++++++++++++++++++++++++++++++++++++++++++
> >>>>  3 files changed, 130 insertions(+), 8 deletions(-)
> >>>>
> >>>> diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h
> >>>> index 359eeffe9857..050f78d4fb42 100644
> >>>> --- a/include/kvm/arm_vgic.h
> >>>> +++ b/include/kvm/arm_vgic.h
> >>>> @@ -367,4 +367,12 @@ int kvm_vgic_set_forwarding(struct kvm *kvm, unsigned int host_irq,
> >>>>  void kvm_vgic_unset_forwarding(struct kvm *kvm, unsigned int host_irq,
> >>>>  			       unsigned int vintid);
> >>>>  
> >>>> +struct kvm_kernel_irq_routing_entry;
> >>>> +
> >>>> +int kvm_vgic_v4_set_forwarding(struct kvm *kvm, int irq,
> >>>> +			       struct kvm_kernel_irq_routing_entry *irq_entry);
> >>>> +
> >>>> +int kvm_vgic_v4_unset_forwarding(struct kvm *kvm, int irq,
> >>>> +				 struct kvm_kernel_irq_routing_entry *irq_entry);
> >>>> +
> >>>>  #endif /* __KVM_ARM_VGIC_H */
> >>>> diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
> >>>> index ebab6c29e3be..6803ea27c47d 100644
> >>>> --- a/virt/kvm/arm/arm.c
> >>>> +++ b/virt/kvm/arm/arm.c
> >>>> @@ -1457,11 +1457,16 @@ int kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *cons,
> >>>>  	struct kvm_kernel_irqfd *irqfd =
> >>>>  		container_of(cons, struct kvm_kernel_irqfd, consumer);
> >>>>  
> >>>> -	if (prod->type != IRQ_BYPASS_VFIO_PLATFORM)
> >>>> +	switch (prod->type) {
> >>>> +	case IRQ_BYPASS_VFIO_PLATFORM:
> >>>> +		return kvm_vgic_set_forwarding(irqfd->kvm, prod->irq,
> >>>> +					       irqfd->gsi + VGIC_NR_PRIVATE_IRQS);
> >>>> +	case IRQ_BYPASS_VFIO_PCI_MSI:
> >>>> +		return kvm_vgic_v4_set_forwarding(irqfd->kvm, prod->irq,
> >>>> +						  &irqfd->irq_entry);
> >>>> +	default:
> >>>>  		return 0;
> >>>> -
> >>>> -	return kvm_vgic_set_forwarding(irqfd->kvm, prod->irq,
> >>>> -				       irqfd->gsi + VGIC_NR_PRIVATE_IRQS);
> >>>> +	}
> >>>>  }
> >>>>  void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *cons,
> >>>>  				      struct irq_bypass_producer *prod)
> >>>> @@ -1469,11 +1474,17 @@ void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *cons,
> >>>>  	struct kvm_kernel_irqfd *irqfd =
> >>>>  		container_of(cons, struct kvm_kernel_irqfd, consumer);
> >>>>  
> >>>> -	if (prod->type != IRQ_BYPASS_VFIO_PLATFORM)
> >>>> -		return;
> >>>> +	switch (prod->type) {
> >>>> +	case IRQ_BYPASS_VFIO_PLATFORM:
> >>>> +		kvm_vgic_unset_forwarding(irqfd->kvm, prod->irq,
> >>>> +					  irqfd->gsi + VGIC_NR_PRIVATE_IRQS);
> >>>> +		break;
> >>>>  
> >>>> -	kvm_vgic_unset_forwarding(irqfd->kvm, prod->irq,
> >>>> -				  irqfd->gsi + VGIC_NR_PRIVATE_IRQS);
> >>>> +	case IRQ_BYPASS_VFIO_PCI_MSI:
> >>>> +		kvm_vgic_v4_unset_forwarding(irqfd->kvm, prod->irq,
> >>>> +					     &irqfd->irq_entry);
> >>>> +		break;
> >>>> +	}
> >>>>  }
> >>>>  
> >>>>  void kvm_arch_irq_bypass_stop(struct irq_bypass_consumer *cons)
> >>>> diff --git a/virt/kvm/arm/vgic/vgic-v4.c b/virt/kvm/arm/vgic/vgic-v4.c
> >>>> index 207e1fda0dcd..338c86c5159f 100644
> >>>> --- a/virt/kvm/arm/vgic/vgic-v4.c
> >>>> +++ b/virt/kvm/arm/vgic/vgic-v4.c
> >>>> @@ -72,3 +72,106 @@ void vgic_v4_teardown(struct kvm *kvm)
> >>>>  	its_vm->nr_vpes = 0;
> >>>>  	its_vm->vpes = NULL;
> >>>>  }
> >>>> +
> >>>> +static struct vgic_its *vgic_get_its(struct kvm *kvm,
> >>>> +				     struct kvm_kernel_irq_routing_entry *irq_entry)
> >>>> +{
> >>>> +	struct kvm_msi msi  = (struct kvm_msi) {
> >>>> +		.address_lo	= irq_entry->msi.address_lo,
> >>>> +		.address_hi	= irq_entry->msi.address_hi,
> >>>> +		.data		= irq_entry->msi.data,
> >>>> +		.flags		= irq_entry->msi.flags,
> >>>> +		.devid		= irq_entry->msi.devid,
> >>>> +	};
> >>>> +
> >>>> +	/*
> >>>> +	 * Get a reference on the LPI. If NULL, this is not a valid
> >>>> +	 * translation for any of our vITSs.
> >>>> +	 */
> >>>> +	return vgic_msi_to_its(kvm, &msi);
> >>>> +}
> >>>> +
> >>>> +int kvm_vgic_v4_set_forwarding(struct kvm *kvm, int virq,
> >>>> +			       struct kvm_kernel_irq_routing_entry *irq_entry)
> >>>> +{
> >>>> +	struct vgic_its *its;
> >>>> +	struct vgic_irq *irq;
> >>>> +	struct its_vlpi_map map;
> >>>> +	int ret;
> >>>> +
> >>>> +	if (!vgic_is_v4_capable(kvm))
> >>>> +		return 0;
> >>>> +
> >>>> +	/*
> >>>> +	 * Get the ITS, and escape early on error (not a valid
> >>>> +	 * doorbell for any of our vITSs).
> >>>> +	 */
> >>>> +	its = vgic_get_its(kvm, irq_entry);
> >>>> +	if (IS_ERR(its))
> >>>> +		return 0;
> >>>> +
> >>>> +	mutex_lock(&its->its_lock);
> >>>> +
> >>>> +	/* Perform then actual DevID/EventID -> LPI translation. */
> >>>> +	ret = vgic_its_resolve_lpi(kvm, its, irq_entry->msi.devid,
> >>>> +				   irq_entry->msi.data, &irq);
> >>>> +	if (ret)
> >>>> +		goto out;
> >>>> +
> >>>> +	/*
> >>>> +	 * Emit the mapping request. If it fails, the ITS probably
> >>>> +	 * isn't v4 compatible, so let's silently bail out. Holding
> >>>> +	 * the ITS lock should ensure that nothing can modify the
> >>>> +	 * target vcpu.
> >>>> +	 */
> >>>> +	map = (struct its_vlpi_map) {
> >>>> +		.vm		= &kvm->arch.vgic.its_vm,
> >>>> +		.vintid		= irq->intid,
> >>>> +		.db_enabled	= true,
> >>>> +		.vpe_idx	= irq->target_vcpu->vcpu_id,
> >>
> >> This is just wrong. We cannot assume that the vcpu_id has anything to do
> >> with the vpe_idx. It happens to be the same thing now, but the two things
> >> should be clearly disconnected.
> >>
> >> I suggest the following (untested):
> >>
> >> diff --git a/virt/kvm/arm/vgic/vgic-v4.c b/virt/kvm/arm/vgic/vgic-v4.c
> >> index cf5d6e2de6b8..0146e004401a 100644
> >> --- a/virt/kvm/arm/vgic/vgic-v4.c
> >> +++ b/virt/kvm/arm/vgic/vgic-v4.c
> >> @@ -251,13 +251,27 @@ static void dump_routing(int virq, struct kvm_kernel_irq_routing_entry *irq_entr
> >>  
> >>  }
> >>  
> >> +static int vgic_v4_vcpu_to_index(struct its_vm *its_vm, struct kvm_vcpu *vcpu)
> >> +{
> >> +	int i;
> >> +
> >> +	for (i = 0; i < its_vm->nr_vpes; i++) {
> >> +		struct its_vpe *vpe = &vcpu->arch.vgic_cpu.vgic_v3.its_vpe;
> >> +
> >> +		if (its_vm->vpes[i] == vpe)
> >> +			return i;
> >> +	}
> >> +
> >> +	return -ENODEV;
> >> +}
> >> +
> > 
> > Stupid question: Can we change the struct its_vlpi_map to contain a
> > vpe pointer or in stead of or in addition to the index?
> 
> This is obviously the right solution, because the *index* of the VPE 
> doesn't really matter for a map/unmap (it only matters for doorbell 
> operations, and that's a very different code path).
> 
> I came up with the following (untested, again), which is much more
> appealing:
> 
> diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
> index b47097a3e4b4..0607541fcafc 100644
> --- a/drivers/irqchip/irq-gic-v3-its.c
> +++ b/drivers/irqchip/irq-gic-v3-its.c
> @@ -900,7 +900,7 @@ static void its_send_vmapti(struct its_device *dev, u32 id)
>  	struct its_vlpi_map *map = &dev->event_map.vlpi_maps[id];
>  	struct its_cmd_desc desc;
>  
> -	desc.its_vmapti_cmd.vpe = map->vm->vpes[map->vpe_idx];
> +	desc.its_vmapti_cmd.vpe = map->vpe;
>  	desc.its_vmapti_cmd.dev = dev;
>  	desc.its_vmapti_cmd.virt_id = map->vintid;
>  	desc.its_vmapti_cmd.event_id = id;
> @@ -914,7 +914,7 @@ static void its_send_vmovi(struct its_device *dev, u32 id)
>  	struct its_vlpi_map *map = &dev->event_map.vlpi_maps[id];
>  	struct its_cmd_desc desc;
>  
> -	desc.its_vmovi_cmd.vpe = map->vm->vpes[map->vpe_idx];
> +	desc.its_vmovi_cmd.vpe = map->vpe;
>  	desc.its_vmovi_cmd.dev = dev;
>  	desc.its_vmovi_cmd.event_id = id;
>  	desc.its_vmovi_cmd.db_enabled = map->db_enabled;
> diff --git a/include/linux/irqchip/arm-gic-v4.h b/include/linux/irqchip/arm-gic-v4.h
> index 52661b838821..58a4d89aa82c 100644
> --- a/include/linux/irqchip/arm-gic-v4.h
> +++ b/include/linux/irqchip/arm-gic-v4.h
> @@ -62,15 +62,15 @@ struct its_vpe {
>   * irq_set_vcpu_affinity().
>   *
>   * @vm:		Pointer to the GICv4 notion of a VM
> + * @vpe:	Pointer to the GICv4 notion of a virtual CPU (VPE)
>   * @vintid:	Virtual LPI number
>   * @db_enabled:	Is the VPE doorbell to be generated?
> - * @vpe_idx:	Index (0-based) of the VPE in this VM. Not the vpe_id!
>   */
>  struct its_vlpi_map {
>  	struct its_vm		*vm;
> +	struct its_vpe		*vpe;
>  	u32			vintid;
>  	bool			db_enabled;
> -	u16			vpe_idx;
>  };
>  
>  enum its_vcpu_info_cmd_type {
> diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c
> index d790d0c74b8b..6ba3d73e0f70 100644
> --- a/virt/kvm/arm/vgic/vgic-its.c
> +++ b/virt/kvm/arm/vgic/vgic-its.c
> @@ -715,7 +715,7 @@ static int vgic_its_cmd_handle_movi(struct kvm *kvm, struct vgic_its *its,
>  		if (ret)
>  			return ret;
>  
> -		map.vpe_idx = vcpu->vcpu_id;
> +		map.vpe = &vcpu->arch.vgic_cpu.vgic_v3.its_vpe;
>  
>  		return its_map_vlpi(ite->irq->host_irq, &map);
>  	}
> @@ -1184,7 +1184,7 @@ static int vgic_its_cmd_handle_movall(struct kvm *kvm, struct vgic_its *its,
>  			struct its_vlpi_map map;
>  
>  			if (!its_get_vlpi(irq->host_irq, &map)) {
> -				map.vpe_idx = vcpu2->vcpu_id;
> +				map.vpe = &vcpu2->arch.vgic_cpu.vgic_v3.its_vpe;
>  				its_map_vlpi(irq->host_irq, &map);
>  			}
>  		}
> diff --git a/virt/kvm/arm/vgic/vgic-v4.c b/virt/kvm/arm/vgic/vgic-v4.c
> index cf5d6e2de6b8..6ece88322013 100644
> --- a/virt/kvm/arm/vgic/vgic-v4.c
> +++ b/virt/kvm/arm/vgic/vgic-v4.c
> @@ -288,9 +288,9 @@ int kvm_vgic_v4_set_forwarding(struct kvm *kvm, int virq,
>  	 */
>  	map = (struct its_vlpi_map) {
>  		.vm		= &kvm->arch.vgic.its_vm,
> +		.vpe		= &irq->target_vcpu->arch.vgic_cpu.vgic_v3.its_vpe,
>  		.vintid		= irq->intid,
>  		.db_enabled	= true,
> -		.vpe_idx	= irq->target_vcpu->vcpu_id,
>  	};
>  
>  	if (its_map_vlpi(virq, &map))
> 
> Maybe I'll introduce a vcpu_to_vpe() helper, but it already looks much 
> better to me...
> 
Yes, indeed.  Looks good to me as well.

The only thing that makes me slightly nervous is the use of target_vcpu,
but I think we rely on it never being NULL for LPIs elsewhere in the
code, so we should be fine.

Thanks,
-Christoffer

  reply	other threads:[~2017-08-30 19:59 UTC|newest]

Thread overview: 354+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-31 17:25 [PATCH v3 00/59] irqchip: KVM: Add support for GICv4 Marc Zyngier
2017-07-31 17:25 ` Marc Zyngier
2017-07-31 17:25 ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 01/59] genirq: Let irq_set_vcpu_affinity() iterate over hierarchy Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 02/59] irqchip/gic-v3: Add redistributor iterator Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 03/59] irqchip/gic-v3: Add VLPI/DirectLPI discovery Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 04/59] irqchip/gic-v3-its: Move LPI definitions around Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 05/59] irqchip/gic-v3-its: Add probing for VLPI properties Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 06/59] irqchip/gic-v3-its: Macro-ize its_send_single_command Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 07/59] irqchip/gic-v3-its: Implement irq_set_irqchip_state for pending state Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 08/59] irqchip/gic-v3-its: Split out property table allocation Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 09/59] irqchip/gic-v3-its: Allow use of indirect VCPU tables Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 10/59] irqchip/gic-v3-its: Split out pending table allocation Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 11/59] irqchip/gic-v3-its: Rework LPI freeing Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 12/59] irqchip/gic-v3-its: Generalize device table allocation Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 13/59] irqchip/gic-v3-its: Generalize LPI configuration Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 14/59] irqchip/gic-v4: Add management structure definitions Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 15/59] irqchip/gic-v3-its: Add GICv4 ITS command definitions Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 16/59] irqchip/gic-v3-its: Add VLPI configuration hook Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 17/59] irqchip/gic-v3-its: Add VLPI map/unmap operations Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 18/59] irqchip/gic-v3-its: Add VLPI configuration handling Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 19/59] irqchip/gic-v3-its: Add VPE domain infrastructure Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 20/59] irqchip/gic-v3-its: Add VPE irq domain allocation/teardown Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25 ` [PATCH v3 21/59] irqchip/gic-v3-its: Add VPE irq domain [de]activation Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:25   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 22/59] irqchip/gic-v3-its: Add VPENDBASER/VPROPBASER accessors Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 23/59] irqchip/gic-v3-its: Add VPE scheduling Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 24/59] irqchip/gic-v3-its: Add VPE invalidation hook Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 25/59] irqchip/gic-v3-its: Add VPE affinity changes Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 26/59] irqchip/gic-v3-its: Add VPE interrupt masking Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 27/59] irqchip/gic-v3-its: Support VPE doorbell invalidation even when !DirectLPI Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 28/59] irqchip/gic-v3-its: Allow doorbell interrupts to be injected/cleared Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 29/59] irqchip/gic-v3-its: Set implementation defined bit to enable VLPIs Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 30/59] irqchip/gic-v4: Add per-VM VPE domain creation Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 31/59] irqchip/gic-v4: Add VPE command interface Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 32/59] irqchip/gic-v4: Add VLPI configuration interface Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 33/59] irqchip/gic-v4: Add some basic documentation Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 34/59] irqchip/gic-v4: Enable low-level GICv4 operations Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 35/59] irqchip/gic-v3: Advertise GICv4 support to KVM Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 36/59] KVM: arm: Select ARM_GIC_V3 and ARM_GIC_V3_ITS Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-26 19:49   ` Christoffer Dall
2017-08-26 19:49     ` Christoffer Dall
2017-08-26 19:49     ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 37/59] KVM: arm/arm64: vgic: Move kvm_vgic_destroy call around Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-26 19:49   ` Christoffer Dall
2017-08-26 19:49     ` Christoffer Dall
2017-08-26 19:49     ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 38/59] KVM: arm/arm64: vITS: Add MSI translation helpers Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-26 19:49   ` Christoffer Dall
2017-08-26 19:49     ` Christoffer Dall
2017-08-26 19:49     ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 39/59] KVM: arm/arm64: GICv4: Add property field and per-VM predicate Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-26 19:49   ` Christoffer Dall
2017-08-26 19:49     ` Christoffer Dall
2017-08-26 19:49     ` Christoffer Dall
2017-08-30  9:46     ` Marc Zyngier
2017-08-30  9:46       ` Marc Zyngier
2017-08-30  9:46       ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 40/59] KVM: arm/arm64: GICv4: Add init/teardown of the per-VM vPE irq domain Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-26 19:49   ` Christoffer Dall
2017-08-26 19:49     ` Christoffer Dall
2017-08-26 19:49     ` Christoffer Dall
2017-08-30  9:50     ` Marc Zyngier
2017-08-30  9:50       ` Marc Zyngier
2017-08-30  9:50       ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 41/59] KVM: arm/arm64: GICv4: Wire mapping/unmapping of VLPIs in VFIO irq bypass Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-26 19:48   ` Christoffer Dall
2017-08-26 19:48     ` Christoffer Dall
2017-08-26 19:48     ` Christoffer Dall
2017-08-30  9:42     ` Marc Zyngier
2017-08-30  9:42       ` Marc Zyngier
2017-08-30  9:42       ` Marc Zyngier
2017-08-30 10:20       ` Auger Eric
2017-08-30 10:20         ` Auger Eric
2017-08-30 10:20         ` Auger Eric
2017-08-30 10:42         ` Marc Zyngier
2017-08-30 10:42           ` Marc Zyngier
2017-08-30 10:42           ` Marc Zyngier
2017-08-30 12:54           ` Auger Eric
2017-08-30 12:54             ` Auger Eric
2017-08-30 12:54             ` Auger Eric
2017-08-30 10:28     ` Marc Zyngier
2017-08-30 10:28       ` Marc Zyngier
2017-08-30 10:28       ` Marc Zyngier
2017-08-30 11:46       ` Christoffer Dall
2017-08-30 11:46         ` Christoffer Dall
2017-08-30 11:46         ` Christoffer Dall
2017-08-30 12:53         ` Marc Zyngier
2017-08-30 12:53           ` Marc Zyngier
2017-08-30 12:53           ` Marc Zyngier
2017-08-30 19:59           ` Christoffer Dall [this message]
2017-08-30 19:59             ` Christoffer Dall
2017-08-30 19:59             ` Christoffer Dall
2017-08-31 10:24             ` Marc Zyngier
2017-08-31 10:24               ` Marc Zyngier
2017-08-31 10:24               ` Marc Zyngier
2017-08-31 12:36               ` Christoffer Dall
2017-08-31 12:36                 ` Christoffer Dall
2017-08-31 12:36                 ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 42/59] KVM: arm/arm64: GICv4: Handle INT command applied to a VLPI Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:18   ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 43/59] KVM: arm/arm64: GICv4: Unmap VLPI when freeing an LPI Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:18   ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-30 11:03     ` Marc Zyngier
2017-08-30 11:03       ` Marc Zyngier
2017-08-30 11:03       ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 44/59] KVM: arm/arm64: GICv4: Handle MOVI applied to a VLPI Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:18   ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-30 14:08     ` Marc Zyngier
2017-08-30 14:08       ` Marc Zyngier
2017-08-30 14:08       ` Marc Zyngier
2017-08-30 20:04       ` Christoffer Dall
2017-08-30 20:04         ` Christoffer Dall
2017-08-30 20:04         ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 45/59] KVM: arm/arm64: GICv4: Handle CLEAR " Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:18   ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 46/59] KVM: arm/arm64: GICv4: Handle MOVALL applied to a vPE Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:18   ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-30 14:46     ` Marc Zyngier
2017-08-30 14:46       ` Marc Zyngier
2017-08-30 14:46       ` Marc Zyngier
2017-08-30 20:10       ` Christoffer Dall
2017-08-30 20:10         ` Christoffer Dall
2017-08-30 20:10         ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 47/59] KVM: arm/arm64: GICv4: Propagate property updates to VLPIs Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:18   ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 48/59] KVM: arm/arm64: GICv4: Handle INVALL applied to a vPE Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:18   ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 49/59] KVM: arm/arm64: GICv4: Propagate VLPI properties at map time Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:18   ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-30 14:56     ` Marc Zyngier
2017-08-30 14:56       ` Marc Zyngier
2017-08-30 14:56       ` Marc Zyngier
2017-08-30 20:12       ` Christoffer Dall
2017-08-30 20:12         ` Christoffer Dall
2017-08-30 20:12         ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 50/59] KVM: arm/arm64: GICv4: Use pending_last as a scheduling hint Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:18   ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 51/59] KVM: arm/arm64: GICv4: Add doorbell interrupt handling Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-04  7:44   ` Marc Zyngier
2017-08-04  7:44     ` Marc Zyngier
2017-08-04  7:44     ` Marc Zyngier
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18       ` Christoffer Dall
2017-08-28 18:18       ` Christoffer Dall
2017-08-30 10:31       ` Andrew Jones
2017-08-30 10:31         ` Andrew Jones
2017-08-30 10:31         ` Andrew Jones
2017-08-30 11:55         ` Christoffer Dall
2017-08-30 11:55           ` Christoffer Dall
2017-08-30 11:55           ` Christoffer Dall
2017-08-30 12:28           ` Andrew Jones
2017-08-30 12:28             ` Andrew Jones
2017-08-30 12:28             ` Andrew Jones
2017-08-31 12:18       ` Marc Zyngier
2017-08-31 12:18         ` Marc Zyngier
2017-08-31 12:18         ` Marc Zyngier
2017-08-31 12:41         ` Christoffer Dall
2017-08-31 12:41           ` Christoffer Dall
2017-08-31 12:41           ` Christoffer Dall
2017-08-28 18:18   ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-30 15:36     ` Marc Zyngier
2017-08-30 15:36       ` Marc Zyngier
2017-08-30 15:36       ` Marc Zyngier
2017-08-30 20:58       ` Christoffer Dall
2017-08-30 20:58         ` Christoffer Dall
2017-08-30 20:58         ` Christoffer Dall
2017-08-31  8:19         ` Marc Zyngier
2017-08-31  8:19           ` Marc Zyngier
2017-08-31  8:19           ` Marc Zyngier
2017-09-06  9:06   ` Shannon Zhao
2017-09-06  9:06     ` Shannon Zhao
2017-09-06  9:06     ` Shannon Zhao
2017-07-31 17:26 ` [PATCH v3 52/59] KVM: arm/arm64: GICv4: Use the doorbell interrupt as an unblocking source Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:19   ` Christoffer Dall
2017-08-28 18:19     ` Christoffer Dall
2017-08-28 18:19     ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 53/59] KVM: arm/arm64: GICv4: Hook vPE scheduling into vgic flush/sync Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:17   ` Christoffer Dall
2017-08-28 18:17     ` Christoffer Dall
2017-08-28 18:17     ` Christoffer Dall
2017-08-30  9:59     ` Marc Zyngier
2017-08-30  9:59       ` Marc Zyngier
2017-08-30  9:59       ` Marc Zyngier
2017-08-30 11:56       ` Christoffer Dall
2017-08-30 11:56         ` Christoffer Dall
2017-08-30 11:56         ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 54/59] KVM: arm/arm64: GICv4: Enable virtual cpuif if VLPIs can be delivered Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:20   ` Christoffer Dall
2017-08-28 18:20     ` Christoffer Dall
2017-08-28 18:20     ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 55/59] KVM: arm/arm64: GICv4: Enable VLPI support Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:25   ` Christoffer Dall
2017-08-28 18:25     ` Christoffer Dall
2017-08-28 18:25     ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 56/59] KVM: arm/arm64: GICv4: Prevent heterogenous systems from using GICv4 Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:35   ` Christoffer Dall
2017-08-28 18:35     ` Christoffer Dall
2017-08-28 18:35     ` Christoffer Dall
2017-08-30 16:03     ` Marc Zyngier
2017-08-30 16:03       ` Marc Zyngier
2017-08-30 16:03       ` Marc Zyngier
2017-08-30 21:00       ` Christoffer Dall
2017-08-30 21:00         ` Christoffer Dall
2017-08-30 21:00         ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 57/59] KVM: arm/arm64: GICv4: Theory of operations Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-08-28 18:18   ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-28 18:18     ` Christoffer Dall
2017-08-30 11:30     ` Marc Zyngier
2017-08-30 11:30       ` Marc Zyngier
2017-08-30 11:30       ` Marc Zyngier
2017-08-30 11:58       ` Christoffer Dall
2017-08-30 11:58         ` Christoffer Dall
2017-08-30 11:58         ` Christoffer Dall
2017-07-31 17:26 ` [PATCH v3 58/59] irqchip/gic-v3-its: Pass its_node pointer to each command bulder Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26 ` [PATCH v3 59/59] irqchip/gic-v3-its: Workaround Huawei D05 redistributor addressing Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier
2017-07-31 17:26   ` Marc Zyngier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170830195930.GJ24522@cbox \
    --to=cdall@linaro.org \
    --cc=christoffer.dall@linaro.org \
    --cc=eric.auger@redhat.com \
    --cc=jason@lakedaemon.net \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=mark.rutland@arm.com \
    --cc=shameerali.kolothum.thodi@huawei.com \
    --cc=shankerd@codeaurora.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.