All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] lapic3: various cleanups on user/kernel irqchip
@ 2007-08-10  6:17 He, Qing
       [not found] ` <37E52D09333DE2469A03574C88DBF40FA9C1C0-wq7ZOvIWXbM/UvCtAeCM4rfspsVTdybXVpNB7YpNyf8@public.gmane.org>
  0 siblings, 1 reply; 7+ messages in thread
From: He, Qing @ 2007-08-10  6:17 UTC (permalink / raw)
  To: kvm-devel

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

KVM: cleanups on user/kernel irqchip checking

The patch removes the union of userspace irq_pending and kernel apic in
struct vcpu, which minimizes the impact of careless overwriting and
avoids accidentally dereferencing invalid apic pointer.

It also adds a protective checking on KVM_INTERRUPT ioctl, which should
only be valid when using userspace irqchips.

Signed-off-by: Qing He <qing.he-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

---

diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index 87ddf73..f3f2222 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -322,19 +322,17 @@ struct kvm_vcpu {
 	u64 pdptrs[4]; /* pae */
 	u64 apic_base;
 	u64 shadow_efer;
-	union {
-		struct {	/* user irqchip context */
-		       /*
-			* bit vector: 1 per word in irq_pending
-			*/
-			unsigned long irq_summary;
-			DECLARE_BITMAP(irq_pending, KVM_NR_INTERRUPTS);
-			unsigned long cr8;
-		};
-		struct {	/* kernel irqchip context */
-			struct kvm_lapic *apic;
-		};
+
+	struct {    /* user irqchip context */
+		/*
+		 * bit vector: 1 per word in irq_pending
+		 */
+		unsigned long irq_summary;
+		DECLARE_BITMAP(irq_pending, KVM_NR_INTERRUPTS);
+		unsigned long cr8;
 	};
+	struct kvm_lapic *apic;    /* kernel irqchip context */
+
 	u64 ia32_misc_enable_msr;
 
 	struct kvm_mmu mmu;
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 88b0b89..fd9436e 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -1079,7 +1079,7 @@ static struct kvm_io_device
*vcpu_find_pervcpu_dev(struct kvm_vcpu *vcpu,
 {
 	struct kvm_io_device *dev;
 
-	if (irqchip_in_kernel(vcpu->kvm) && vcpu->apic) {
+	if (vcpu->apic) {
 		dev = &vcpu->apic->dev;
 		if (dev->in_range(dev, addr))
 			return dev;
@@ -2394,6 +2394,8 @@ static int kvm_vcpu_ioctl_interrupt(struct
kvm_vcpu *vcpu,
 {
 	if (irq->irq < 0 || irq->irq >= 256)
 		return -EINVAL;
+	if (irqchip_in_kernel(vcpu->kvm))
+		return -ENXIO;
 	vcpu_load(vcpu);
 
 	set_bit(irq->irq, vcpu->irq_pending);

[-- Attachment #2: apic-kern-user-cleanup.diff --]
[-- Type: application/octet-stream, Size: 1536 bytes --]

diff --git a/drivers/kvm/kvm.h b/drivers/kvm/kvm.h
index 87ddf73..f3f2222 100644
--- a/drivers/kvm/kvm.h
+++ b/drivers/kvm/kvm.h
@@ -322,19 +322,17 @@ struct kvm_vcpu {
 	u64 pdptrs[4]; /* pae */
 	u64 apic_base;
 	u64 shadow_efer;
-	union {
-		struct {	/* user irqchip context */
-		       /*
-			* bit vector: 1 per word in irq_pending
-			*/
-			unsigned long irq_summary;
-			DECLARE_BITMAP(irq_pending, KVM_NR_INTERRUPTS);
-			unsigned long cr8;
-		};
-		struct {	/* kernel irqchip context */
-			struct kvm_lapic *apic;
-		};
+
+	struct {    /* user irqchip context */
+		/*
+		 * bit vector: 1 per word in irq_pending
+		 */
+		unsigned long irq_summary;
+		DECLARE_BITMAP(irq_pending, KVM_NR_INTERRUPTS);
+		unsigned long cr8;
 	};
+	struct kvm_lapic *apic;    /* kernel irqchip context */
+
 	u64 ia32_misc_enable_msr;
 
 	struct kvm_mmu mmu;
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index 88b0b89..fd9436e 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -1079,7 +1079,7 @@ static struct kvm_io_device *vcpu_find_pervcpu_dev(struct kvm_vcpu *vcpu,
 {
 	struct kvm_io_device *dev;
 
-	if (irqchip_in_kernel(vcpu->kvm) && vcpu->apic) {
+	if (vcpu->apic) {
 		dev = &vcpu->apic->dev;
 		if (dev->in_range(dev, addr))
 			return dev;
@@ -2394,6 +2394,8 @@ static int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu,
 {
 	if (irq->irq < 0 || irq->irq >= 256)
 		return -EINVAL;
+	if (irqchip_in_kernel(vcpu->kvm))
+		return -ENXIO;
 	vcpu_load(vcpu);
 
 	set_bit(irq->irq, vcpu->irq_pending);

[-- 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] 7+ messages in thread

* clean APIC_TMCCT setting in APIC timer
       [not found] ` <37E52D09333DE2469A03574C88DBF40FA9C1C0-wq7ZOvIWXbM/UvCtAeCM4rfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-08-10 15:33   ` Dong, Eddie
       [not found]     ` <10EA09EFD8728347A513008B6B0DA77A01E8DA90-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
  2007-08-10 15:36   ` modify apic timer last_update to precisely reflect hrtimer fire point Dong, Eddie
  2007-08-13  7:55   ` [PATCH] lapic3: various cleanups on user/kernel irqchip Avi Kivity
  2 siblings, 1 reply; 7+ messages in thread
From: Dong, Eddie @ 2007-08-10 15:33 UTC (permalink / raw)
  To: kvm-devel

    APIC_TMCCT is a dynamically running count which always
    need to be recalculated at the time it is read. Setting
    intermediate value is meaningless.
    
    Signed-off-by: Yaozu (Eddie) Dong <Eddie.Dong-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>


diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
index d59b69f..fc53e88 100644
--- a/drivers/kvm/lapic.c
+++ b/drivers/kvm/lapic.c
@@ -445,7 +445,7 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic)
 {
 	u32 counter_passed;
 	ktime_t passed, now = apic->timer.dev.base->get_time();
-	u32 tmcct = apic_get_reg(apic, APIC_TMCCT);
+	u32 tmcct = apic_get_reg(apic, APIC_TMICT);
 
 	ASSERT(apic != NULL);
 
@@ -474,9 +474,6 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic)
 			} while (tmcct <= 0);
 	}
 
-	apic->timer.last_update = now;
-	apic_set_reg(apic, APIC_TMCCT, tmcct);
-
 	return tmcct;
 }
 
@@ -633,7 +630,6 @@ static void apic_mmio_write(struct kvm_io_device
*this,
 			u32 offset;
 
 			apic_set_reg(apic, APIC_TMICT, val);
-			apic_set_reg(apic, APIC_TMCCT, val);
 			apic->timer.last_update = now;
 			offset =
 			    APIC_BUS_CYCLE_NS * apic->timer.divide_count
* val;
@@ -815,7 +811,6 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
 	apic_set_reg(apic, APIC_ICR2, 0);
 	apic_set_reg(apic, APIC_TDCR, 0);
 	apic_set_reg(apic, APIC_TMICT, 0);
-	apic_set_reg(apic, APIC_TMCCT, 0);
 	for (i = 0; i < 8; i++) {
 		apic_set_reg(apic, APIC_IRR + 0x10 * i, 0);
 		apic_set_reg(apic, APIC_ISR + 0x10 * i, 0);
@@ -886,13 +881,10 @@ static int __apic_timer_fn(struct kvm_lapic *apic)
 		u32 offset;
 		u32 tmict = apic_get_reg(apic, APIC_TMICT);
 
-		apic_set_reg(apic, APIC_TMCCT, tmict);
 		offset = APIC_BUS_CYCLE_NS * apic->timer.divide_count *
tmict;
 
 		result = 1;
 		apic->timer.dev.expires = ktime_add_ns(now, offset);
-	} else {
-		apic_set_reg(apic, APIC_TMCCT, 0);
 	}
 
 	return result;
@@ -996,7 +988,6 @@ void kvm_apic_post_state_restore(struct kvm_vcpu
*vcpu)
 			     MSR_IA32_APICBASE_BASE;
 	apic_set_reg(apic, APIC_LVR, APIC_VERSION);
 	val = apic_get_reg(apic, APIC_TMICT);
-	apic_set_reg(apic, APIC_TMCCT, val);
 	apic_update_ppr(apic);
 
  	/* TODO: following code can be in a common API */

-------------------------------------------------------------------------
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 related	[flat|nested] 7+ messages in thread

* Re: clean APIC_TMCCT setting in APIC timer
       [not found]     ` <10EA09EFD8728347A513008B6B0DA77A01E8DA90-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-08-10 15:34       ` Dong, Eddie
  2007-08-13 11:25       ` Avi Kivity
  1 sibling, 0 replies; 7+ messages in thread
From: Dong, Eddie @ 2007-08-10 15:34 UTC (permalink / raw)
  To: Dong, Eddie, kvm-devel

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

Forgot the attachment :-(


kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org wrote:
>    APIC_TMCCT is a dynamically running count which always
>    need to be recalculated at the time it is read. Setting
>    intermediate value is meaningless.
> 
>    Signed-off-by: Yaozu (Eddie) Dong <Eddie.Dong-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> 
> 
> diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
> index d59b69f..fc53e88 100644
> --- a/drivers/kvm/lapic.c
> +++ b/drivers/kvm/lapic.c
> @@ -445,7 +445,7 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic)
> 	{ u32 counter_passed;
> 	ktime_t passed, now = apic->timer.dev.base->get_time();
> -	u32 tmcct = apic_get_reg(apic, APIC_TMCCT);
> +	u32 tmcct = apic_get_reg(apic, APIC_TMICT);
> 
> 	ASSERT(apic != NULL);
> 
> @@ -474,9 +474,6 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic)
> 	} while (tmcct <= 0); }
> 
> -	apic->timer.last_update = now;
> -	apic_set_reg(apic, APIC_TMCCT, tmcct);
> -
> 	return tmcct;
> }
> 
> @@ -633,7 +630,6 @@ static void apic_mmio_write(struct kvm_io_device
> 			*this, u32 offset;
> 
> 			apic_set_reg(apic, APIC_TMICT, val);
> -			apic_set_reg(apic, APIC_TMCCT, val);
> 			apic->timer.last_update = now;
> 			offset =
> 			    APIC_BUS_CYCLE_NS * apic->timer.divide_count
* val;
> @@ -815,7 +811,6 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
> 	apic_set_reg(apic, APIC_ICR2, 0);
> 	apic_set_reg(apic, APIC_TDCR, 0);
> 	apic_set_reg(apic, APIC_TMICT, 0);
> -	apic_set_reg(apic, APIC_TMCCT, 0);
> 	for (i = 0; i < 8; i++) {
> 		apic_set_reg(apic, APIC_IRR + 0x10 * i, 0);
> 		apic_set_reg(apic, APIC_ISR + 0x10 * i, 0);
> @@ -886,13 +881,10 @@ static int __apic_timer_fn(struct
> kvm_lapic *apic)
> 		u32 offset;
> 		u32 tmict = apic_get_reg(apic, APIC_TMICT);
> 
> -		apic_set_reg(apic, APIC_TMCCT, tmict);
> 		offset = APIC_BUS_CYCLE_NS * apic->timer.divide_count *
> tmict;
> 
> 		result = 1;
> 		apic->timer.dev.expires = ktime_add_ns(now, offset);
> -	} else {
> -		apic_set_reg(apic, APIC_TMCCT, 0);
> 	}
> 
> 	return result;
> @@ -996,7 +988,6 @@ void kvm_apic_post_state_restore(struct kvm_vcpu
> 			     *vcpu) MSR_IA32_APICBASE_BASE;
> 	apic_set_reg(apic, APIC_LVR, APIC_VERSION);
> 	val = apic_get_reg(apic, APIC_TMICT);
> -	apic_set_reg(apic, APIC_TMCCT, val);
> 	apic_update_ppr(apic);
> 
>  	/* TODO: following code can be in a common API */
> 
> ---------------------------------------------------------------
> ----------
> 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/ _______________________________________________
> kvm-devel mailing list
> kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> https://lists.sourceforge.net/lists/listinfo/kvm-devel


[-- Attachment #2: apic-timer-tmcct.patch --]
[-- Type: application/octet-stream, Size: 2281 bytes --]

commit 9b1a9ad955d9ac44ee6e60b4a565edf044d3dcc7
Author: root <root@vt32-pae.(none)>
Date:   Fri Aug 10 22:38:59 2007 +0800

    APIC_TMCCT is a dynamically running count which always
    need to be recalculated at the time it is read. Setting
    intermediate value is meaningless.
    
    Signed-off-by: Yaozu (Eddie) Dong <Eddie.Dong@intel.com>

diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
index d59b69f..fc53e88 100644
--- a/drivers/kvm/lapic.c
+++ b/drivers/kvm/lapic.c
@@ -445,7 +445,7 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic)
 {
 	u32 counter_passed;
 	ktime_t passed, now = apic->timer.dev.base->get_time();
-	u32 tmcct = apic_get_reg(apic, APIC_TMCCT);
+	u32 tmcct = apic_get_reg(apic, APIC_TMICT);
 
 	ASSERT(apic != NULL);
 
@@ -474,9 +474,6 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic)
 			} while (tmcct <= 0);
 	}
 
-	apic->timer.last_update = now;
-	apic_set_reg(apic, APIC_TMCCT, tmcct);
-
 	return tmcct;
 }
 
@@ -633,7 +630,6 @@ static void apic_mmio_write(struct kvm_io_device *this,
 			u32 offset;
 
 			apic_set_reg(apic, APIC_TMICT, val);
-			apic_set_reg(apic, APIC_TMCCT, val);
 			apic->timer.last_update = now;
 			offset =
 			    APIC_BUS_CYCLE_NS * apic->timer.divide_count * val;
@@ -815,7 +811,6 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
 	apic_set_reg(apic, APIC_ICR2, 0);
 	apic_set_reg(apic, APIC_TDCR, 0);
 	apic_set_reg(apic, APIC_TMICT, 0);
-	apic_set_reg(apic, APIC_TMCCT, 0);
 	for (i = 0; i < 8; i++) {
 		apic_set_reg(apic, APIC_IRR + 0x10 * i, 0);
 		apic_set_reg(apic, APIC_ISR + 0x10 * i, 0);
@@ -886,13 +881,10 @@ static int __apic_timer_fn(struct kvm_lapic *apic)
 		u32 offset;
 		u32 tmict = apic_get_reg(apic, APIC_TMICT);
 
-		apic_set_reg(apic, APIC_TMCCT, tmict);
 		offset = APIC_BUS_CYCLE_NS * apic->timer.divide_count * tmict;
 
 		result = 1;
 		apic->timer.dev.expires = ktime_add_ns(now, offset);
-	} else {
-		apic_set_reg(apic, APIC_TMCCT, 0);
 	}
 
 	return result;
@@ -996,7 +988,6 @@ void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu)
 			     MSR_IA32_APICBASE_BASE;
 	apic_set_reg(apic, APIC_LVR, APIC_VERSION);
 	val = apic_get_reg(apic, APIC_TMICT);
-	apic_set_reg(apic, APIC_TMCCT, val);
 	apic_update_ppr(apic);
 
  	/* TODO: following code can be in a common API */

[-- 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] 7+ messages in thread

* modify apic timer last_update to precisely reflect hrtimer fire point.
       [not found] ` <37E52D09333DE2469A03574C88DBF40FA9C1C0-wq7ZOvIWXbM/UvCtAeCM4rfspsVTdybXVpNB7YpNyf8@public.gmane.org>
  2007-08-10 15:33   ` clean APIC_TMCCT setting in APIC timer Dong, Eddie
@ 2007-08-10 15:36   ` Dong, Eddie
       [not found]     ` <10EA09EFD8728347A513008B6B0DA77A01E8DA92-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
  2007-08-13  7:55   ` [PATCH] lapic3: various cleanups on user/kernel irqchip Avi Kivity
  2 siblings, 1 reply; 7+ messages in thread
From: Dong, Eddie @ 2007-08-10 15:36 UTC (permalink / raw)
  To: kvm-devel

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

    cleanup:
    	last_update should precisely reflect the time
    	when an hrtimer is fired, and store the period
    	of apic timer to avoid calculation each time.
    
    Signed-off-by: Yaozu (Eddie) Dong <Eddie.Dong-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>



diff --git a/drivers/kvm/irq.h b/drivers/kvm/irq.h
index 44e1fa4..ed6d20a 100644
--- a/drivers/kvm/irq.h
+++ b/drivers/kvm/irq.h
@@ -111,6 +111,7 @@ struct kvm_lapic {
 	struct kvm_io_device dev;
 	struct {
 		unsigned long pending;
+		s64 period;	/* unit: ns */
 		u32 divide_count;
 		ktime_t last_update;
 		struct hrtimer dev;
diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
index fc53e88..352b8a7 100644
--- a/drivers/kvm/lapic.c
+++ b/drivers/kvm/lapic.c
@@ -627,11 +627,10 @@ static void apic_mmio_write(struct kvm_io_device
*this,
 	case APIC_TMICT:
 		{
 			ktime_t now = apic->timer.dev.base->get_time();
-			u32 offset;
 
 			apic_set_reg(apic, APIC_TMICT, val);
 			apic->timer.last_update = now;
-			offset =
+			apic->timer.period =
 			    APIC_BUS_CYCLE_NS * apic->timer.divide_count
* val;
 
 			/* Make sure the lock ordering is coherent */
@@ -861,7 +860,6 @@ EXPORT_SYMBOL_GPL(kvm_lapic_get_regs);
 static int __apic_timer_fn(struct kvm_lapic *apic)
 {
 	u32 vector;
-	ktime_t now;
 	int result = 0;
 
 	if (unlikely(!apic_enabled(apic) ||
@@ -872,8 +870,7 @@ static int __apic_timer_fn(struct kvm_lapic *apic)
 	}
 
 	vector = apic_lvt_vector(apic, APIC_LVTT);
-	now = apic->timer.dev.base->get_time();
-	apic->timer.last_update = now;
+	apic->timer.last_update = apic->timer.dev.expires;
 	apic->timer.pending++;
 	__apic_accept_irq(apic, APIC_DM_FIXED, vector, 1, 0);
 
@@ -884,7 +881,9 @@ static int __apic_timer_fn(struct kvm_lapic *apic)
 		offset = APIC_BUS_CYCLE_NS * apic->timer.divide_count *
tmict;
 
 		result = 1;
-		apic->timer.dev.expires = ktime_add_ns(now, offset);
+		apic->timer.dev.expires = ktime_add_ns(
+					apic->timer.dev.expires,
+					apic->timer.period);
 	}
 
 	return result;

[-- Attachment #2: apic-timer-last2.patch --]
[-- Type: application/octet-stream, Size: 1969 bytes --]


    cleanup:
    	last_update should precisely reflect the time
    	when an hrtimer is fired, and store the period
    	of apic timer to avoid calculation each time.
    
    Signed-off-by: Yaozu (Eddie) Dong <Eddie.Dong@intel.com>

diff --git a/drivers/kvm/irq.h b/drivers/kvm/irq.h
index 44e1fa4..ed6d20a 100644
--- a/drivers/kvm/irq.h
+++ b/drivers/kvm/irq.h
@@ -111,6 +111,7 @@ struct kvm_lapic {
 	struct kvm_io_device dev;
 	struct {
 		unsigned long pending;
+		s64 period;	/* unit: ns */
 		u32 divide_count;
 		ktime_t last_update;
 		struct hrtimer dev;
diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
index fc53e88..352b8a7 100644
--- a/drivers/kvm/lapic.c
+++ b/drivers/kvm/lapic.c
@@ -627,11 +627,10 @@ static void apic_mmio_write(struct kvm_io_device *this,
 	case APIC_TMICT:
 		{
 			ktime_t now = apic->timer.dev.base->get_time();
-			u32 offset;
 
 			apic_set_reg(apic, APIC_TMICT, val);
 			apic->timer.last_update = now;
-			offset =
+			apic->timer.period =
 			    APIC_BUS_CYCLE_NS * apic->timer.divide_count * val;
 
 			/* Make sure the lock ordering is coherent */
@@ -861,7 +860,6 @@ EXPORT_SYMBOL_GPL(kvm_lapic_get_regs);
 static int __apic_timer_fn(struct kvm_lapic *apic)
 {
 	u32 vector;
-	ktime_t now;
 	int result = 0;
 
 	if (unlikely(!apic_enabled(apic) ||
@@ -872,8 +870,7 @@ static int __apic_timer_fn(struct kvm_lapic *apic)
 	}
 
 	vector = apic_lvt_vector(apic, APIC_LVTT);
-	now = apic->timer.dev.base->get_time();
-	apic->timer.last_update = now;
+	apic->timer.last_update = apic->timer.dev.expires;
 	apic->timer.pending++;
 	__apic_accept_irq(apic, APIC_DM_FIXED, vector, 1, 0);
 
@@ -884,7 +881,9 @@ static int __apic_timer_fn(struct kvm_lapic *apic)
 		offset = APIC_BUS_CYCLE_NS * apic->timer.divide_count * tmict;
 
 		result = 1;
-		apic->timer.dev.expires = ktime_add_ns(now, offset);
+		apic->timer.dev.expires = ktime_add_ns(
+					apic->timer.dev.expires,
+					apic->timer.period);
 	}
 
 	return result;

[-- 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] 7+ messages in thread

* Re: [PATCH] lapic3: various cleanups on user/kernel irqchip
       [not found] ` <37E52D09333DE2469A03574C88DBF40FA9C1C0-wq7ZOvIWXbM/UvCtAeCM4rfspsVTdybXVpNB7YpNyf8@public.gmane.org>
  2007-08-10 15:33   ` clean APIC_TMCCT setting in APIC timer Dong, Eddie
  2007-08-10 15:36   ` modify apic timer last_update to precisely reflect hrtimer fire point Dong, Eddie
@ 2007-08-13  7:55   ` Avi Kivity
  2 siblings, 0 replies; 7+ messages in thread
From: Avi Kivity @ 2007-08-13  7:55 UTC (permalink / raw)
  To: He, Qing; +Cc: kvm-devel

He, Qing wrote:
> KVM: cleanups on user/kernel irqchip checking
>
> The patch removes the union of userspace irq_pending and kernel apic in
> struct vcpu, which minimizes the impact of careless overwriting and
> avoids accidentally dereferencing invalid apic pointer.
>
> It also adds a protective checking on KVM_INTERRUPT ioctl, which should
> only be valid when using userspace irqchips.
>
>   

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] 7+ messages in thread

* Re: modify apic timer last_update to precisely reflect hrtimer fire point.
       [not found]     ` <10EA09EFD8728347A513008B6B0DA77A01E8DA92-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2007-08-13 11:22       ` Avi Kivity
  0 siblings, 0 replies; 7+ messages in thread
From: Avi Kivity @ 2007-08-13 11:22 UTC (permalink / raw)
  To: Dong, Eddie; +Cc: kvm-devel

Dong, Eddie wrote:
>     cleanup:
>     	last_update should precisely reflect the time
>     	when an hrtimer is fired, and store the period
>     	of apic timer to avoid calculation each time.
>     
>   

This doesn't apply, I'm guessing it depends on the previous patch.  Will 
wait for your comments or updated patch.

-- 
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] 7+ messages in thread

* Re: clean APIC_TMCCT setting in APIC timer
       [not found]     ` <10EA09EFD8728347A513008B6B0DA77A01E8DA90-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
  2007-08-10 15:34       ` Dong, Eddie
@ 2007-08-13 11:25       ` Avi Kivity
  1 sibling, 0 replies; 7+ messages in thread
From: Avi Kivity @ 2007-08-13 11:25 UTC (permalink / raw)
  To: Dong, Eddie; +Cc: kvm-devel

Dong, Eddie wrote:
>     APIC_TMCCT is a dynamically running count which always
>     need to be recalculated at the time it is read. Setting
>     intermediate value is meaningless.
>     
>     Signed-off-by: Yaozu (Eddie) Dong <Eddie.Dong-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
>
>
>   

Patch corrupted by your mailer, please resend as attachment.

-- 
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] 7+ messages in thread

end of thread, other threads:[~2007-08-13 11:25 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-08-10  6:17 [PATCH] lapic3: various cleanups on user/kernel irqchip He, Qing
     [not found] ` <37E52D09333DE2469A03574C88DBF40FA9C1C0-wq7ZOvIWXbM/UvCtAeCM4rfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-08-10 15:33   ` clean APIC_TMCCT setting in APIC timer Dong, Eddie
     [not found]     ` <10EA09EFD8728347A513008B6B0DA77A01E8DA90-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-08-10 15:34       ` Dong, Eddie
2007-08-13 11:25       ` Avi Kivity
2007-08-10 15:36   ` modify apic timer last_update to precisely reflect hrtimer fire point Dong, Eddie
     [not found]     ` <10EA09EFD8728347A513008B6B0DA77A01E8DA92-wq7ZOvIWXbNpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2007-08-13 11:22       ` Avi Kivity
2007-08-13  7:55   ` [PATCH] lapic3: various cleanups on user/kernel irqchip Avi Kivity

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.