public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* preclean up for live migration
@ 2007-07-24  5:38 Dong, Eddie
       [not found] ` <10EA09EFD8728347A513008B6B0DA77A01D15B93-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: Dong, Eddie @ 2007-07-24  5:38 UTC (permalink / raw)
  To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f

[-- Attachment #1: Type: text/plain, Size: 5921 bytes --]

Against lapic2

This is a pre-cleanup for in kernel irqchip live migration support.
A guest may not have APIC but still have apic_base_msr be
save/restored in current live migration framework.


Signed-off-by: Yaozu (Eddie) Dong <eddie.dong-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

diff --git a/drivers/kvm/i8259.c b/drivers/kvm/i8259.c
diff --git a/drivers/kvm/irq.h b/drivers/kvm/irq.h
index a74d2e9..6cfc19f 100644
--- a/drivers/kvm/irq.h
+++ b/drivers/kvm/irq.h
@@ -106,7 +106,6 @@ struct kvm_ioapic {
 struct kvm_lapic {
 	spinlock_t lock;	/* TODO for revise */
 	u32 status;
-	u64 base_msr;
 	unsigned long base_address;
 	struct kvm_io_device dev;
 	struct {
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index d7e16ba..e62ecf2 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -336,6 +336,7 @@ struct kvm_vcpu {
 	unsigned long cr4;
 	u64 pdptrs[4]; /* pae */
 	u64 shadow_efer;
+	u64 apic_base_msr;
 	union {
 		struct {	/* user irqchip context */
 		       /*
@@ -345,7 +346,6 @@ struct kvm_vcpu {
 #define NR_IRQ_WORDS KVM_IRQ_BITMAP_SIZE(unsigned long)
 			unsigned long irq_pending[NR_IRQ_WORDS];
 			unsigned long cr8;
-			u64 apic_base;
 		};
 		struct {	/* kernel irqchip context */
 			struct kvm_lapic *apic;
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 3218303..0c75fef 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -655,9 +655,9 @@ EXPORT_SYMBOL_GPL(get_cr8);
 u64 kvm_get_apic_base(struct kvm_vcpu *vcpu)
 {
 	if (irqchip_in_kernel(vcpu->kvm))
-		return vcpu->apic->base_msr;
+		return vcpu->apic_base_msr;
 	else
-		return vcpu->apic_base;
+		return vcpu->apic_base_msr;
 }
 EXPORT_SYMBOL_GPL(kvm_get_apic_base);
 
@@ -667,7 +667,7 @@ void kvm_set_apic_base(struct kvm_vcpu *vcpu, u64
data)
 	if (irqchip_in_kernel(vcpu->kvm))
 		kvm_lapic_set_base(vcpu, data);
 	else
-		vcpu->apic_base = data;
+		vcpu->apic_base_msr = data;
 }
 EXPORT_SYMBOL_GPL(kvm_set_apic_base);
 
diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
index cf2af18..b88ecd9 100644
--- a/drivers/kvm/lapic.c
+++ b/drivers/kvm/lapic.c
@@ -77,7 +77,7 @@ static inline void apic_clear_vector(int vec, void
*bitmap)
 
 static inline int apic_hw_enabled(struct kvm_lapic *apic)
 {
-	return (apic)->base_msr & MSR_IA32_APICBASE_ENABLE;
+	return (apic)->vcpu->apic_base_msr & MSR_IA32_APICBASE_ENABLE;
 }
 
 static inline int  apic_sw_enabled(struct kvm_lapic *apic)
@@ -724,6 +724,8 @@ void kvm_lapic_set_tpr(struct kvm_vcpu *vcpu,
unsigned long cr8)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 
+	if (!apic)
+		return;
 	spin_lock_bh(&apic->lock);
 	apic_set_tpr(apic, ((cr8 & 0x0f) << 4));
 	spin_unlock_bh(&apic->lock);
@@ -734,6 +736,8 @@ u64 kvm_lapic_get_cr8(struct kvm_vcpu *vcpu)
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	u64 tpr;
 
+	if (!apic)
+		return 0;
 	spin_lock_bh(&apic->lock);
 	tpr = (u64) apic_get_reg(apic, APIC_TASKPRI);
 	spin_unlock_bh(&apic->lock);
@@ -745,16 +749,22 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64
value)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 
+	if (!apic) {
+		value |= MSR_IA32_APICBASE_BSP;
+		vcpu->apic_base_msr = value;
+		return;
+	}
 	spin_lock_bh(&apic->lock);
 	if (apic->vcpu->vcpu_id)
 		value &= ~MSR_IA32_APICBASE_BSP;
 
-	apic->base_msr = value;
-	apic->base_address = apic->base_msr & MSR_IA32_APICBASE_BASE;
+	vcpu->apic_base_msr = value;
+	apic->base_address = apic->vcpu->apic_base_msr &
+			     MSR_IA32_APICBASE_BASE;
 
 	/* with FSB delivery interrupt, we can restart APIC
functionality */
 	apic_debug("apic base msr is 0x%016" PRIx64 ", and base address
is "
-		   "0x%lx.\n", apic->base_msr, apic->base_address);
+		   "0x%lx.\n", apic->apic_base_msr, apic->base_address);
 
 	spin_unlock_bh(&apic->lock);
 }
@@ -765,7 +775,7 @@ u64 kvm_lapic_get_base(struct kvm_vcpu *vcpu)
 	u64 base;
 
 	spin_lock_bh(&apic->lock);
-	base = apic->base_msr;
+	base = vcpu->apic_base_msr;
 	spin_unlock_bh(&apic->lock);
 
 	return base;
@@ -813,7 +823,7 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
 	apic->timer.pending = 0;
 	apic->status = APIC_SW_DISABLE;
 	if (vcpu->vcpu_id == 0)
-		apic->base_msr |= MSR_IA32_APICBASE_BSP;
+		vcpu->apic_base_msr |= MSR_IA32_APICBASE_BSP;
 	apic_update_ppr(apic);
 
 	spin_unlock_bh(&apic->lock);
@@ -821,7 +831,7 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
 	apic_debug(KERN_INFO "%s: vcpu=%p, id=%d, base_msr="
 		   "0x%016" PRIx64 ", base_address=0x%0lx.\n",
__FUNCTION__,
 		   vcpu, GET_APIC_ID(apic_get_reg(apic, APIC_ID)),
-		   apic->base_msr, apic->base_address);
+		   vcpu->apic_base_msr, apic->base_address);
 }
 
 int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
@@ -829,6 +839,8 @@ int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	int ret = 0;
 
+	if (!apic)
+		return 0;
 	spin_lock_bh(&apic->lock);
 	ret = apic_enabled(apic);
 	spin_unlock_bh(&apic->lock);
@@ -836,12 +848,14 @@ int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
 	return ret;
 }
 
+/*
 void *kvm_lapic_get_regs(struct kvm_vcpu *vcpu)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	return apic->regs;
 }
 EXPORT_SYMBOL_GPL(kvm_lapic_get_regs);
+*/
 
 /*
 
*----------------------------------------------------------------------
@@ -927,7 +941,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu)
 	hrtimer_init(&apic->timer.dev, CLOCK_MONOTONIC,
HRTIMER_MODE_ABS);
 	apic->timer.dev.function = apic_timer_fn;
 	apic->base_address = APIC_DEFAULT_PHYS_BASE;
-	apic->base_msr = APIC_DEFAULT_PHYS_BASE;
+	vcpu->apic_base_msr = APIC_DEFAULT_PHYS_BASE;
 
 	lapic_reset(vcpu);
 	apic->dev.read = apic_mmio_read;
diff --git a/include/linux/kvm.h b/include/linux/kvm.h

[-- Attachment #2: live_pre_k.patch --]
[-- Type: application/octet-stream, Size: 5444 bytes --]

diff --git a/drivers/kvm/i8259.c b/drivers/kvm/i8259.c
diff --git a/drivers/kvm/irq.h b/drivers/kvm/irq.h
index a74d2e9..6cfc19f 100644
--- a/drivers/kvm/irq.h
+++ b/drivers/kvm/irq.h
@@ -106,7 +106,6 @@ struct kvm_ioapic {
 struct kvm_lapic {
 	spinlock_t lock;	/* TODO for revise */
 	u32 status;
-	u64 base_msr;
 	unsigned long base_address;
 	struct kvm_io_device dev;
 	struct {
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index d7e16ba..e62ecf2 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -336,6 +336,7 @@ struct kvm_vcpu {
 	unsigned long cr4;
 	u64 pdptrs[4]; /* pae */
 	u64 shadow_efer;
+	u64 apic_base_msr;
 	union {
 		struct {	/* user irqchip context */
 		       /*
@@ -345,7 +346,6 @@ struct kvm_vcpu {
 #define NR_IRQ_WORDS KVM_IRQ_BITMAP_SIZE(unsigned long)
 			unsigned long irq_pending[NR_IRQ_WORDS];
 			unsigned long cr8;
-			u64 apic_base;
 		};
 		struct {	/* kernel irqchip context */
 			struct kvm_lapic *apic;
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 3218303..0c75fef 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -655,9 +655,9 @@ EXPORT_SYMBOL_GPL(get_cr8);
 u64 kvm_get_apic_base(struct kvm_vcpu *vcpu)
 {
 	if (irqchip_in_kernel(vcpu->kvm))
-		return vcpu->apic->base_msr;
+		return vcpu->apic_base_msr;
 	else
-		return vcpu->apic_base;
+		return vcpu->apic_base_msr;
 }
 EXPORT_SYMBOL_GPL(kvm_get_apic_base);
 
@@ -667,7 +667,7 @@ void kvm_set_apic_base(struct kvm_vcpu *vcpu, u64 data)
 	if (irqchip_in_kernel(vcpu->kvm))
 		kvm_lapic_set_base(vcpu, data);
 	else
-		vcpu->apic_base = data;
+		vcpu->apic_base_msr = data;
 }
 EXPORT_SYMBOL_GPL(kvm_set_apic_base);
 
diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
index cf2af18..b88ecd9 100644
--- a/drivers/kvm/lapic.c
+++ b/drivers/kvm/lapic.c
@@ -77,7 +77,7 @@ static inline void apic_clear_vector(int vec, void *bitmap)
 
 static inline int apic_hw_enabled(struct kvm_lapic *apic)
 {
-	return (apic)->base_msr & MSR_IA32_APICBASE_ENABLE;
+	return (apic)->vcpu->apic_base_msr & MSR_IA32_APICBASE_ENABLE;
 }
 
 static inline int  apic_sw_enabled(struct kvm_lapic *apic)
@@ -724,6 +724,8 @@ void kvm_lapic_set_tpr(struct kvm_vcpu *vcpu, unsigned long cr8)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 
+	if (!apic)
+		return;
 	spin_lock_bh(&apic->lock);
 	apic_set_tpr(apic, ((cr8 & 0x0f) << 4));
 	spin_unlock_bh(&apic->lock);
@@ -734,6 +736,8 @@ u64 kvm_lapic_get_cr8(struct kvm_vcpu *vcpu)
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	u64 tpr;
 
+	if (!apic)
+		return 0;
 	spin_lock_bh(&apic->lock);
 	tpr = (u64) apic_get_reg(apic, APIC_TASKPRI);
 	spin_unlock_bh(&apic->lock);
@@ -745,16 +749,22 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 
+	if (!apic) {
+		value |= MSR_IA32_APICBASE_BSP;
+		vcpu->apic_base_msr = value;
+		return;
+	}
 	spin_lock_bh(&apic->lock);
 	if (apic->vcpu->vcpu_id)
 		value &= ~MSR_IA32_APICBASE_BSP;
 
-	apic->base_msr = value;
-	apic->base_address = apic->base_msr & MSR_IA32_APICBASE_BASE;
+	vcpu->apic_base_msr = value;
+	apic->base_address = apic->vcpu->apic_base_msr &
+			     MSR_IA32_APICBASE_BASE;
 
 	/* with FSB delivery interrupt, we can restart APIC functionality */
 	apic_debug("apic base msr is 0x%016" PRIx64 ", and base address is "
-		   "0x%lx.\n", apic->base_msr, apic->base_address);
+		   "0x%lx.\n", apic->apic_base_msr, apic->base_address);
 
 	spin_unlock_bh(&apic->lock);
 }
@@ -765,7 +775,7 @@ u64 kvm_lapic_get_base(struct kvm_vcpu *vcpu)
 	u64 base;
 
 	spin_lock_bh(&apic->lock);
-	base = apic->base_msr;
+	base = vcpu->apic_base_msr;
 	spin_unlock_bh(&apic->lock);
 
 	return base;
@@ -813,7 +823,7 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
 	apic->timer.pending = 0;
 	apic->status = APIC_SW_DISABLE;
 	if (vcpu->vcpu_id == 0)
-		apic->base_msr |= MSR_IA32_APICBASE_BSP;
+		vcpu->apic_base_msr |= MSR_IA32_APICBASE_BSP;
 	apic_update_ppr(apic);
 
 	spin_unlock_bh(&apic->lock);
@@ -821,7 +831,7 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
 	apic_debug(KERN_INFO "%s: vcpu=%p, id=%d, base_msr="
 		   "0x%016" PRIx64 ", base_address=0x%0lx.\n", __FUNCTION__,
 		   vcpu, GET_APIC_ID(apic_get_reg(apic, APIC_ID)),
-		   apic->base_msr, apic->base_address);
+		   vcpu->apic_base_msr, apic->base_address);
 }
 
 int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
@@ -829,6 +839,8 @@ int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	int ret = 0;
 
+	if (!apic)
+		return 0;
 	spin_lock_bh(&apic->lock);
 	ret = apic_enabled(apic);
 	spin_unlock_bh(&apic->lock);
@@ -836,12 +848,14 @@ int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
 	return ret;
 }
 
+/*
 void *kvm_lapic_get_regs(struct kvm_vcpu *vcpu)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	return apic->regs;
 }
 EXPORT_SYMBOL_GPL(kvm_lapic_get_regs);
+*/
 
 /*
  *----------------------------------------------------------------------
@@ -927,7 +941,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu)
 	hrtimer_init(&apic->timer.dev, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
 	apic->timer.dev.function = apic_timer_fn;
 	apic->base_address = APIC_DEFAULT_PHYS_BASE;
-	apic->base_msr = APIC_DEFAULT_PHYS_BASE;
+	vcpu->apic_base_msr = APIC_DEFAULT_PHYS_BASE;
 
 	lapic_reset(vcpu);
 	apic->dev.read = apic_mmio_read;
diff --git a/include/linux/kvm.h b/include/linux/kvm.h

[-- Attachment #3: Type: text/plain, Size: 315 bytes --]

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

[-- Attachment #4: Type: text/plain, Size: 186 bytes --]

_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: preclean up for live migration
       [not found] ` <10EA09EFD8728347A513008B6B0DA77A01D15B93-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-07-24  9:42   ` Avi Kivity
       [not found]     ` <46A5C97E.80706-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: Avi Kivity @ 2007-07-24  9:42 UTC (permalink / raw)
  To: Dong, Eddie; +Cc: kvm-devel

Dong, Eddie wrote:
> Against lapic2
>
> This is a pre-cleanup for in kernel irqchip live migration support.
> A guest may not have APIC but still have apic_base_msr be
> save/restored in current live migration framework.
>
>
> Signed-off-by: Yaozu (Eddie) Dong <eddie.dong-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
>
> diff --git a/drivers/kvm/i8259.c b/drivers/kvm/i8259.c
> diff --git a/drivers/kvm/irq.h b/drivers/kvm/irq.h
> index a74d2e9..6cfc19f 100644
> --- a/drivers/kvm/irq.h
> +++ b/drivers/kvm/irq.h
> @@ -106,7 +106,6 @@ struct kvm_ioapic {
>  struct kvm_lapic {
>  	spinlock_t lock;	/* TODO for revise */
>  	u32 status;
> -	u64 base_msr;
>  	unsigned long base_address;
>  	struct kvm_io_device dev;
>  	struct {
> diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
> index d7e16ba..e62ecf2 100644
> --- a/drivers/kvm/kvm.h
> +++ b/drivers/kvm/kvm.h	
> @@ -336,6 +336,7 @@ struct kvm_vcpu {
>  	unsigned long cr4;
>  	u64 pdptrs[4]; /* pae */
>  	u64 shadow_efer;
> +	u64 apic_base_msr;
>   

Can we keep the name the same?  Then this patch simply undoes some of 
the main lapic patch and we can fold them together.

-- 
error compiling committee.c: too many arguments to function


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: preclean up for live migration
       [not found]     ` <46A5C97E.80706-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
@ 2007-08-01 15:10       ` Dong, Eddie
       [not found]         ` <10EA09EFD8728347A513008B6B0DA77A01DB6D3B-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
  0 siblings, 1 reply; 4+ messages in thread
From: Dong, Eddie @ 2007-08-01 15:10 UTC (permalink / raw)
  To: Avi Kivity; +Cc: kvm-devel

[-- Attachment #1: Type: text/plain, Size: 5448 bytes --]

Avi Kivity wrote:
> Dong, Eddie wrote:
>> Against lapic2
>> 
>> This is a pre-cleanup for in kernel irqchip live migration support.
>> A guest may not have APIC but still have apic_base_msr be
>> save/restored in current live migration framework.
>> 

Updated.

diff --git a/drivers/kvm/irq.h b/drivers/kvm/irq.h
index 835a41e..700db5e 100644
--- a/drivers/kvm/irq.h
+++ b/drivers/kvm/irq.h
@@ -107,7 +107,6 @@ struct kvm_ioapic {
 struct kvm_lapic {
 	spinlock_t lock;	/* TODO for revise */
 	u32 status;
-	u64 base_msr;
 	unsigned long base_address;
 	struct kvm_io_device dev;
 	struct {
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index fc7339f..42b0408 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -320,6 +320,7 @@ struct kvm_vcpu {
 	gpa_t hypercall_gpa;
 	unsigned long cr4;
 	u64 pdptrs[4]; /* pae */
+	u64 apic_base;
 	u64 shadow_efer;
 	union {
 		struct {	/* user irqchip context */
@@ -329,7 +330,6 @@ struct kvm_vcpu {
 			unsigned long irq_summary;
 			DECLARE_BITMAP(irq_pending, KVM_NR_INTERRUPTS);
 			unsigned long cr8;
-			u64 apic_base;
 		};
 		struct {	/* kernel irqchip context */
 			struct kvm_lapic *apic;
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index cb244f6..dae8540 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -631,7 +631,7 @@ EXPORT_SYMBOL_GPL(get_cr8);
 u64 kvm_get_apic_base(struct kvm_vcpu *vcpu)
 {
 	if (irqchip_in_kernel(vcpu->kvm))
-		return vcpu->apic->base_msr;
+		return vcpu->apic_base;
 	else
 		return vcpu->apic_base;
 }
diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
index 7f60bf3..ca592b7 100644
--- a/drivers/kvm/lapic.c
+++ b/drivers/kvm/lapic.c
@@ -78,7 +78,7 @@ static inline void apic_clear_vector(int vec, void
*bitmap)
 
 static inline int apic_hw_enabled(struct kvm_lapic *apic)
 {
-	return (apic)->base_msr & MSR_IA32_APICBASE_ENABLE;
+	return (apic)->vcpu->apic_base & MSR_IA32_APICBASE_ENABLE;
 }
 
 static inline int  apic_sw_enabled(struct kvm_lapic *apic)
@@ -728,6 +728,8 @@ void kvm_lapic_set_tpr(struct kvm_vcpu *vcpu,
unsigned long cr8)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 
+	if (!apic)
+		return;
 	spin_lock_bh(&apic->lock);
 	apic_set_tpr(apic, ((cr8 & 0x0f) << 4));
 	spin_unlock_bh(&apic->lock);
@@ -738,6 +740,8 @@ u64 kvm_lapic_get_cr8(struct kvm_vcpu *vcpu)
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	u64 tpr;
 
+	if (!apic)
+		return 0;
 	spin_lock_bh(&apic->lock);
 	tpr = (u64) apic_get_reg(apic, APIC_TASKPRI);
 	spin_unlock_bh(&apic->lock);
@@ -749,16 +753,22 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64
value)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 
+	if (!apic) {
+		value |= MSR_IA32_APICBASE_BSP;
+		vcpu->apic_base = value;
+		return;
+	}
 	spin_lock_bh(&apic->lock);
 	if (apic->vcpu->vcpu_id)
 		value &= ~MSR_IA32_APICBASE_BSP;
 
-	apic->base_msr = value;
-	apic->base_address = apic->base_msr & MSR_IA32_APICBASE_BASE;
+	vcpu->apic_base = value;
+	apic->base_address = apic->vcpu->apic_base &
+			     MSR_IA32_APICBASE_BASE;
 
 	/* with FSB delivery interrupt, we can restart APIC
functionality */
 	apic_debug("apic base msr is 0x%016" PRIx64 ", and base address
is "
-		   "0x%lx.\n", apic->base_msr, apic->base_address);
+		   "0x%lx.\n", apic->apic_base, apic->base_address);
 
 	spin_unlock_bh(&apic->lock);
 }
@@ -769,7 +779,7 @@ u64 kvm_lapic_get_base(struct kvm_vcpu *vcpu)
 	u64 base;
 
 	spin_lock_bh(&apic->lock);
-	base = apic->base_msr;
+	base = vcpu->apic_base;
 	spin_unlock_bh(&apic->lock);
 
 	return base;
@@ -817,7 +827,7 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
 	apic->timer.pending = 0;
 	apic->status = APIC_SW_DISABLE;
 	if (vcpu->vcpu_id == 0)
-		apic->base_msr |= MSR_IA32_APICBASE_BSP;
+		vcpu->apic_base |= MSR_IA32_APICBASE_BSP;
 	apic_update_ppr(apic);
 
 	spin_unlock_bh(&apic->lock);
@@ -825,7 +835,7 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
 	apic_debug(KERN_INFO "%s: vcpu=%p, id=%d, base_msr="
 		   "0x%016" PRIx64 ", base_address=0x%0lx.\n",
__FUNCTION__,
 		   vcpu, GET_APIC_ID(apic_get_reg(apic, APIC_ID)),
-		   apic->base_msr, apic->base_address);
+		   vcpu->apic_base, apic->base_address);
 }
 
 int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
@@ -833,6 +843,8 @@ int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	int ret = 0;
 
+	if (!apic)
+		return 0;
 	spin_lock_bh(&apic->lock);
 	ret = apic_enabled(apic);
 	spin_unlock_bh(&apic->lock);
@@ -840,12 +852,14 @@ int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
 	return ret;
 }
 
+/*
 void *kvm_lapic_get_regs(struct kvm_vcpu *vcpu)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	return apic->regs;
 }
 EXPORT_SYMBOL_GPL(kvm_lapic_get_regs);
+*/
 
 /*
 
*----------------------------------------------------------------------
@@ -931,7 +945,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu)
 	hrtimer_init(&apic->timer.dev, CLOCK_MONOTONIC,
HRTIMER_MODE_ABS);
 	apic->timer.dev.function = apic_timer_fn;
 	apic->base_address = APIC_DEFAULT_PHYS_BASE;
-	apic->base_msr = APIC_DEFAULT_PHYS_BASE;
+	vcpu->apic_base = APIC_DEFAULT_PHYS_BASE;
 
 	lapic_reset(vcpu);
 	apic->dev.read = apic_mmio_read;
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c

[-- Attachment #2: live_pre_k2.patch --]
[-- Type: application/octet-stream, Size: 5182 bytes --]

 A guest may not have APIC but still have apic_base_msr be
 save/restored in current live migration framework.
 
 
Signed-off-by: Yaozu (Eddie) Dong <eddie.dong@intel.com>

diff --git a/drivers/kvm/irq.h b/drivers/kvm/irq.h
index 835a41e..700db5e 100644
--- a/drivers/kvm/irq.h
+++ b/drivers/kvm/irq.h
@@ -107,7 +107,6 @@ struct kvm_ioapic {
 struct kvm_lapic {
 	spinlock_t lock;	/* TODO for revise */
 	u32 status;
-	u64 base_msr;
 	unsigned long base_address;
 	struct kvm_io_device dev;
 	struct {
diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index fc7339f..42b0408 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -320,6 +320,7 @@ struct kvm_vcpu {
 	gpa_t hypercall_gpa;
 	unsigned long cr4;
 	u64 pdptrs[4]; /* pae */
+	u64 apic_base;
 	u64 shadow_efer;
 	union {
 		struct {	/* user irqchip context */
@@ -329,7 +330,6 @@ struct kvm_vcpu {
 			unsigned long irq_summary;
 			DECLARE_BITMAP(irq_pending, KVM_NR_INTERRUPTS);
 			unsigned long cr8;
-			u64 apic_base;
 		};
 		struct {	/* kernel irqchip context */
 			struct kvm_lapic *apic;
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index cb244f6..dae8540 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -631,7 +631,7 @@ EXPORT_SYMBOL_GPL(get_cr8);
 u64 kvm_get_apic_base(struct kvm_vcpu *vcpu)
 {
 	if (irqchip_in_kernel(vcpu->kvm))
-		return vcpu->apic->base_msr;
+		return vcpu->apic_base;
 	else
 		return vcpu->apic_base;
 }
diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
index 7f60bf3..ca592b7 100644
--- a/drivers/kvm/lapic.c
+++ b/drivers/kvm/lapic.c
@@ -78,7 +78,7 @@ static inline void apic_clear_vector(int vec, void *bitmap)
 
 static inline int apic_hw_enabled(struct kvm_lapic *apic)
 {
-	return (apic)->base_msr & MSR_IA32_APICBASE_ENABLE;
+	return (apic)->vcpu->apic_base & MSR_IA32_APICBASE_ENABLE;
 }
 
 static inline int  apic_sw_enabled(struct kvm_lapic *apic)
@@ -728,6 +728,8 @@ void kvm_lapic_set_tpr(struct kvm_vcpu *vcpu, unsigned long cr8)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 
+	if (!apic)
+		return;
 	spin_lock_bh(&apic->lock);
 	apic_set_tpr(apic, ((cr8 & 0x0f) << 4));
 	spin_unlock_bh(&apic->lock);
@@ -738,6 +740,8 @@ u64 kvm_lapic_get_cr8(struct kvm_vcpu *vcpu)
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	u64 tpr;
 
+	if (!apic)
+		return 0;
 	spin_lock_bh(&apic->lock);
 	tpr = (u64) apic_get_reg(apic, APIC_TASKPRI);
 	spin_unlock_bh(&apic->lock);
@@ -749,16 +753,22 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 
+	if (!apic) {
+		value |= MSR_IA32_APICBASE_BSP;
+		vcpu->apic_base = value;
+		return;
+	}
 	spin_lock_bh(&apic->lock);
 	if (apic->vcpu->vcpu_id)
 		value &= ~MSR_IA32_APICBASE_BSP;
 
-	apic->base_msr = value;
-	apic->base_address = apic->base_msr & MSR_IA32_APICBASE_BASE;
+	vcpu->apic_base = value;
+	apic->base_address = apic->vcpu->apic_base &
+			     MSR_IA32_APICBASE_BASE;
 
 	/* with FSB delivery interrupt, we can restart APIC functionality */
 	apic_debug("apic base msr is 0x%016" PRIx64 ", and base address is "
-		   "0x%lx.\n", apic->base_msr, apic->base_address);
+		   "0x%lx.\n", apic->apic_base, apic->base_address);
 
 	spin_unlock_bh(&apic->lock);
 }
@@ -769,7 +779,7 @@ u64 kvm_lapic_get_base(struct kvm_vcpu *vcpu)
 	u64 base;
 
 	spin_lock_bh(&apic->lock);
-	base = apic->base_msr;
+	base = vcpu->apic_base;
 	spin_unlock_bh(&apic->lock);
 
 	return base;
@@ -817,7 +827,7 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
 	apic->timer.pending = 0;
 	apic->status = APIC_SW_DISABLE;
 	if (vcpu->vcpu_id == 0)
-		apic->base_msr |= MSR_IA32_APICBASE_BSP;
+		vcpu->apic_base |= MSR_IA32_APICBASE_BSP;
 	apic_update_ppr(apic);
 
 	spin_unlock_bh(&apic->lock);
@@ -825,7 +835,7 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
 	apic_debug(KERN_INFO "%s: vcpu=%p, id=%d, base_msr="
 		   "0x%016" PRIx64 ", base_address=0x%0lx.\n", __FUNCTION__,
 		   vcpu, GET_APIC_ID(apic_get_reg(apic, APIC_ID)),
-		   apic->base_msr, apic->base_address);
+		   vcpu->apic_base, apic->base_address);
 }
 
 int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
@@ -833,6 +843,8 @@ int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	int ret = 0;
 
+	if (!apic)
+		return 0;
 	spin_lock_bh(&apic->lock);
 	ret = apic_enabled(apic);
 	spin_unlock_bh(&apic->lock);
@@ -840,12 +852,14 @@ int kvm_lapic_enabled(struct kvm_vcpu *vcpu)
 	return ret;
 }
 
+/*
 void *kvm_lapic_get_regs(struct kvm_vcpu *vcpu)
 {
 	struct kvm_lapic *apic = (struct kvm_lapic *)vcpu->apic;
 	return apic->regs;
 }
 EXPORT_SYMBOL_GPL(kvm_lapic_get_regs);
+*/
 
 /*
  *----------------------------------------------------------------------
@@ -931,7 +945,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu)
 	hrtimer_init(&apic->timer.dev, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
 	apic->timer.dev.function = apic_timer_fn;
 	apic->base_address = APIC_DEFAULT_PHYS_BASE;
-	apic->base_msr = APIC_DEFAULT_PHYS_BASE;
+	vcpu->apic_base = APIC_DEFAULT_PHYS_BASE;
 
 	lapic_reset(vcpu);
 	apic->dev.read = apic_mmio_read;
diff --git a/drivers/kvm/svm.c b/drivers/kvm/svm.c

[-- Attachment #3: Type: text/plain, Size: 315 bytes --]

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

[-- Attachment #4: Type: text/plain, Size: 186 bytes --]

_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: preclean up for live migration
       [not found]         ` <10EA09EFD8728347A513008B6B0DA77A01DB6D3B-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-08-01 18:27           ` Avi Kivity
  0 siblings, 0 replies; 4+ messages in thread
From: Avi Kivity @ 2007-08-01 18:27 UTC (permalink / raw)
  To: Dong, Eddie; +Cc: kvm-devel

Dong, Eddie wrote:
> Avi Kivity wrote:
>   
>> Dong, Eddie wrote:
>>     
>>> Against lapic2
>>>
>>> This is a pre-cleanup for in kernel irqchip live migration support.
>>> A guest may not have APIC but still have apic_base_msr be
>>> save/restored in current live migration framework.
>>>
>>>       
>
> Updated.
>
>   

Applied - thanks.

-- 
error compiling committee.c: too many arguments to function


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2007-08-01 18:27 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-24  5:38 preclean up for live migration Dong, Eddie
     [not found] ` <10EA09EFD8728347A513008B6B0DA77A01D15B93-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-07-24  9:42   ` Avi Kivity
     [not found]     ` <46A5C97E.80706-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-01 15:10       ` Dong, Eddie
     [not found]         ` <10EA09EFD8728347A513008B6B0DA77A01DB6D3B-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-08-01 18:27           ` Avi Kivity

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox