svn commit: r186766 - user/dfr/xenhvm/6/sys/dev/xen/xenpci

Doug Rabson dfr at FreeBSD.org
Mon Jan 5 02:41:55 PST 2009


Author: dfr
Date: Mon Jan  5 10:41:54 2009
New Revision: 186766
URL: http://svn.freebsd.org/changeset/base/186766

Log:
  Tidy this up and remove all the #if 0 dead code. Add a suitable copyright.

Modified:
  user/dfr/xenhvm/6/sys/dev/xen/xenpci/machine_reboot.c

Modified: user/dfr/xenhvm/6/sys/dev/xen/xenpci/machine_reboot.c
==============================================================================
--- user/dfr/xenhvm/6/sys/dev/xen/xenpci/machine_reboot.c	Mon Jan  5 10:40:19 2009	(r186765)
+++ user/dfr/xenhvm/6/sys/dev/xen/xenpci/machine_reboot.c	Mon Jan  5 10:41:54 2009	(r186766)
@@ -1,125 +1,79 @@
+/*-
+ * Copyright (c) 2008 Citrix Systems, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
-#include <sys/systm.h>
 #include <sys/bus.h>
-#include <sys/malloc.h>
 #include <sys/kernel.h>
-#include <sys/limits.h>
-#include <sys/lock.h>
-#include <sys/mutex.h>
 #include <sys/interrupt.h>
-#include <sys/pcpu.h>
 
 #include <machine/xen/xen-os.h>
-#include <machine/xen/xenvar.h>
 #include <xen/hypervisor.h>
 #include <xen/xen_intr.h>
-#include <xen/evtchn.h>
-#include <sys/smp.h>
 
 #include <dev/xen/xenpci/xenpcivar.h>
 
-struct ap_suspend_info {
-	int      do_spin;
-	atomic_t nr_spinning;
-};
-
-#ifdef CONFIG_SMP
-
-/*
- * Spinning prevents, for example, APs touching grant table entries while
- * the shared grant table is not mapped into the address space imemdiately
- * after resume.
- */
-static void ap_suspend(void *_info)
-{
-	struct ap_suspend_info *info = _info;
-
-	BUG_ON(!irqs_disabled());
-
-	atomic_inc(&info->nr_spinning);
-	mb();
-
-	while (info->do_spin)
-		cpu_relax();
-
-	mb();
-	atomic_dec(&info->nr_spinning);
-}
-
-#define initiate_ap_suspend(i)	smp_call_function(ap_suspend, i, 0, 0)
-
-#else /* !defined(CONFIG_SMP) */
-
-#define initiate_ap_suspend(i)	0
-
-#endif
-
-static int bp_suspend(void)
-{
-	int suspend_cancelled;
-
-	suspend_cancelled = HYPERVISOR_suspend(0);
-	if (!suspend_cancelled)
-		xenpci_resume();
-
-	return suspend_cancelled;
-}
-
 void
 xen_suspend()
 {
 	int suspend_cancelled;
-	//struct ap_suspend_info info;
 
 	if (DEVICE_SUSPEND(root_bus)) {
 		printf("xen_suspend: device_suspend failed\n");
 		return;
 	}
 
+	/*
+	 * Make sure we don't change cpus or switch to some other
+	 * thread. for the duration.
+	 */
 	critical_enter();
 
-	/* Prevent any races with evtchn_interrupt() handler. */
+	/*
+	 * Prevent any races with evtchn_interrupt() handler.
+	 */
 	irq_suspend();
-
-#if 0
-	info.do_spin = 1;
-	atomic_set(&info.nr_spinning, 0);
-	smp_mb();
-
-	nr_cpus = num_online_cpus() - 1;
-
-	err = initiate_ap_suspend(&info);
-	if (err < 0) {
-		critical_exit();
-		//xenbus_suspend_cancel();
-		return err;
-	}
-
-	while (atomic_read(&info.nr_spinning) != nr_cpus)
-		cpu_relax();
-#endif
-
 	disable_intr();
-	suspend_cancelled = bp_suspend();
-	//resume_notifier(suspend_cancelled);
-	enable_intr();
 
-#if 0
-	smp_mb();
-	info.do_spin = 0;
-	while (atomic_read(&info.nr_spinning) != 0)
-		cpu_relax();
-#endif
+	suspend_cancelled = HYPERVISOR_suspend(0);
+	if (!suspend_cancelled)
+		xenpci_resume();
 
+	/*
+	 * Re-enable interrupts and put the scheduler back to normal.
+	 */
+	enable_intr();
 	critical_exit();
 
+	/*
+	 * FreeBSD really needs to add DEVICE_SUSPEND_CANCEL or
+	 * similar.
+	 */
 	if (!suspend_cancelled)
 		DEVICE_RESUME(root_bus);
-#if 0
-	else
-		xenbus_suspend_cancel();
-#endif
 }


More information about the svn-src-user mailing list