All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: linmiaohe <linmiaohe@huawei.com>,
	rkrcmar@redhat.com, sean.j.christopherson@intel.com,
	vkuznets@redhat.com, wanpengli@tencent.com, jmattson@google.com,
	joro@8bytes.org, tglx@linutronix.de, mingo@redhat.com,
	bp@alien8.de, hpa@zytor.com
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, x86@kernel.org
Subject: Re: [PATCH] KVM: APIC: add helper func to remove duplicate code in kvm_pv_send_ipi
Date: Mon, 11 Nov 2019 15:10:19 +0100	[thread overview]
Message-ID: <afcc4015-13f1-61d3-7ab8-e24f2b9c0ea8@redhat.com> (raw)
In-Reply-To: <1573292809-18181-1-git-send-email-linmiaohe@huawei.com>

On 09/11/19 10:46, linmiaohe wrote:
> From: Miaohe Lin <linmiaohe@huawei.com>
> 
> There are some duplicate code in kvm_pv_send_ipi when deal with ipi
> bitmap. Add helper func to remove it, and eliminate odd out label,
> get rid of unnecessary kvm_lapic_irq field init and so on.
> 
> Signed-off-by: Miaohe Lin <linmiaohe@huawei.com>
> ---
>  arch/x86/kvm/lapic.c | 65 ++++++++++++++++++++------------------------
>  1 file changed, 29 insertions(+), 36 deletions(-)
> 
> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> index b29d00b661ff..2f8f10103f5f 100644
> --- a/arch/x86/kvm/lapic.c
> +++ b/arch/x86/kvm/lapic.c
> @@ -557,60 +557,53 @@ int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq,
>  			irq->level, irq->trig_mode, dest_map);
>  }
>  
> +static int __pv_send_ipi(unsigned long *ipi_bitmap, struct kvm_apic_map *map,
> +			 struct kvm_lapic_irq *irq, u32 min)
> +{
> +	int i, count = 0;
> +	struct kvm_vcpu *vcpu;
> +
> +	if (min > map->max_apic_id)
> +		return 0;
> +
> +	for_each_set_bit(i, ipi_bitmap,
> +		min((u32)BITS_PER_LONG, (map->max_apic_id - min + 1))) {
> +		if (map->phys_map[min + i]) {
> +			vcpu = map->phys_map[min + i]->vcpu;
> +			count += kvm_apic_set_irq(vcpu, irq, NULL);
> +		}
> +	}
> +
> +	return count;
> +}
> +
>  int kvm_pv_send_ipi(struct kvm *kvm, unsigned long ipi_bitmap_low,
>  		    unsigned long ipi_bitmap_high, u32 min,
>  		    unsigned long icr, int op_64_bit)
>  {
> -	int i;
>  	struct kvm_apic_map *map;
> -	struct kvm_vcpu *vcpu;
>  	struct kvm_lapic_irq irq = {0};
>  	int cluster_size = op_64_bit ? 64 : 32;
> -	int count = 0;
> +	int count;
> +
> +	if (icr & (APIC_DEST_MASK | APIC_SHORT_MASK))
> +		return -KVM_EINVAL;
>  
>  	irq.vector = icr & APIC_VECTOR_MASK;
>  	irq.delivery_mode = icr & APIC_MODE_MASK;
>  	irq.level = (icr & APIC_INT_ASSERT) != 0;
>  	irq.trig_mode = icr & APIC_INT_LEVELTRIG;
>  
> -	if (icr & APIC_DEST_MASK)
> -		return -KVM_EINVAL;
> -	if (icr & APIC_SHORT_MASK)
> -		return -KVM_EINVAL;
> -
>  	rcu_read_lock();
>  	map = rcu_dereference(kvm->arch.apic_map);
>  
> -	if (unlikely(!map)) {
> -		count = -EOPNOTSUPP;
> -		goto out;
> +	count = -EOPNOTSUPP;
> +	if (likely(map)) {
> +		count = __pv_send_ipi(&ipi_bitmap_low, map, &irq, min);
> +		min += cluster_size;
> +		count += __pv_send_ipi(&ipi_bitmap_high, map, &irq, min);
>  	}
>  
> -	if (min > map->max_apic_id)
> -		goto out;
> -	/* Bits above cluster_size are masked in the caller.  */
> -	for_each_set_bit(i, &ipi_bitmap_low,
> -		min((u32)BITS_PER_LONG, (map->max_apic_id - min + 1))) {
> -		if (map->phys_map[min + i]) {
> -			vcpu = map->phys_map[min + i]->vcpu;
> -			count += kvm_apic_set_irq(vcpu, &irq, NULL);
> -		}
> -	}
> -
> -	min += cluster_size;
> -
> -	if (min > map->max_apic_id)
> -		goto out;
> -
> -	for_each_set_bit(i, &ipi_bitmap_high,
> -		min((u32)BITS_PER_LONG, (map->max_apic_id - min + 1))) {
> -		if (map->phys_map[min + i]) {
> -			vcpu = map->phys_map[min + i]->vcpu;
> -			count += kvm_apic_set_irq(vcpu, &irq, NULL);
> -		}
> -	}
> -
> -out:
>  	rcu_read_unlock();
>  	return count;
>  }
> 

Queued, thanks.

Paolo


      reply	other threads:[~2019-11-11 14:10 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-09  9:46 [PATCH] KVM: APIC: add helper func to remove duplicate code in kvm_pv_send_ipi linmiaohe
2019-11-11 14:10 ` Paolo Bonzini [this message]

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=afcc4015-13f1-61d3-7ab8-e24f2b9c0ea8@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=bp@alien8.de \
    --cc=hpa@zytor.com \
    --cc=jmattson@google.com \
    --cc=joro@8bytes.org \
    --cc=kvm@vger.kernel.org \
    --cc=linmiaohe@huawei.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@redhat.com \
    --cc=rkrcmar@redhat.com \
    --cc=sean.j.christopherson@intel.com \
    --cc=tglx@linutronix.de \
    --cc=vkuznets@redhat.com \
    --cc=wanpengli@tencent.com \
    --cc=x86@kernel.org \
    /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.