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