All of lore.kernel.org
 help / color / mirror / Atom feed
From: Auger Eric <eric.auger@redhat.com>
To: Christoffer Dall <cdall@linaro.org>,
	kvmarm@lists.cs.columbia.edu, Marc Zyngier <marc.zyngier@arm.com>
Cc: Andre Przywara <andre.przywara@arm.com>,
	kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v2 5/6] KVM: arm/arm64: Rearrange kvm_vgic_[un]map_phys code in vgic.c
Date: Tue, 5 Sep 2017 12:26:14 +0200	[thread overview]
Message-ID: <56431c9d-3f7e-f8b2-2d31-6baec4e294da@redhat.com> (raw)
In-Reply-To: <20170904102456.9025-6-cdall@linaro.org>

Hi Christoffer,
On 04/09/2017 12:24, Christoffer Dall wrote:
> The small indirection of a static function made the locking very obvious
> but becomes pretty ugly as we start passing function pointer around.
> Let's inline these two functions first to make the following patch more
> readable.
> 
> Signed-off-by: Christoffer Dall <cdall@linaro.org>
> Acked-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
>  virt/kvm/arm/vgic/vgic.c | 38 +++++++++++++-------------------------
>  1 file changed, 13 insertions(+), 25 deletions(-)
> 
> diff --git a/virt/kvm/arm/vgic/vgic.c b/virt/kvm/arm/vgic/vgic.c
> index 7aec730..b704ff5 100644
> --- a/virt/kvm/arm/vgic/vgic.c
> +++ b/virt/kvm/arm/vgic/vgic.c
> @@ -435,12 +435,17 @@ int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, unsigned int intid,
>  	return 0;
>  }
>  
> -/* @irq->irq_lock must be held */
I chose to hold the lock outside of kvm_vgic_map/unmap_irq because in
kvm_vgic_set_forwarding(see https://lkml.org/lkml/2017/6/15/278) I was
also testing hw and target_vcpu fields. As you pointed out maybe I am
not obliged to check them but that was the rationale.

Thanks

Eric
> -static int kvm_vgic_map_irq(struct kvm_vcpu *vcpu, struct vgic_irq *irq,
> -			    unsigned int host_irq)
> +int kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu, unsigned int host_irq,
> +			  u32 vintid)
>  {
> +	struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, vintid);
>  	struct irq_desc *desc;
>  	struct irq_data *data;
> +	int ret = 0;
> +
> +	BUG_ON(!irq);
> +
> +	spin_lock(&irq->irq_lock);
>  
>  	/*
>  	 * Find the physical IRQ number corresponding to @host_irq
> @@ -448,7 +453,8 @@ static int kvm_vgic_map_irq(struct kvm_vcpu *vcpu, struct vgic_irq *irq,
>  	desc = irq_to_desc(host_irq);
>  	if (!desc) {
>  		kvm_err("%s: no interrupt descriptor\n", __func__);
> -		return -EINVAL;
> +		ret = -EINVAL;
> +		goto out;
>  	}
>  	data = irq_desc_get_irq_data(desc);
>  	while (data->parent_data)
> @@ -457,29 +463,10 @@ static int kvm_vgic_map_irq(struct kvm_vcpu *vcpu, struct vgic_irq *irq,
>  	irq->hw = true;
>  	irq->host_irq = host_irq;
>  	irq->hwintid = data->hwirq;
> -	return 0;
> -}
> -
> -/* @irq->irq_lock must be held */
> -static inline void kvm_vgic_unmap_irq(struct vgic_irq *irq)
> -{
> -	irq->hw = false;
> -	irq->hwintid = 0;
> -}
> -
> -int kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu, unsigned int host_irq,
> -			  u32 vintid)
> -{
> -	struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, vintid);
> -	int ret;
>  
> -	BUG_ON(!irq);
> -
> -	spin_lock(&irq->irq_lock);
> -	ret = kvm_vgic_map_irq(vcpu, irq, host_irq);
> +out:
>  	spin_unlock(&irq->irq_lock);
>  	vgic_put_irq(vcpu->kvm, irq);
> -
>  	return ret;
>  }
>  
> @@ -494,7 +481,8 @@ int kvm_vgic_unmap_phys_irq(struct kvm_vcpu *vcpu, unsigned int vintid)
>  	BUG_ON(!irq);
>  
>  	spin_lock(&irq->irq_lock);
> -	kvm_vgic_unmap_irq(irq);
> +	irq->hw = false;
> +	irq->hwintid = 0;
>  	spin_unlock(&irq->irq_lock);
>  	vgic_put_irq(vcpu->kvm, irq);
>  
> 

WARNING: multiple messages have this Message-ID (diff)
From: eric.auger@redhat.com (Auger Eric)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 5/6] KVM: arm/arm64: Rearrange kvm_vgic_[un]map_phys code in vgic.c
Date: Tue, 5 Sep 2017 12:26:14 +0200	[thread overview]
Message-ID: <56431c9d-3f7e-f8b2-2d31-6baec4e294da@redhat.com> (raw)
In-Reply-To: <20170904102456.9025-6-cdall@linaro.org>

Hi Christoffer,
On 04/09/2017 12:24, Christoffer Dall wrote:
> The small indirection of a static function made the locking very obvious
> but becomes pretty ugly as we start passing function pointer around.
> Let's inline these two functions first to make the following patch more
> readable.
> 
> Signed-off-by: Christoffer Dall <cdall@linaro.org>
> Acked-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
>  virt/kvm/arm/vgic/vgic.c | 38 +++++++++++++-------------------------
>  1 file changed, 13 insertions(+), 25 deletions(-)
> 
> diff --git a/virt/kvm/arm/vgic/vgic.c b/virt/kvm/arm/vgic/vgic.c
> index 7aec730..b704ff5 100644
> --- a/virt/kvm/arm/vgic/vgic.c
> +++ b/virt/kvm/arm/vgic/vgic.c
> @@ -435,12 +435,17 @@ int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, unsigned int intid,
>  	return 0;
>  }
>  
> -/* @irq->irq_lock must be held */
I chose to hold the lock outside of kvm_vgic_map/unmap_irq because in
kvm_vgic_set_forwarding(see https://lkml.org/lkml/2017/6/15/278) I was
also testing hw and target_vcpu fields. As you pointed out maybe I am
not obliged to check them but that was the rationale.

Thanks

Eric
> -static int kvm_vgic_map_irq(struct kvm_vcpu *vcpu, struct vgic_irq *irq,
> -			    unsigned int host_irq)
> +int kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu, unsigned int host_irq,
> +			  u32 vintid)
>  {
> +	struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, vintid);
>  	struct irq_desc *desc;
>  	struct irq_data *data;
> +	int ret = 0;
> +
> +	BUG_ON(!irq);
> +
> +	spin_lock(&irq->irq_lock);
>  
>  	/*
>  	 * Find the physical IRQ number corresponding to @host_irq
> @@ -448,7 +453,8 @@ static int kvm_vgic_map_irq(struct kvm_vcpu *vcpu, struct vgic_irq *irq,
>  	desc = irq_to_desc(host_irq);
>  	if (!desc) {
>  		kvm_err("%s: no interrupt descriptor\n", __func__);
> -		return -EINVAL;
> +		ret = -EINVAL;
> +		goto out;
>  	}
>  	data = irq_desc_get_irq_data(desc);
>  	while (data->parent_data)
> @@ -457,29 +463,10 @@ static int kvm_vgic_map_irq(struct kvm_vcpu *vcpu, struct vgic_irq *irq,
>  	irq->hw = true;
>  	irq->host_irq = host_irq;
>  	irq->hwintid = data->hwirq;
> -	return 0;
> -}
> -
> -/* @irq->irq_lock must be held */
> -static inline void kvm_vgic_unmap_irq(struct vgic_irq *irq)
> -{
> -	irq->hw = false;
> -	irq->hwintid = 0;
> -}
> -
> -int kvm_vgic_map_phys_irq(struct kvm_vcpu *vcpu, unsigned int host_irq,
> -			  u32 vintid)
> -{
> -	struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, vintid);
> -	int ret;
>  
> -	BUG_ON(!irq);
> -
> -	spin_lock(&irq->irq_lock);
> -	ret = kvm_vgic_map_irq(vcpu, irq, host_irq);
> +out:
>  	spin_unlock(&irq->irq_lock);
>  	vgic_put_irq(vcpu->kvm, irq);
> -
>  	return ret;
>  }
>  
> @@ -494,7 +481,8 @@ int kvm_vgic_unmap_phys_irq(struct kvm_vcpu *vcpu, unsigned int vintid)
>  	BUG_ON(!irq);
>  
>  	spin_lock(&irq->irq_lock);
> -	kvm_vgic_unmap_irq(irq);
> +	irq->hw = false;
> +	irq->hwintid = 0;
>  	spin_unlock(&irq->irq_lock);
>  	vgic_put_irq(vcpu->kvm, irq);
>  
> 

  reply	other threads:[~2017-09-05 10:26 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-04 10:24 [PATCH v2 0/6] Handle forwarded level-triggered interrupts Christoffer Dall
2017-09-04 10:24 ` Christoffer Dall
2017-09-04 10:24 ` [PATCH v2 1/6] KVM: arm/arm64: Don't cache the timer IRQ level Christoffer Dall
2017-09-04 10:24   ` Christoffer Dall
2017-09-04 10:24 ` [PATCH v2 2/6] KVM: arm/arm64: vgic: restructure kvm_vgic_(un)map_phys_irq Christoffer Dall
2017-09-04 10:24   ` Christoffer Dall
2017-09-04 10:24 ` [PATCH v2 3/6] KVM: arm/arm64: vgic: Support level-triggered mapped interrupts Christoffer Dall
2017-09-04 10:24   ` Christoffer Dall
2017-09-05  9:38   ` Auger Eric
2017-09-05  9:38     ` Auger Eric
2017-09-05 13:57     ` Christoffer Dall
2017-09-05 13:57       ` Christoffer Dall
2017-09-04 10:24 ` [PATCH v2 4/6] KVM: arm/arm64: Support VGIC dist pend/active changes for mapped IRQs Christoffer Dall
2017-09-04 10:24   ` Christoffer Dall
2017-09-04 10:24 ` [PATCH v2 5/6] KVM: arm/arm64: Rearrange kvm_vgic_[un]map_phys code in vgic.c Christoffer Dall
2017-09-04 10:24   ` Christoffer Dall
2017-09-05 10:26   ` Auger Eric [this message]
2017-09-05 10:26     ` Auger Eric
2017-09-05 14:00     ` Christoffer Dall
2017-09-05 14:00       ` Christoffer Dall
2017-09-05 14:49       ` Auger Eric
2017-09-05 14:49         ` Auger Eric
2017-09-04 10:24 ` [PATCH v2 6/6] KVM: arm/arm64: Provide a vgic interrupt line level sample function Christoffer Dall
2017-09-04 10:24   ` Christoffer Dall

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=56431c9d-3f7e-f8b2-2d31-6baec4e294da@redhat.com \
    --to=eric.auger@redhat.com \
    --cc=andre.przywara@arm.com \
    --cc=cdall@linaro.org \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=marc.zyngier@arm.com \
    /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.