* 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[parent not found: <10EA09EFD8728347A513008B6B0DA77A01D15B93-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>]
* 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
[parent not found: <46A5C97E.80706-atKUWr5tajBWk0Htik3J/w@public.gmane.org>]
* 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
[parent not found: <10EA09EFD8728347A513008B6B0DA77A01DB6D3B-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>]
* 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