Module Name:    src
Committed By:   jym
Date:           Sun Feb 12 14:38:18 UTC 2012

Modified Files:
        src/sys/arch/x86/include: cpu.h
        src/sys/arch/xen/xen: clock.c xen_machdep.c

Log Message:
Xen clock management routines keep track of CPU (following MP merge).
Reflect this change in the suspend/resume routines so they can cope with
domU CPU suspend, instead of setting their cpu_info pointer to NULL.

Avoid copy/pasting by using the resume routines during attachement.

ok releng@.

No regression observed, and allows domU to suspend successfully again.
Restore is a different beast as PD/PT flags are marked "invalid" by Xen-4
hypervisor, and blocks resuming. Looking into it.


To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 src/sys/arch/x86/include/cpu.h
cvs rdiff -u -r1.60 -r1.61 src/sys/arch/xen/xen/clock.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/xen/xen/xen_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/include/cpu.h
diff -u src/sys/arch/x86/include/cpu.h:1.46 src/sys/arch/x86/include/cpu.h:1.47
--- src/sys/arch/x86/include/cpu.h:1.46	Sat Jan 28 07:19:17 2012
+++ src/sys/arch/x86/include/cpu.h	Sun Feb 12 14:38:18 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.46 2012/01/28 07:19:17 cherry Exp $	*/
+/*	$NetBSD: cpu.h,v 1.47 2012/02/12 14:38:18 jym Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -413,8 +413,8 @@ void	child_trampoline(void);
 void	startrtclock(void);
 void	xen_delay(unsigned int);
 void	xen_initclocks(void);
-void	xen_suspendclocks(void);
-void	xen_resumeclocks(void);
+void	xen_suspendclocks(struct cpu_info *);
+void	xen_resumeclocks(struct cpu_info *);
 #else
 /* clock.c */
 void	initrtclock(u_long);

Index: src/sys/arch/xen/xen/clock.c
diff -u src/sys/arch/xen/xen/clock.c:1.60 src/sys/arch/xen/xen/clock.c:1.61
--- src/sys/arch/xen/xen/clock.c:1.60	Mon Jan  9 13:35:42 2012
+++ src/sys/arch/xen/xen/clock.c	Sun Feb 12 14:38:18 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: clock.c,v 1.60 2012/01/09 13:35:42 cherry Exp $	*/
+/*	$NetBSD: clock.c,v 1.61 2012/02/12 14:38:18 jym Exp $	*/
 
 /*
  *
@@ -29,7 +29,7 @@
 #include "opt_xen.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.60 2012/01/09 13:35:42 cherry Exp $");
+__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.61 2012/02/12 14:38:18 jym Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -419,7 +419,7 @@ static struct evcnt hardclock_called[MAX
 void
 xen_initclocks(void)
 {
-	int err, evtch;
+	int err;
 	static bool tcdone = false;
 
 	struct cpu_info *ci = curcpu();
@@ -438,8 +438,6 @@ xen_initclocks(void)
 		callout_init(&xen_timepush_co, 0);
 	}
 #endif
-	evtch = bind_virq_to_evtch(VIRQ_TIMER);
-	aprint_verbose("Xen clock: using event channel %d\n", evtch);
 
 	if (!tcdone) { /* Do this only once */
 		mutex_init(&tmutex, MUTEX_DEFAULT, IPL_CLOCK);
@@ -451,7 +449,9 @@ xen_initclocks(void)
 	if (!tcdone) { /* Do this only once */
 		tc_init(&xen_timecounter);
 	}
+
 	/* The splhigh requirements start here. */
+	xen_resumeclocks(ci);
 
 	/*
 	 * The periodic timer looks buggy, we stop receiving events
@@ -461,16 +461,12 @@ xen_initclocks(void)
 	err = HYPERVISOR_vcpu_op(VCPUOP_stop_periodic_timer,
 				 ci->ci_cpuid,
 				 NULL);
-
 	KASSERT(err == 0);
+
 	err = HYPERVISOR_set_timer_op(
 	    vcpu_system_time[ci->ci_cpuid] + NS_PER_TICK);
 	KASSERT(err == 0);
 
-	event_set_handler(evtch, (int (*)(void *))xen_timer_handler,
-	    ci, IPL_CLOCK, "clock");
-	hypervisor_enable_event(evtch);
-
 #ifdef DOM0OPS
 	if (!tcdone) { /* Do this only once */
 
@@ -490,7 +486,7 @@ xen_initclocks(void)
 }
 
 void
-xen_suspendclocks(void)
+xen_suspendclocks(struct cpu_info *ci)
 {
 	int evtch;
 
@@ -498,13 +494,13 @@ xen_suspendclocks(void)
 	KASSERT(evtch != -1);
 
 	hypervisor_mask_event(evtch);
-	event_remove_handler(evtch, (int (*)(void *))xen_timer_handler, NULL);
+	event_remove_handler(evtch, (int (*)(void *))xen_timer_handler, ci);
 
 	aprint_verbose("Xen clock: removed event channel %d\n", evtch);
 }
 
 void
-xen_resumeclocks(void)
+xen_resumeclocks(struct cpu_info *ci)
 {
 	int evtch;
        
@@ -512,7 +508,7 @@ xen_resumeclocks(void)
 	KASSERT(evtch != -1);
 
 	event_set_handler(evtch, (int (*)(void *))xen_timer_handler,
-	    NULL, IPL_CLOCK, "clock");
+	    ci, IPL_CLOCK, "clock");
 	hypervisor_enable_event(evtch);
 
 	aprint_verbose("Xen clock: using event channel %d\n", evtch);

Index: src/sys/arch/xen/xen/xen_machdep.c
diff -u src/sys/arch/xen/xen/xen_machdep.c:1.9 src/sys/arch/xen/xen/xen_machdep.c:1.10
--- src/sys/arch/xen/xen/xen_machdep.c:1.9	Sun Nov 20 19:41:27 2011
+++ src/sys/arch/xen/xen/xen_machdep.c	Sun Feb 12 14:38:18 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: xen_machdep.c,v 1.9 2011/11/20 19:41:27 jym Exp $	*/
+/*	$NetBSD: xen_machdep.c,v 1.10 2012/02/12 14:38:18 jym Exp $	*/
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -53,7 +53,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xen_machdep.c,v 1.9 2011/11/20 19:41:27 jym Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xen_machdep.c,v 1.10 2012/02/12 14:38:18 jym Exp $");
 
 #include "opt_xen.h"
 
@@ -286,7 +286,7 @@ xen_prepare_suspend(void)
 	kpreempt_disable();
 
 	pmap_xen_suspend();
-	xen_suspendclocks();
+	xen_suspendclocks(curcpu());
 
 	/*
 	 * save/restore code does not translate these MFNs to their
@@ -337,7 +337,7 @@ xen_prepare_resume(void)
 
 	xen_suspend_allow = false;
 
-	xen_resumeclocks();
+	xen_resumeclocks(curcpu());
 
 	kpreempt_enable();
 

Reply via email to