LKML Archive on lore.kernel.org
 help / color / 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
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 index

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-09  9:46 linmiaohe
2019-11-11 14:10 ` Paolo Bonzini [this message]

Reply instructions:

You may reply publically 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

LKML Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/lkml/0 lkml/git/0.git
	git clone --mirror https://lore.kernel.org/lkml/1 lkml/git/1.git
	git clone --mirror https://lore.kernel.org/lkml/2 lkml/git/2.git
	git clone --mirror https://lore.kernel.org/lkml/3 lkml/git/3.git
	git clone --mirror https://lore.kernel.org/lkml/4 lkml/git/4.git
	git clone --mirror https://lore.kernel.org/lkml/5 lkml/git/5.git
	git clone --mirror https://lore.kernel.org/lkml/6 lkml/git/6.git
	git clone --mirror https://lore.kernel.org/lkml/7 lkml/git/7.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 lkml lkml/ https://lore.kernel.org/lkml \
		linux-kernel@vger.kernel.org
	public-inbox-index lkml

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-kernel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git