[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 03/11] mini-os/xenbus: Add missing locks to xb_write
xb_write was missing any locking against concurrent calls. Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- xen/xenbus/xenbus.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xen/xenbus/xenbus.c b/xen/xenbus/xenbus.c index 0958604..a06dc30 100644 --- a/xen/xenbus/xenbus.c +++ b/xen/xenbus/xenbus.c @@ -45,6 +45,7 @@ static struct xenstore_domain_interface *xenstore_buf; static DECLARE_WAIT_QUEUE_HEAD(xb_waitq); +static spinlock_t xb_lock = SPIN_LOCK_UNLOCKED; /* protects xenbus req ring */ DECLARE_WAIT_QUEUE_HEAD(xenbus_watch_queue); xenbus_event_queue xenbus_events; @@ -372,6 +373,8 @@ static void xb_write(int type, int req_id, xenbus_transaction_t trans_id, cur_req = &header_req; BUG_ON(len > XENSTORE_RING_SIZE); + + spin_lock(&xb_lock); /* Wait for the ring to drain to the point where we can send the message. */ prod = xenstore_buf->req_prod; @@ -380,9 +383,11 @@ static void xb_write(int type, int req_id, xenbus_transaction_t trans_id, /* Wait for there to be space on the ring */ DEBUG("prod %d, len %d, cons %d, size %d; waiting.\n", prod, len, xenstore_buf->req_cons, XENSTORE_RING_SIZE); + spin_unlock(&xb_lock); wait_event(xb_waitq, xenstore_buf->req_prod + len - xenstore_buf->req_cons <= XENSTORE_RING_SIZE); + spin_lock(&xb_lock); DEBUG("Back from wait.\n"); prod = xenstore_buf->req_prod; } @@ -419,6 +424,7 @@ static void xb_write(int type, int req_id, xenbus_transaction_t trans_id, wmb(); xenstore_buf->req_prod += len; + spin_unlock(&xb_lock); /* Send evtchn to notify remote */ notify_remote_via_evtchn(start_info.store_evtchn); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |