public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: David Hildenbrand <david@redhat.com>
Cc: kvm@vger.kernel.org, Paolo Bonzini <pbonzini@redhat.com>,
	rkrcmar@redhat.com
Subject: Re: [PATCH v1 02/22] KVM: x86: check against irqchip_mode in kvm_set_routing_entry()
Date: Wed, 15 Mar 2017 14:33:19 +0800	[thread overview]
Message-ID: <20170315063319.GJ12964@pxdev.xzpeter.org> (raw)
In-Reply-To: <20170314133450.13259-3-david@redhat.com>

On Tue, Mar 14, 2017 at 02:34:30PM +0100, David Hildenbrand wrote:
> Let's replace the checks for pic_in_kernel() and ioapic_in_kernel() by
> checks against irqchip_mode. Add another state, indicating that the
> caller is currently initializing the irqchip.
> 
> This is necessary to switch pic_in_kernel() and ioapic_in_kernel() to
> irqchip_mode, too.
> 
> Also make sure that creation of any route is only possible if we have
> a lapic in kernel (irqchip_in_kernel()) or if we are currently
> inititalizing the irqchip.

The subject of the patch is:

  KVM: x86: check against irqchip_mode in kvm_set_routing_entry()

IMHO the most significant change this patch brought is the new irqchip
mode, but we just didn't mention it in the subject...

If we really want this new mode, maybe split current patch into two?
One for the new mode, one for the change in kvm_set_routing_entry()?

Thanks,

> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  arch/x86/include/asm/kvm_host.h |  1 +
>  arch/x86/kvm/irq.h              |  2 +-
>  arch/x86/kvm/irq_comm.c         | 12 ++++++------
>  arch/x86/kvm/x86.c              |  7 ++++++-
>  4 files changed, 14 insertions(+), 8 deletions(-)
> 
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 74ef58c..164e544 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -727,6 +727,7 @@ struct kvm_hv {
>  
>  enum kvm_irqchip_mode {
>  	KVM_IRQCHIP_NONE,
> +	KVM_IRQCHIP_INIT_IN_PROGRESS, /* temporarily set during creation */
>  	KVM_IRQCHIP_KERNEL,       /* created with KVM_CREATE_IRQCHIP */
>  	KVM_IRQCHIP_SPLIT,        /* created with KVM_CAP_SPLIT_IRQCHIP */
>  };
> diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h
> index 40d5b2c..7fa2480 100644
> --- a/arch/x86/kvm/irq.h
> +++ b/arch/x86/kvm/irq.h
> @@ -103,7 +103,7 @@ static inline int irqchip_kernel(struct kvm *kvm)
>  
>  static inline int irqchip_in_kernel(struct kvm *kvm)
>  {
> -	bool ret = kvm->arch.irqchip_mode != KVM_IRQCHIP_NONE;
> +	bool ret = kvm->arch.irqchip_mode > KVM_IRQCHIP_INIT_IN_PROGRESS;
>  
>  	/* Matches with wmb after initializing kvm->irq_routing. */
>  	smp_rmb();
> diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c
> index 6825cd3..0a026f8 100644
> --- a/arch/x86/kvm/irq_comm.c
> +++ b/arch/x86/kvm/irq_comm.c
> @@ -282,24 +282,24 @@ int kvm_set_routing_entry(struct kvm *kvm,
>  	int delta;
>  	unsigned max_pin;
>  
> +	/* also allow creation of routes during KVM_IRQCHIP_INIT_IN_PROGRESS */
> +	if (kvm->arch.irqchip_mode == KVM_IRQCHIP_NONE)
> +		goto out;
> +
>  	switch (ue->type) {
>  	case KVM_IRQ_ROUTING_IRQCHIP:
> +		if (irqchip_split(kvm))
> +			goto out;
>  		delta = 0;
>  		switch (ue->u.irqchip.irqchip) {
>  		case KVM_IRQCHIP_PIC_SLAVE:
>  			delta = 8;
>  			/* fall through */
>  		case KVM_IRQCHIP_PIC_MASTER:
> -			if (!pic_in_kernel(kvm))
> -				goto out;
> -
>  			e->set = kvm_set_pic_irq;
>  			max_pin = PIC_NUM_PINS;
>  			break;
>  		case KVM_IRQCHIP_IOAPIC:
> -			if (!ioapic_in_kernel(kvm))
> -				goto out;
> -
>  			max_pin = KVM_IOAPIC_NUM_PINS;
>  			e->set = kvm_set_ioapic_irq;
>  			break;
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 1faf620..fa8cceb 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -3934,9 +3934,12 @@ static int kvm_vm_ioctl_enable_cap(struct kvm *kvm,
>  			goto split_irqchip_unlock;
>  		if (kvm->created_vcpus)
>  			goto split_irqchip_unlock;
> +		kvm->arch.irqchip_mode = KVM_IRQCHIP_INIT_IN_PROGRESS;
>  		r = kvm_setup_empty_irq_routing(kvm);
> -		if (r)
> +		if (r) {
> +			kvm->arch.irqchip_mode = KVM_IRQCHIP_NONE;
>  			goto split_irqchip_unlock;
> +		}
>  		/* Pairs with irqchip_in_kernel. */
>  		smp_wmb();
>  		kvm->arch.irqchip_mode = KVM_IRQCHIP_SPLIT;
> @@ -4024,8 +4027,10 @@ long kvm_arch_vm_ioctl(struct file *filp,
>  			goto create_irqchip_unlock;
>  		}
>  
> +		kvm->arch.irqchip_mode = KVM_IRQCHIP_INIT_IN_PROGRESS;
>  		r = kvm_setup_default_irq_routing(kvm);
>  		if (r) {
> +			kvm->arch.irqchip_mode = KVM_IRQCHIP_NONE;
>  			mutex_lock(&kvm->slots_lock);
>  			mutex_lock(&kvm->irq_lock);
>  			kvm_ioapic_destroy(kvm);
> -- 
> 2.9.3
> 

-- peterx

  reply	other threads:[~2017-03-15  6:33 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-14 13:34 [PATCH v1 00/22] pic/ioapic/irqchip cleanups + minor fixes David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 01/22] KVM: x86: race between KVM_SET_GSI_ROUTING and KVM_CREATE_IRQCHIP David Hildenbrand
2017-03-15  6:24   ` Peter Xu
2017-03-15  9:19     ` David Hildenbrand
2017-03-15  9:28       ` Peter Xu
2017-03-14 13:34 ` [PATCH v1 02/22] KVM: x86: check against irqchip_mode in kvm_set_routing_entry() David Hildenbrand
2017-03-15  6:33   ` Peter Xu [this message]
2017-03-15  9:35     ` David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 03/22] KVM: x86: check against irqchip_mode in pic_in_kernel() David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 04/22] KVM: x86: check against irqchip_mode in ioapic_in_kernel() David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 05/22] KVM: x86: get rid of pic_irqchip() David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 06/22] KVM: x86: get rid of ioapic_irqchip() David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 07/22] KVM: x86: use ioapic_in_kernel() to check for ioapic existence David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 08/22] KVM: x86: remove duplicate checks for ioapic David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 09/22] KVM: x86: convert kvm_(set|get)_ioapic() into void David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 10/22] KVM: x86: don't take kvm->irq_lock when creating IRQCHIP David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 11/22] KVM: x86: push usage of slots_lock down David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 12/22] KVM: x86: KVM_IRQCHIP_PIC_MASTER only has 8 pins David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 13/22] KVM: x86: remove all-vcpu request from kvm_ioapic_init() David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 14/22] KVM: x86: directly call kvm_make_scan_ioapic_request() in ioapic.c David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 15/22] KVM: x86: rename kvm_vcpu_request_scan_ioapic() David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 16/22] KVM: x86: drop goto label in kvm_set_routing_entry() David Hildenbrand
2017-03-15  8:23   ` Peter Xu
2017-03-15  9:11     ` David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 17/22] KVM: x86: simplify pic_unlock() David Hildenbrand
2017-03-15  8:27   ` Peter Xu
2017-03-15  9:07     ` David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 18/22] KVM: x86: make kvm_pic_reset() static David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 19/22] KVM: x86: drop picdev_in_range() David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 20/22] KVM: x86: set data directly in picdev_read() David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 21/22] KVM: x86: simplify pic_ioport_read() David Hildenbrand
2017-03-14 13:34 ` [PATCH v1 22/22] KVM: x86: use irqchip_kernel() to check for pic+ioapic David Hildenbrand

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=20170315063319.GJ12964@pxdev.xzpeter.org \
    --to=peterx@redhat.com \
    --cc=david@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=rkrcmar@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox