diff mbox

[v4,5/7] KVM: arm/arm64: build a default routing table

Message ID 1459759657-7402-6-git-send-email-eric.auger@linaro.org
State New
Headers show

Commit Message

Auger Eric April 4, 2016, 8:47 a.m. UTC
Implement a default routing table made of flat irqchip routing
entries (gsi = irqchip.pin) covering the VGIC SPI indexes.
This routing table is overwritten by the first user-space call
to KVM_SET_GSI_ROUTING ioctl.

Signed-off-by: Eric Auger <eric.auger@linaro.org>


---
---
 virt/kvm/arm/vgic/vgic_init.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

-- 
1.9.1

Comments

Christoffer Dall April 14, 2016, 12:05 p.m. UTC | #1
On Mon, Apr 04, 2016 at 10:47:35AM +0200, Eric Auger wrote:
> Implement a default routing table made of flat irqchip routing

> entries (gsi = irqchip.pin) covering the VGIC SPI indexes.

> This routing table is overwritten by the first user-space call

> to KVM_SET_GSI_ROUTING ioctl.

> 

> Signed-off-by: Eric Auger <eric.auger@linaro.org>

> 


so before applying this patch, but after applying the previous patch,
will our current GICv2m-based MSI injection work?

If not, is there a better split of these patches (e.g. squash this one
into the previous one)?

> ---

> ---

>  virt/kvm/arm/vgic/vgic_init.c | 24 ++++++++++++++++++++++++

>  1 file changed, 24 insertions(+)

> 

> diff --git a/virt/kvm/arm/vgic/vgic_init.c b/virt/kvm/arm/vgic/vgic_init.c

> index e4459e3..041443b 100644

> --- a/virt/kvm/arm/vgic/vgic_init.c

> +++ b/virt/kvm/arm/vgic/vgic_init.c

> @@ -261,6 +261,10 @@ int vgic_init(struct kvm *kvm)

>  	kvm_for_each_vcpu(i, vcpu, kvm)

>  		kvm_vgic_vcpu_init(vcpu);

>  

> +	ret = kvm_setup_default_irq_routing(kvm);

> +	if (ret)

> +		goto out;

> +

>  	dist->initialized = true;

>  out:

>  	return ret;

> @@ -454,3 +458,23 @@ out_free_irq:

>  			kvm_get_running_vcpus());

>  	return ret;

>  }

> +

> +int kvm_setup_default_irq_routing(struct kvm *kvm)

> +{

> +	struct kvm_irq_routing_entry *entries;

> +	struct vgic_dist *dist = &kvm->arch.vgic;

> +	u32 nr = dist->nr_spis;

> +	int i, ret;

> +

> +	entries = kcalloc(nr, sizeof(struct kvm_kernel_irq_routing_entry),

> +			  GFP_KERNEL);


I think you need to check if the allocation succeeded here or not...

> +	for (i = 0; i < nr; i++) {

> +		entries[i].gsi = i;

> +		entries[i].type = KVM_IRQ_ROUTING_IRQCHIP;

> +		entries[i].u.irqchip.irqchip = 0;

> +		entries[i].u.irqchip.pin = i;

> +	}

> +	ret = kvm_set_irq_routing(kvm, entries, nr, 0);

> +	kfree(entries);

> +	return ret;

> +}

> -- 

> 1.9.1

>
Auger Eric April 21, 2016, 2:51 p.m. UTC | #2
On 04/14/2016 02:05 PM, Christoffer Dall wrote:
> On Mon, Apr 04, 2016 at 10:47:35AM +0200, Eric Auger wrote:

>> Implement a default routing table made of flat irqchip routing

>> entries (gsi = irqchip.pin) covering the VGIC SPI indexes.

>> This routing table is overwritten by the first user-space call

>> to KVM_SET_GSI_ROUTING ioctl.

>>

>> Signed-off-by: Eric Auger <eric.auger@linaro.org>

>>

> 

> so before applying this patch, but after applying the previous patch,

> will our current GICv2m-based MSI injection work?


If you don't apply that patch and kernel does not build a default table,
userspace is obliged to do the job. if it doesn't the irqfd-> virtual
gsi forwarding will fail. So effectively it makes sense to squash both
patches.

> 

> If not, is there a better split of these patches (e.g. squash this one

> into the previous one)?

> 

>> ---

>> ---

>>  virt/kvm/arm/vgic/vgic_init.c | 24 ++++++++++++++++++++++++

>>  1 file changed, 24 insertions(+)

>>

>> diff --git a/virt/kvm/arm/vgic/vgic_init.c b/virt/kvm/arm/vgic/vgic_init.c

>> index e4459e3..041443b 100644

>> --- a/virt/kvm/arm/vgic/vgic_init.c

>> +++ b/virt/kvm/arm/vgic/vgic_init.c

>> @@ -261,6 +261,10 @@ int vgic_init(struct kvm *kvm)

>>  	kvm_for_each_vcpu(i, vcpu, kvm)

>>  		kvm_vgic_vcpu_init(vcpu);

>>  

>> +	ret = kvm_setup_default_irq_routing(kvm);

>> +	if (ret)

>> +		goto out;

>> +

>>  	dist->initialized = true;

>>  out:

>>  	return ret;

>> @@ -454,3 +458,23 @@ out_free_irq:

>>  			kvm_get_running_vcpus());

>>  	return ret;

>>  }

>> +

>> +int kvm_setup_default_irq_routing(struct kvm *kvm)

>> +{

>> +	struct kvm_irq_routing_entry *entries;

>> +	struct vgic_dist *dist = &kvm->arch.vgic;

>> +	u32 nr = dist->nr_spis;

>> +	int i, ret;

>> +

>> +	entries = kcalloc(nr, sizeof(struct kvm_kernel_irq_routing_entry),

>> +			  GFP_KERNEL);

> 

> I think you need to check if the allocation succeeded here or not...

sure

thanks

Eric
> 

>> +	for (i = 0; i < nr; i++) {

>> +		entries[i].gsi = i;

>> +		entries[i].type = KVM_IRQ_ROUTING_IRQCHIP;

>> +		entries[i].u.irqchip.irqchip = 0;

>> +		entries[i].u.irqchip.pin = i;

>> +	}

>> +	ret = kvm_set_irq_routing(kvm, entries, nr, 0);

>> +	kfree(entries);

>> +	return ret;

>> +}

>> -- 

>> 1.9.1

>>
diff mbox

Patch

diff --git a/virt/kvm/arm/vgic/vgic_init.c b/virt/kvm/arm/vgic/vgic_init.c
index e4459e3..041443b 100644
--- a/virt/kvm/arm/vgic/vgic_init.c
+++ b/virt/kvm/arm/vgic/vgic_init.c
@@ -261,6 +261,10 @@  int vgic_init(struct kvm *kvm)
 	kvm_for_each_vcpu(i, vcpu, kvm)
 		kvm_vgic_vcpu_init(vcpu);
 
+	ret = kvm_setup_default_irq_routing(kvm);
+	if (ret)
+		goto out;
+
 	dist->initialized = true;
 out:
 	return ret;
@@ -454,3 +458,23 @@  out_free_irq:
 			kvm_get_running_vcpus());
 	return ret;
 }
+
+int kvm_setup_default_irq_routing(struct kvm *kvm)
+{
+	struct kvm_irq_routing_entry *entries;
+	struct vgic_dist *dist = &kvm->arch.vgic;
+	u32 nr = dist->nr_spis;
+	int i, ret;
+
+	entries = kcalloc(nr, sizeof(struct kvm_kernel_irq_routing_entry),
+			  GFP_KERNEL);
+	for (i = 0; i < nr; i++) {
+		entries[i].gsi = i;
+		entries[i].type = KVM_IRQ_ROUTING_IRQCHIP;
+		entries[i].u.irqchip.irqchip = 0;
+		entries[i].u.irqchip.pin = i;
+	}
+	ret = kvm_set_irq_routing(kvm, entries, nr, 0);
+	kfree(entries);
+	return ret;
+}