svn commit: r186554 - in projects/releng_6_xen/sys/xen: evtchn xenbus

Kip Macy kmacy at FreeBSD.org
Sun Dec 28 17:40:10 PST 2008


Author: kmacy
Date: Mon Dec 29 01:40:09 2008
New Revision: 186554
URL: http://svn.freebsd.org/changeset/base/186554

Log:
  merge 186537 and 186538 from releng_7_xen
  
  Log:
   unmask evtchn in bind_{virq, ipi}_to_irq
  Log:
   - remove code for handling case of not being able to sleep
   - eliminate tsleep - make sleeps atomic

Modified:
  projects/releng_6_xen/sys/xen/evtchn/evtchn.c
  projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.c
  projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.h
  projects/releng_6_xen/sys/xen/xenbus/xenbus_xs.c

Modified: projects/releng_6_xen/sys/xen/evtchn/evtchn.c
==============================================================================
--- projects/releng_6_xen/sys/xen/evtchn/evtchn.c	Mon Dec 29 01:35:56 2008	(r186553)
+++ projects/releng_6_xen/sys/xen/evtchn/evtchn.c	Mon Dec 29 01:40:09 2008	(r186554)
@@ -366,7 +366,7 @@ static int 
 bind_virq_to_irq(unsigned int virq, unsigned int cpu)
 {
 	struct evtchn_bind_virq bind_virq;
-	int evtchn, irq;
+	int evtchn = 0, irq;
 
 	mtx_lock_spin(&irq_mapping_update_lock);
 
@@ -390,6 +390,7 @@ bind_virq_to_irq(unsigned int virq, unsi
 	}
 
 	irq_bindcount[irq]++;
+	unmask_evtchn(evtchn);
 out:
 	mtx_unlock_spin(&irq_mapping_update_lock);
 
@@ -403,8 +404,9 @@ int 
 bind_ipi_to_irq(unsigned int ipi, unsigned int cpu)
 {
 	struct evtchn_bind_ipi bind_ipi;
-	int evtchn, irq;
-	
+	int irq;
+	int evtchn = 0;
+
 	mtx_lock_spin(&irq_mapping_update_lock);
 	
 	if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) {
@@ -423,6 +425,7 @@ bind_ipi_to_irq(unsigned int ipi, unsign
 		bind_evtchn_to_cpu(evtchn, cpu);
 	}
 	irq_bindcount[irq]++;
+	unmask_evtchn(evtchn);
 out:
 	
 	mtx_unlock_spin(&irq_mapping_update_lock);

Modified: projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.c
==============================================================================
--- projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.c	Mon Dec 29 01:35:56 2008	(r186553)
+++ projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.c	Mon Dec 29 01:40:09 2008	(r186554)
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/lock.h>
 #include <sys/mutex.h>
+#include <sys/sx.h>
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/syslog.h>
@@ -94,7 +95,7 @@ xb_get_input_chunk(XENSTORE_RING_IDX con
 }
 
 int
-xb_write(const void *tdata, unsigned len)
+xb_write(const void *tdata, unsigned len, struct lock_object *lock)
 {
 	struct xenstore_domain_interface *intf = xenstore_domain_interface();
 	XENSTORE_RING_IDX cons, prod;
@@ -107,7 +108,9 @@ xb_write(const void *tdata, unsigned len
 
 		while ((intf->req_prod - intf->req_cons)
 		    == XENSTORE_RING_SIZE) {
-			error = tsleep(intf, PCATCH, "xbwrite", hz/10);
+			error = _sleep(intf,
+			    lock,
+			    PCATCH, "xbwrite", hz/10);
 			if (error && error != EWOULDBLOCK)
 				return (error);
 		}
@@ -144,7 +147,7 @@ xb_write(const void *tdata, unsigned len
 }
 
 int
-xb_read(void *tdata, unsigned len)
+xb_read(void *tdata, unsigned len, struct lock_object *lock)
 {
 	struct xenstore_domain_interface *intf = xenstore_domain_interface();
 	XENSTORE_RING_IDX cons, prod;
@@ -156,7 +159,8 @@ xb_read(void *tdata, unsigned len)
 		const char *src;
 
 		while (intf->rsp_cons == intf->rsp_prod) {
-			error = tsleep(intf, PCATCH, "xbread", hz/10);
+			error = _sleep(intf, lock,
+			    PCATCH, "xbread", hz/10);
 			if (error && error != EWOULDBLOCK)
 				return (error);
 		}

Modified: projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.h
==============================================================================
--- projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.h	Mon Dec 29 01:35:56 2008	(r186553)
+++ projects/releng_6_xen/sys/xen/xenbus/xenbus_comms.h	Mon Dec 29 01:40:09 2008	(r186554)
@@ -30,6 +30,7 @@
 #ifndef _XENBUS_COMMS_H
 #define _XENBUS_COMMS_H
 
+struct sx;
 extern int xen_store_evtchn;
 extern char *xen_store;
 
@@ -37,8 +38,8 @@ int xs_init(void);
 int xb_init_comms(void);
 
 /* Low level routines. */
-int xb_write(const void *data, unsigned len);
-int xb_read(void *data, unsigned len);
+int xb_write(const void *data, unsigned len, struct lock_object *);
+int xb_read(void *data, unsigned len, struct lock_object *);
 extern int xenbus_running;
 
 char *kasprintf(const char *fmt, ...);

Modified: projects/releng_6_xen/sys/xen/xenbus/xenbus_xs.c
==============================================================================
--- projects/releng_6_xen/sys/xen/xenbus/xenbus_xs.c	Mon Dec 29 01:35:56 2008	(r186553)
+++ projects/releng_6_xen/sys/xen/xenbus/xenbus_xs.c	Mon Dec 29 01:40:09 2008	(r186554)
@@ -137,33 +137,11 @@ xs_read_reply(enum xsd_sockmsg_type *typ
 {
 	struct xs_stored_msg *msg;
 	char *body;
-	int i, error;
-
-	if (xenbus_running == 0) {
-		/*
-		 * Give other domain time to run :-/
-		 */
-		for (i = 0; i < 1000000 && (xenbus_running == 0); i++) {
-			error = xs_process_msg(type);
-						
-			if (error == 0 && *type != XS_WATCH_EVENT)
-				break;
-							 
-			HYPERVISOR_yield();
-		}
-				
-		if (TAILQ_EMPTY(&xs_state.reply_list)) {
-			printf("giving up and returning an error type=%d\n",
-			    *type);
-			kdb_backtrace();
-			return (EIO);
-		}
-				
-	}
+	int error;
 
 	mtx_lock(&xs_state.reply_lock);
-	if (xenbus_running) {
-		while (TAILQ_EMPTY(&xs_state.reply_list)) {
+
+	while (TAILQ_EMPTY(&xs_state.reply_list)) {
 			while (TAILQ_EMPTY(&xs_state.reply_list)) {
 				error = mtx_sleep(&xs_state.reply_waitq,
 				    &xs_state.reply_lock,
@@ -177,7 +155,7 @@ xs_read_reply(enum xsd_sockmsg_type *typ
 				
 			
 		}
-	}
+
 		
 	msg = TAILQ_FIRST(&xs_state.reply_list);
 	TAILQ_REMOVE(&xs_state.reply_list, msg, list);
@@ -224,7 +202,7 @@ xenbus_dev_request_and_reply(struct xsd_
 
 	sx_xlock(&xs_state.request_mutex);
 
-	error = xb_write(msg, sizeof(*msg) + msg->len);
+	error = xb_write(msg, sizeof(*msg) + msg->len, &xs_state.request_mutex.lock_object);
 	if (error) {
 		msg->type = XS_ERROR;
 	} else {
@@ -241,8 +219,6 @@ xenbus_dev_request_and_reply(struct xsd_
 	return (error);
 }
 
-static int xenwatch_inline;
-
 /*
  * Send message to xs. The reply is returned in *result and should be
  * fred with free(*result, M_DEVBUF). Return zero on success or an
@@ -267,7 +243,7 @@ xs_talkv(struct xenbus_transaction t, en
 
 	sx_xlock(&xs_state.request_mutex);
 
-	error = xb_write(&msg, sizeof(msg));
+	error = xb_write(&msg, sizeof(msg), &xs_state.request_mutex.lock_object);
 	if (error) {
 		sx_xunlock(&xs_state.request_mutex);
 		printf("xs_talkv failed %d\n", error);
@@ -275,7 +251,7 @@ xs_talkv(struct xenbus_transaction t, en
 	}
 
 	for (i = 0; i < num_vecs; i++) {
-		error = xb_write(iovec[i].iov_base, iovec[i].iov_len);;
+		error = xb_write(iovec[i].iov_base, iovec[i].iov_len, &xs_state.request_mutex.lock_object);
 		if (error) {		
 			sx_xunlock(&xs_state.request_mutex);
 			printf("xs_talkv failed %d\n", error);
@@ -776,18 +752,15 @@ xenwatch_thread(void *unused)
 {
 	struct xs_stored_msg *msg;
 
-	DELAY(100000);
-	while (xenwatch_inline) {
-		printf("xenwatch inline still running\n");
-		DELAY(100000);
-	}
-		
 	for (;;) {
 
+		mtx_lock(&watch_events_lock);
 		while (TAILQ_EMPTY(&watch_events))
-			tsleep(&watch_events_waitq,
+			mtx_sleep(&watch_events_waitq,
+			    &watch_events_lock,
 			    PWAIT | PCATCH, "waitev", hz/10);
-				
+
+		mtx_unlock(&watch_events_lock);
 		sx_xlock(&xenwatch_mutex);
 
 		mtx_lock(&watch_events_lock);
@@ -817,16 +790,18 @@ xs_process_msg(enum xsd_sockmsg_type *ty
 	int error;
 		
 	msg = malloc(sizeof(*msg), M_DEVBUF, M_WAITOK);
-		
-	error = xb_read(&msg->hdr, sizeof(msg->hdr));
+	mtx_lock(&xs_state.reply_lock);
+	error = xb_read(&msg->hdr, sizeof(msg->hdr), &xs_state.reply_lock.mtx_object);
+	mtx_unlock(&xs_state.reply_lock);
 	if (error) {
 		free(msg, M_DEVBUF);
 		return (error);
 	}
 
 	body = malloc(msg->hdr.len + 1, M_DEVBUF, M_WAITOK);
-		
-	error = xb_read(body, msg->hdr.len);
+	mtx_lock(&xs_state.reply_lock);
+	error = xb_read(body, msg->hdr.len, &xs_state.reply_lock.mtx_object); 
+	mtx_unlock(&xs_state.reply_lock);
 	if (error) {
 		free(body, M_DEVBUF);
 		free(msg, M_DEVBUF);
@@ -869,9 +844,7 @@ xenbus_thread(void *unused)
 	int error;
 	enum xsd_sockmsg_type type;
 
-	DELAY(10000);
 	xenbus_running = 1;
-	tsleep(&lbolt, 0, "xenbus", hz/10);
 
 	for (;;) {
 		error = xs_process_msg(&type);


More information about the svn-src-projects mailing list