From owner-svn-src-projects@FreeBSD.ORG Sun Dec 28 07:09:00 2008 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7FA721065674; Sun, 28 Dec 2008 07:09:00 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 6F0988FC16; Sun, 28 Dec 2008 07:09:00 +0000 (UTC) (envelope-from kmacy@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mBS790qd006114; Sun, 28 Dec 2008 07:09:00 GMT (envelope-from kmacy@svn.freebsd.org) Received: (from kmacy@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mBS790VL006111; Sun, 28 Dec 2008 07:09:00 GMT (envelope-from kmacy@svn.freebsd.org) Message-Id: <200812280709.mBS790VL006111@svn.freebsd.org> From: Kip Macy Date: Sun, 28 Dec 2008 07:09:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r186538 - projects/releng_7_xen/sys/xen/xenbus X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 28 Dec 2008 07:09:00 -0000 Author: kmacy Date: Sun Dec 28 07:09:00 2008 New Revision: 186538 URL: http://svn.freebsd.org/changeset/base/186538 Log: - remove code for handling case of not being able to sleep - eliminate tsleep - make sleeps atomic Modified: projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.c projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.h projects/releng_7_xen/sys/xen/xenbus/xenbus_xs.c Modified: projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.c ============================================================================== --- projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.c Sun Dec 28 07:06:20 2008 (r186537) +++ projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.c Sun Dec 28 07:09:00 2008 (r186538) @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -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_7_xen/sys/xen/xenbus/xenbus_comms.h ============================================================================== --- projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.h Sun Dec 28 07:06:20 2008 (r186537) +++ projects/releng_7_xen/sys/xen/xenbus/xenbus_comms.h Sun Dec 28 07:09:00 2008 (r186538) @@ -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_7_xen/sys/xen/xenbus/xenbus_xs.c ============================================================================== --- projects/releng_7_xen/sys/xen/xenbus/xenbus_xs.c Sun Dec 28 07:06:20 2008 (r186537) +++ projects/releng_7_xen/sys/xen/xenbus/xenbus_xs.c Sun Dec 28 07:09:00 2008 (r186538) @@ -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.lock_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.lock_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);