From: Gleb Natapov <gleb@redhat.com>
To: Yang Zhang <yang.z.zhang@intel.com>
Cc: kvm@vger.kernel.org, mtosatti@redhat.com,
xiantao.zhang@intel.com, jun.nakajima@intel.com
Subject: Re: [PATCH v8 4/7] KVM: Call common update function when ioapic entry changed.
Date: Tue, 9 Apr 2013 10:45:02 +0300 [thread overview]
Message-ID: <20130409074502.GR17919@redhat.com> (raw)
In-Reply-To: <1365431002-31202-5-git-send-email-yang.z.zhang@intel.com>
On Mon, Apr 08, 2013 at 10:23:19PM +0800, Yang Zhang wrote:
> From: Yang Zhang <yang.z.zhang@Intel.com>
>
> Both TMR and EOI exit bitmap need to be updated when ioapic changed
> or vcpu's id/ldr/dfr changed. So use common function instead eoi exit
> bitmap specific function.
>
> Signed-off-by: Yang Zhang <yang.z.zhang@Intel.com>
> ---
> arch/ia64/kvm/lapic.h | 6 ------
> arch/x86/kvm/lapic.c | 4 ++--
> arch/x86/kvm/lapic.h | 1 +
> arch/x86/kvm/vmx.c | 3 +++
> arch/x86/kvm/x86.c | 11 +++++++----
> include/linux/kvm_host.h | 4 ++--
> virt/kvm/ioapic.c | 22 +++++++++++++---------
> virt/kvm/ioapic.h | 6 ++----
> virt/kvm/irq_comm.c | 4 ++--
> virt/kvm/kvm_main.c | 4 ++--
> 10 files changed, 34 insertions(+), 31 deletions(-)
>
> diff --git a/arch/ia64/kvm/lapic.h b/arch/ia64/kvm/lapic.h
> index c3e2935..c5f92a9 100644
> --- a/arch/ia64/kvm/lapic.h
> +++ b/arch/ia64/kvm/lapic.h
> @@ -27,10 +27,4 @@ int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq);
> #define kvm_apic_present(x) (true)
> #define kvm_lapic_enabled(x) (true)
>
> -static inline bool kvm_apic_vid_enabled(void)
> -{
> - /* IA64 has no apicv supporting, do nothing here */
> - return false;
> -}
> -
> #endif
> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> index 6796218..6c83969 100644
> --- a/arch/x86/kvm/lapic.c
> +++ b/arch/x86/kvm/lapic.c
> @@ -136,7 +136,7 @@ static inline void apic_set_spiv(struct kvm_lapic *apic, u32 val)
> apic_set_reg(apic, APIC_SPIV, val);
> }
>
> -static inline int apic_enabled(struct kvm_lapic *apic)
> +int apic_enabled(struct kvm_lapic *apic)
Move the function into lapic.h and leave it inline.
> {
> return kvm_apic_sw_enabled(apic) && kvm_apic_hw_enabled(apic);
> }
> @@ -217,7 +217,7 @@ out:
> if (old)
> kfree_rcu(old, rcu);
>
> - kvm_ioapic_make_eoibitmap_request(kvm);
> + kvm_vcpu_request_scan_ioapic(kvm);
> }
>
> static inline void kvm_apic_set_id(struct kvm_lapic *apic, u8 id)
> diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h
> index 16304b1..a2e2c6a 100644
> --- a/arch/x86/kvm/lapic.h
> +++ b/arch/x86/kvm/lapic.h
> @@ -167,5 +167,6 @@ static inline bool kvm_apic_has_events(struct kvm_vcpu *vcpu)
> }
>
> bool kvm_apic_pending_eoi(struct kvm_vcpu *vcpu, int vector);
> +int apic_enabled(struct kvm_lapic *apic);
>
> #endif
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index 05da991..5637a8a 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -6415,6 +6415,9 @@ static void vmx_hwapic_irr_update(struct kvm_vcpu *vcpu, int max_irr)
>
> static void vmx_load_eoi_exitmap(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap)
> {
> + if (!vmx_vm_has_apicv(vcpu->kvm))
> + return;
> +
> vmcs_write64(EOI_EXIT_BITMAP0, eoi_exit_bitmap[0]);
> vmcs_write64(EOI_EXIT_BITMAP1, eoi_exit_bitmap[1]);
> vmcs_write64(EOI_EXIT_BITMAP2, eoi_exit_bitmap[2]);
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 5b146d2..53dc96f 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -5649,13 +5649,16 @@ static void kvm_gen_update_masterclock(struct kvm *kvm)
> #endif
> }
>
> -static void update_eoi_exitmap(struct kvm_vcpu *vcpu)
> +static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu)
> {
> u64 eoi_exit_bitmap[4];
>
> + if (!apic_enabled(vcpu->arch.apic))
> + return;
> +
> memset(eoi_exit_bitmap, 0, 32);
>
> - kvm_ioapic_calculate_eoi_exitmap(vcpu, eoi_exit_bitmap);
> + kvm_ioapic_scan_entry(vcpu, eoi_exit_bitmap);
> kvm_x86_ops->load_eoi_exitmap(vcpu, eoi_exit_bitmap);
> }
>
> @@ -5712,8 +5715,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
> kvm_handle_pmu_event(vcpu);
> if (kvm_check_request(KVM_REQ_PMI, vcpu))
> kvm_deliver_pmi(vcpu);
> - if (kvm_check_request(KVM_REQ_EOIBITMAP, vcpu))
> - update_eoi_exitmap(vcpu);
> + if (kvm_check_request(KVM_REQ_SCAN_IOAPIC, vcpu))
> + vcpu_scan_ioapic(vcpu);
> }
>
> if (kvm_check_request(KVM_REQ_EVENT, vcpu) || req_int_win) {
> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
> index 7bcdb6b..6f49d9d 100644
> --- a/include/linux/kvm_host.h
> +++ b/include/linux/kvm_host.h
> @@ -126,7 +126,7 @@ static inline bool is_error_page(struct page *page)
> #define KVM_REQ_MASTERCLOCK_UPDATE 19
> #define KVM_REQ_MCLOCK_INPROGRESS 20
> #define KVM_REQ_EPR_EXIT 21
> -#define KVM_REQ_EOIBITMAP 22
> +#define KVM_REQ_SCAN_IOAPIC 22
>
> #define KVM_USERSPACE_IRQ_SOURCE_ID 0
> #define KVM_IRQFD_RESAMPLE_IRQ_SOURCE_ID 1
> @@ -572,7 +572,7 @@ void kvm_put_guest_fpu(struct kvm_vcpu *vcpu);
> void kvm_flush_remote_tlbs(struct kvm *kvm);
> void kvm_reload_remote_mmus(struct kvm *kvm);
> void kvm_make_mclock_inprogress_request(struct kvm *kvm);
> -void kvm_make_update_eoibitmap_request(struct kvm *kvm);
> +void kvm_make_scan_ioapic_request(struct kvm *kvm);
>
> long kvm_arch_dev_ioctl(struct file *filp,
> unsigned int ioctl, unsigned long arg);
> diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c
> index 47896ee..40ad96d 100644
> --- a/virt/kvm/ioapic.c
> +++ b/virt/kvm/ioapic.c
> @@ -196,15 +196,13 @@ static void update_handled_vectors(struct kvm_ioapic *ioapic)
> smp_wmb();
> }
>
> -void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu *vcpu,
> - u64 *eoi_exit_bitmap)
> +void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap)
> {
> struct kvm_ioapic *ioapic = vcpu->kvm->arch.vioapic;
> union kvm_ioapic_redirect_entry *e;
> int index;
>
> spin_lock(&ioapic->lock);
> - /* traverse ioapic entry to set eoi exit bitmap*/
> for (index = 0; index < IOAPIC_NUM_PINS; index++) {
> e = &ioapic->redirtbl[index];
> if (!e->fields.mask &&
> @@ -218,16 +216,22 @@ void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu *vcpu,
> }
> spin_unlock(&ioapic->lock);
> }
> -EXPORT_SYMBOL_GPL(kvm_ioapic_calculate_eoi_exitmap);
>
> -void kvm_ioapic_make_eoibitmap_request(struct kvm *kvm)
> +#ifdef CONFIG_X86
> +void kvm_vcpu_request_scan_ioapic(struct kvm *kvm)
> {
> struct kvm_ioapic *ioapic = kvm->arch.vioapic;
>
> - if (!kvm_apic_vid_enabled(kvm) || !ioapic)
> + if (!ioapic)
> return;
> - kvm_make_update_eoibitmap_request(kvm);
> + kvm_make_scan_ioapic_request(kvm);
> }
> +#else
> +void kvm_vcpu_request_scan_ioapic(struct kvm *kvm)
> +{
> + return;
> +}
> +#endif
>
> static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val)
> {
> @@ -270,7 +274,7 @@ static void ioapic_write_indirect(struct kvm_ioapic *ioapic, u32 val)
> if (e->fields.trig_mode == IOAPIC_LEVEL_TRIG
> && ioapic->irr & (1 << index))
> ioapic_service(ioapic, index, false);
> - kvm_ioapic_make_eoibitmap_request(ioapic->kvm);
> + kvm_vcpu_request_scan_ioapic(ioapic->kvm);
> break;
> }
> }
> @@ -587,7 +591,7 @@ int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state)
> spin_lock(&ioapic->lock);
> memcpy(ioapic, state, sizeof(struct kvm_ioapic_state));
> update_handled_vectors(ioapic);
> - kvm_ioapic_make_eoibitmap_request(kvm);
> + kvm_vcpu_request_scan_ioapic(kvm);
> kvm_rtc_eoi_tracking_restore_all(ioapic);
> spin_unlock(&ioapic->lock);
> return 0;
> diff --git a/virt/kvm/ioapic.h b/virt/kvm/ioapic.h
> index 554157b..674a388 100644
> --- a/virt/kvm/ioapic.h
> +++ b/virt/kvm/ioapic.h
> @@ -96,9 +96,7 @@ int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
> struct kvm_lapic_irq *irq, unsigned long *dest_map);
> int kvm_get_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
> int kvm_set_ioapic(struct kvm *kvm, struct kvm_ioapic_state *state);
> -void kvm_ioapic_make_eoibitmap_request(struct kvm *kvm);
> -void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu *vcpu,
> - u64 *eoi_exit_bitmap);
> -
> +void kvm_vcpu_request_scan_ioapic(struct kvm *kvm);
> +void kvm_ioapic_scan_entry(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap);
>
> #endif
> diff --git a/virt/kvm/irq_comm.c b/virt/kvm/irq_comm.c
> index 8efb580..25ab480 100644
> --- a/virt/kvm/irq_comm.c
> +++ b/virt/kvm/irq_comm.c
> @@ -285,7 +285,7 @@ void kvm_register_irq_ack_notifier(struct kvm *kvm,
> mutex_lock(&kvm->irq_lock);
> hlist_add_head_rcu(&kian->link, &kvm->irq_ack_notifier_list);
> mutex_unlock(&kvm->irq_lock);
> - kvm_ioapic_make_eoibitmap_request(kvm);
> + kvm_vcpu_request_scan_ioapic(kvm);
> }
>
> void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
> @@ -295,7 +295,7 @@ void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
> hlist_del_init_rcu(&kian->link);
> mutex_unlock(&kvm->irq_lock);
> synchronize_rcu();
> - kvm_ioapic_make_eoibitmap_request(kvm);
> + kvm_vcpu_request_scan_ioapic(kvm);
> }
>
> int kvm_request_irq_source_id(struct kvm *kvm)
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 6c4842a..8b5c6a8 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -217,9 +217,9 @@ void kvm_make_mclock_inprogress_request(struct kvm *kvm)
> make_all_cpus_request(kvm, KVM_REQ_MCLOCK_INPROGRESS);
> }
>
> -void kvm_make_update_eoibitmap_request(struct kvm *kvm)
> +void kvm_make_scan_ioapic_request(struct kvm *kvm)
> {
> - make_all_cpus_request(kvm, KVM_REQ_EOIBITMAP);
> + make_all_cpus_request(kvm, KVM_REQ_SCAN_IOAPIC);
> }
>
> int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id)
> --
> 1.7.1
--
Gleb.
next prev parent reply other threads:[~2013-04-09 7:45 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-08 14:23 [PATCH v8 0/7] KVM: VMX: Add Posted Interrupt supporting Yang Zhang
2013-04-08 14:23 ` [PATCH v8 1/7] KVM: VMX: Enable acknowledge interupt on vmexit Yang Zhang
2013-04-08 14:23 ` [PATCH v8 2/7] KVM: VMX: Register a new IPI for posted interrupt Yang Zhang
2013-04-09 7:26 ` Gleb Natapov
2013-04-10 9:31 ` Ingo Molnar
2013-04-08 14:23 ` [PATCH v8 3/7] KVM: VMX: Check the posted interrupt capability Yang Zhang
2013-04-08 14:23 ` [PATCH v8 4/7] KVM: Call common update function when ioapic entry changed Yang Zhang
2013-04-09 7:45 ` Gleb Natapov [this message]
2013-04-08 14:23 ` [PATCH v8 5/7] KVM: Set TMR when programming ioapic entry Yang Zhang
2013-04-08 14:23 ` [PATCH v8 6/7] KVM: VMX: Add the algorithm of deliver posted interrupt Yang Zhang
2013-04-09 16:31 ` Paolo Bonzini
2013-04-10 2:16 ` Zhang, Yang Z
2013-04-08 14:23 ` [PATCH v8 7/7] KVM: VMX: Use posted interrupt to deliver virtual interrupt Yang Zhang
2013-04-09 8:05 ` Gleb Natapov
2013-04-09 8:55 ` Zhang, Yang Z
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=20130409074502.GR17919@redhat.com \
--to=gleb@redhat.com \
--cc=jun.nakajima@intel.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=xiantao.zhang@intel.com \
--cc=yang.z.zhang@intel.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.