Re: [PATCH v2] KVM: Call kvm_apic_match_dest() to check destination vcpu

2013-04-04 Thread Gleb Natapov
On Wed, Apr 03, 2013 at 12:34:37PM +0300, Gleb Natapov wrote:
 On Wed, Apr 03, 2013 at 08:47:58AM +0800, Yang Zhang wrote:
  From: Yang Zhang yang.z.zh...@intel.com
  
  For a given vcpu, kvm_apic_match_dest() will tell you whether
  the vcpu in the destination list quickly. Drop kvm_calculate_eoi_exitmap()
  and use kvm_apic_match_dest() instead.
  
  Signed-off-by: Yang Zhang yang.z.zh...@intel.com
 Applied, thanks.
 
The patch does not compile, dropped.

  ---
   arch/x86/kvm/lapic.c |   47 ---
   arch/x86/kvm/lapic.h |4 
   virt/kvm/ioapic.c|9 +++--
   3 files changed, 3 insertions(+), 57 deletions(-)
  
  diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
  index a8e9369..e227474 100644
  --- a/arch/x86/kvm/lapic.c
  +++ b/arch/x86/kvm/lapic.c
  @@ -145,53 +145,6 @@ static inline int kvm_apic_id(struct kvm_lapic *apic)
  return (kvm_apic_get_reg(apic, APIC_ID)  24)  0xff;
   }
   
  -void kvm_calculate_eoi_exitmap(struct kvm_vcpu *vcpu,
  -   struct kvm_lapic_irq *irq,
  -   u64 *eoi_exit_bitmap)
  -{
  -   struct kvm_lapic **dst;
  -   struct kvm_apic_map *map;
  -   unsigned long bitmap = 1;
  -   int i;
  -
  -   rcu_read_lock();
  -   map = rcu_dereference(vcpu-kvm-arch.apic_map);
  -
  -   if (unlikely(!map)) {
  -   __set_bit(irq-vector, (unsigned long *)eoi_exit_bitmap);
  -   goto out;
  -   }
  -
  -   if (irq-dest_mode == 0) { /* physical mode */
  -   if (irq-delivery_mode == APIC_DM_LOWEST ||
  -   irq-dest_id == 0xff) {
  -   __set_bit(irq-vector,
  - (unsigned long *)eoi_exit_bitmap);
  -   goto out;
  -   }
  -   dst = map-phys_map[irq-dest_id  0xff];
  -   } else {
  -   u32 mda = irq-dest_id  (32 - map-ldr_bits);
  -
  -   dst = map-logical_map[apic_cluster_id(map, mda)];
  -
  -   bitmap = apic_logical_id(map, mda);
  -   }
  -
  -   for_each_set_bit(i, bitmap, 16) {
  -   if (!dst[i])
  -   continue;
  -   if (dst[i]-vcpu == vcpu) {
  -   __set_bit(irq-vector,
  - (unsigned long *)eoi_exit_bitmap);
  -   break;
  -   }
  -   }
  -
  -out:
  -   rcu_read_unlock();
  -}
  -
   static void recalculate_apic_map(struct kvm *kvm)
   {
  struct kvm_apic_map *new, *old = NULL;
  diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h
  index 2c721b9..baa20cf 100644
  --- a/arch/x86/kvm/lapic.h
  +++ b/arch/x86/kvm/lapic.h
  @@ -160,10 +160,6 @@ static inline u16 apic_logical_id(struct kvm_apic_map 
  *map, u32 ldr)
  return ldr  map-lid_mask;
   }
   
  -void kvm_calculate_eoi_exitmap(struct kvm_vcpu *vcpu,
  -   struct kvm_lapic_irq *irq,
  -   u64 *eoi_bitmap);
  -
   static inline bool kvm_apic_has_events(struct kvm_vcpu *vcpu)
   {
  return vcpu-arch.apic-pending_events;
  diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c
  index 5ba005c..bb3906d 100644
  --- a/virt/kvm/ioapic.c
  +++ b/virt/kvm/ioapic.c
  @@ -124,7 +124,6 @@ void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu 
  *vcpu,
   {
  struct kvm_ioapic *ioapic = vcpu-kvm-arch.vioapic;
  union kvm_ioapic_redirect_entry *e;
  -   struct kvm_lapic_irq irqe;
  int index;
   
  spin_lock(ioapic-lock);
  @@ -135,11 +134,9 @@ void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu 
  *vcpu,
  (e-fields.trig_mode == IOAPIC_LEVEL_TRIG ||
   kvm_irq_has_notifier(ioapic-kvm, KVM_IRQCHIP_IOAPIC,
   index))) {
  -   irqe.dest_id = e-fields.dest_id;
  -   irqe.vector = e-fields.vector;
  -   irqe.dest_mode = e-fields.dest_mode;
  -   irqe.delivery_mode = e-fields.delivery_mode  8;
  -   kvm_calculate_eoi_exitmap(vcpu, irqe, eoi_exit_bitmap);
  +   if (kvm_apic_match_dest(vcpu, NULL, 0,
  +   e-fields.dest_id, e-fields.dest_mode))
  +   __set_bit(e-fileds.vector, (unsigned long 
  *)eoi_exit_bitmap);
  }
  }
  spin_unlock(ioapic-lock);
  -- 
  1.7.1
 
 --
   Gleb.
 --
 To unsubscribe from this list: send the line unsubscribe kvm in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
Gleb.
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2] KVM: Call kvm_apic_match_dest() to check destination vcpu

2013-04-03 Thread Gleb Natapov
On Wed, Apr 03, 2013 at 08:47:58AM +0800, Yang Zhang wrote:
 From: Yang Zhang yang.z.zh...@intel.com
 
 For a given vcpu, kvm_apic_match_dest() will tell you whether
 the vcpu in the destination list quickly. Drop kvm_calculate_eoi_exitmap()
 and use kvm_apic_match_dest() instead.
 
 Signed-off-by: Yang Zhang yang.z.zh...@intel.com
Applied, thanks.

 ---
  arch/x86/kvm/lapic.c |   47 ---
  arch/x86/kvm/lapic.h |4 
  virt/kvm/ioapic.c|9 +++--
  3 files changed, 3 insertions(+), 57 deletions(-)
 
 diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
 index a8e9369..e227474 100644
 --- a/arch/x86/kvm/lapic.c
 +++ b/arch/x86/kvm/lapic.c
 @@ -145,53 +145,6 @@ static inline int kvm_apic_id(struct kvm_lapic *apic)
   return (kvm_apic_get_reg(apic, APIC_ID)  24)  0xff;
  }
  
 -void kvm_calculate_eoi_exitmap(struct kvm_vcpu *vcpu,
 - struct kvm_lapic_irq *irq,
 - u64 *eoi_exit_bitmap)
 -{
 - struct kvm_lapic **dst;
 - struct kvm_apic_map *map;
 - unsigned long bitmap = 1;
 - int i;
 -
 - rcu_read_lock();
 - map = rcu_dereference(vcpu-kvm-arch.apic_map);
 -
 - if (unlikely(!map)) {
 - __set_bit(irq-vector, (unsigned long *)eoi_exit_bitmap);
 - goto out;
 - }
 -
 - if (irq-dest_mode == 0) { /* physical mode */
 - if (irq-delivery_mode == APIC_DM_LOWEST ||
 - irq-dest_id == 0xff) {
 - __set_bit(irq-vector,
 -   (unsigned long *)eoi_exit_bitmap);
 - goto out;
 - }
 - dst = map-phys_map[irq-dest_id  0xff];
 - } else {
 - u32 mda = irq-dest_id  (32 - map-ldr_bits);
 -
 - dst = map-logical_map[apic_cluster_id(map, mda)];
 -
 - bitmap = apic_logical_id(map, mda);
 - }
 -
 - for_each_set_bit(i, bitmap, 16) {
 - if (!dst[i])
 - continue;
 - if (dst[i]-vcpu == vcpu) {
 - __set_bit(irq-vector,
 -   (unsigned long *)eoi_exit_bitmap);
 - break;
 - }
 - }
 -
 -out:
 - rcu_read_unlock();
 -}
 -
  static void recalculate_apic_map(struct kvm *kvm)
  {
   struct kvm_apic_map *new, *old = NULL;
 diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h
 index 2c721b9..baa20cf 100644
 --- a/arch/x86/kvm/lapic.h
 +++ b/arch/x86/kvm/lapic.h
 @@ -160,10 +160,6 @@ static inline u16 apic_logical_id(struct kvm_apic_map 
 *map, u32 ldr)
   return ldr  map-lid_mask;
  }
  
 -void kvm_calculate_eoi_exitmap(struct kvm_vcpu *vcpu,
 - struct kvm_lapic_irq *irq,
 - u64 *eoi_bitmap);
 -
  static inline bool kvm_apic_has_events(struct kvm_vcpu *vcpu)
  {
   return vcpu-arch.apic-pending_events;
 diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c
 index 5ba005c..bb3906d 100644
 --- a/virt/kvm/ioapic.c
 +++ b/virt/kvm/ioapic.c
 @@ -124,7 +124,6 @@ void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu 
 *vcpu,
  {
   struct kvm_ioapic *ioapic = vcpu-kvm-arch.vioapic;
   union kvm_ioapic_redirect_entry *e;
 - struct kvm_lapic_irq irqe;
   int index;
  
   spin_lock(ioapic-lock);
 @@ -135,11 +134,9 @@ void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu 
 *vcpu,
   (e-fields.trig_mode == IOAPIC_LEVEL_TRIG ||
kvm_irq_has_notifier(ioapic-kvm, KVM_IRQCHIP_IOAPIC,
index))) {
 - irqe.dest_id = e-fields.dest_id;
 - irqe.vector = e-fields.vector;
 - irqe.dest_mode = e-fields.dest_mode;
 - irqe.delivery_mode = e-fields.delivery_mode  8;
 - kvm_calculate_eoi_exitmap(vcpu, irqe, eoi_exit_bitmap);
 + if (kvm_apic_match_dest(vcpu, NULL, 0,
 + e-fields.dest_id, e-fields.dest_mode))
 + __set_bit(e-fileds.vector, (unsigned long 
 *)eoi_exit_bitmap);
   }
   }
   spin_unlock(ioapic-lock);
 -- 
 1.7.1

--
Gleb.
--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2] KVM: Call kvm_apic_match_dest() to check destination vcpu

2013-04-02 Thread Yang Zhang
From: Yang Zhang yang.z.zh...@intel.com

For a given vcpu, kvm_apic_match_dest() will tell you whether
the vcpu in the destination list quickly. Drop kvm_calculate_eoi_exitmap()
and use kvm_apic_match_dest() instead.

Signed-off-by: Yang Zhang yang.z.zh...@intel.com
---
 arch/x86/kvm/lapic.c |   47 ---
 arch/x86/kvm/lapic.h |4 
 virt/kvm/ioapic.c|9 +++--
 3 files changed, 3 insertions(+), 57 deletions(-)

diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index a8e9369..e227474 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -145,53 +145,6 @@ static inline int kvm_apic_id(struct kvm_lapic *apic)
return (kvm_apic_get_reg(apic, APIC_ID)  24)  0xff;
 }
 
-void kvm_calculate_eoi_exitmap(struct kvm_vcpu *vcpu,
-   struct kvm_lapic_irq *irq,
-   u64 *eoi_exit_bitmap)
-{
-   struct kvm_lapic **dst;
-   struct kvm_apic_map *map;
-   unsigned long bitmap = 1;
-   int i;
-
-   rcu_read_lock();
-   map = rcu_dereference(vcpu-kvm-arch.apic_map);
-
-   if (unlikely(!map)) {
-   __set_bit(irq-vector, (unsigned long *)eoi_exit_bitmap);
-   goto out;
-   }
-
-   if (irq-dest_mode == 0) { /* physical mode */
-   if (irq-delivery_mode == APIC_DM_LOWEST ||
-   irq-dest_id == 0xff) {
-   __set_bit(irq-vector,
- (unsigned long *)eoi_exit_bitmap);
-   goto out;
-   }
-   dst = map-phys_map[irq-dest_id  0xff];
-   } else {
-   u32 mda = irq-dest_id  (32 - map-ldr_bits);
-
-   dst = map-logical_map[apic_cluster_id(map, mda)];
-
-   bitmap = apic_logical_id(map, mda);
-   }
-
-   for_each_set_bit(i, bitmap, 16) {
-   if (!dst[i])
-   continue;
-   if (dst[i]-vcpu == vcpu) {
-   __set_bit(irq-vector,
- (unsigned long *)eoi_exit_bitmap);
-   break;
-   }
-   }
-
-out:
-   rcu_read_unlock();
-}
-
 static void recalculate_apic_map(struct kvm *kvm)
 {
struct kvm_apic_map *new, *old = NULL;
diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h
index 2c721b9..baa20cf 100644
--- a/arch/x86/kvm/lapic.h
+++ b/arch/x86/kvm/lapic.h
@@ -160,10 +160,6 @@ static inline u16 apic_logical_id(struct kvm_apic_map 
*map, u32 ldr)
return ldr  map-lid_mask;
 }
 
-void kvm_calculate_eoi_exitmap(struct kvm_vcpu *vcpu,
-   struct kvm_lapic_irq *irq,
-   u64 *eoi_bitmap);
-
 static inline bool kvm_apic_has_events(struct kvm_vcpu *vcpu)
 {
return vcpu-arch.apic-pending_events;
diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c
index 5ba005c..bb3906d 100644
--- a/virt/kvm/ioapic.c
+++ b/virt/kvm/ioapic.c
@@ -124,7 +124,6 @@ void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu *vcpu,
 {
struct kvm_ioapic *ioapic = vcpu-kvm-arch.vioapic;
union kvm_ioapic_redirect_entry *e;
-   struct kvm_lapic_irq irqe;
int index;
 
spin_lock(ioapic-lock);
@@ -135,11 +134,9 @@ void kvm_ioapic_calculate_eoi_exitmap(struct kvm_vcpu 
*vcpu,
(e-fields.trig_mode == IOAPIC_LEVEL_TRIG ||
 kvm_irq_has_notifier(ioapic-kvm, KVM_IRQCHIP_IOAPIC,
 index))) {
-   irqe.dest_id = e-fields.dest_id;
-   irqe.vector = e-fields.vector;
-   irqe.dest_mode = e-fields.dest_mode;
-   irqe.delivery_mode = e-fields.delivery_mode  8;
-   kvm_calculate_eoi_exitmap(vcpu, irqe, eoi_exit_bitmap);
+   if (kvm_apic_match_dest(vcpu, NULL, 0,
+   e-fields.dest_id, e-fields.dest_mode))
+   __set_bit(e-fileds.vector, (unsigned long 
*)eoi_exit_bitmap);
}
}
spin_unlock(ioapic-lock);
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe kvm in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html