svn commit: r192005 - projects/releng_7_xen/sys/dev/xen/console

Kip Macy kmacy at FreeBSD.org
Tue May 12 01:00:30 UTC 2009


Author: kmacy
Date: Tue May 12 01:00:30 2009
New Revision: 192005
URL: http://svn.freebsd.org/changeset/base/192005

Log:
  convert xen console lock to a spin lock to handle case of being called from interrupt context

Modified:
  projects/releng_7_xen/sys/dev/xen/console/console.c
  projects/releng_7_xen/sys/dev/xen/console/xencons_ring.c
  projects/releng_7_xen/sys/dev/xen/console/xencons_ring.h

Modified: projects/releng_7_xen/sys/dev/xen/console/console.c
==============================================================================
--- projects/releng_7_xen/sys/dev/xen/console/console.c	Mon May 11 23:03:15 2009	(r192004)
+++ projects/releng_7_xen/sys/dev/xen/console/console.c	Tue May 12 01:00:30 2009	(r192005)
@@ -77,18 +77,8 @@ static unsigned int wc, wp; /* write_con
 #define	XCUNIT(x)	(minor(x))
 #define ISTTYOPEN(tp)	((tp) && ((tp)->t_state & TS_ISOPEN))
 #define CN_LOCK_INIT(x, _name) \
-        mtx_init(&x, _name, NULL, MTX_DEF|MTX_RECURSE)
+        mtx_init(&x, _name, NULL, MTX_SPIN|MTX_RECURSE)
 
-#define CN_LOCK(l)        								\
-		do {											\
-				if (panicstr == NULL)					\
-                        mtx_lock(&(l));			\
-		} while (0)
-#define CN_UNLOCK(l)        							\
-		do {											\
-				if (panicstr == NULL)					\
-                        mtx_unlock(&(l));			\
-		} while (0)
 #define CN_LOCK_ASSERT(x)    mtx_assert(&x, MA_OWNED)
 #define CN_LOCK_DESTROY(x)   mtx_destroy(&x)
 

Modified: projects/releng_7_xen/sys/dev/xen/console/xencons_ring.c
==============================================================================
--- projects/releng_7_xen/sys/dev/xen/console/xencons_ring.c	Mon May 11 23:03:15 2009	(r192004)
+++ projects/releng_7_xen/sys/dev/xen/console/xencons_ring.c	Tue May 12 01:00:30 2009	(r192005)
@@ -83,25 +83,27 @@ xencons_handle_input(void *unused)
 	struct xencons_interface *intf;
 	XENCONS_RING_IDX cons, prod;
 
-	mtx_lock(&cn_mtx);
+	CN_LOCK(cn_mtx);
 	intf = xencons_interface();
 
 	cons = intf->in_cons;
 	prod = intf->in_prod;
-
+	CN_UNLOCK(cn_mtx);
+	
 	/* XXX needs locking */
 	while (cons != prod) {
 		xencons_rx(intf->in + MASK_XENCONS_IDX(cons, intf->in), 1);
 		cons++;
 	}
 
+	CN_LOCK(cn_mtx);
 	mb();
 	intf->in_cons = cons;
 
 	notify_remote_via_evtchn(xen_start_info->console_evtchn);
 
 	xencons_tx();
-	mtx_unlock(&cn_mtx);
+	CN_UNLOCK(cn_mtx);
 }
 
 void 

Modified: projects/releng_7_xen/sys/dev/xen/console/xencons_ring.h
==============================================================================
--- projects/releng_7_xen/sys/dev/xen/console/xencons_ring.h	Mon May 11 23:03:15 2009	(r192004)
+++ projects/releng_7_xen/sys/dev/xen/console/xencons_ring.h	Tue May 12 01:00:30 2009	(r192005)
@@ -5,6 +5,18 @@
 #ifndef _XENCONS_RING_H
 #define _XENCONS_RING_H
 
+#define CN_LOCK(l)        								\
+		do {											\
+				if (panicstr == NULL)					\
+                        mtx_lock_spin(&(l));			\
+		} while (0)
+#define CN_UNLOCK(l)        							\
+		do {											\
+				if (panicstr == NULL)					\
+                        mtx_unlock_spin(&(l));			\
+		} while (0)
+
+
 int xencons_ring_init(void);
 int xencons_ring_send(const char *data, unsigned len);
 void xencons_rx(char *buf, unsigned len);


More information about the svn-src-projects mailing list