diff options
Diffstat (limited to 'drivers/xen')
| -rw-r--r-- | drivers/xen/xen-pciback/pciback.h | 2 | ||||
| -rw-r--r-- | drivers/xen/xenbus/xenbus_comms.c | 4 | ||||
| -rw-r--r-- | drivers/xen/xenbus/xenbus_probe.c | 10 | ||||
| -rw-r--r-- | drivers/xen/xenbus/xenbus_probe_backend.c | 5 | ||||
| -rw-r--r-- | drivers/xen/xenbus/xenbus_xs.c | 9 | 
5 files changed, 19 insertions, 11 deletions
| diff --git a/drivers/xen/xen-pciback/pciback.h b/drivers/xen/xen-pciback/pciback.h index ce1077e32466..7c95516a860f 100644 --- a/drivers/xen/xen-pciback/pciback.h +++ b/drivers/xen/xen-pciback/pciback.h @@ -52,7 +52,7 @@ struct xen_pcibk_dev_data {  	unsigned int ack_intr:1; /* .. and ACK-ing */  	unsigned long handled;  	unsigned int irq; /* Saved in case device transitions to MSI/MSI-X */ -	char irq_name[0]; /* xen-pcibk[000:04:00.0] */ +	char irq_name[]; /* xen-pcibk[000:04:00.0] */  };  /* Used by XenBus and xen_pcibk_ops.c */ diff --git a/drivers/xen/xenbus/xenbus_comms.c b/drivers/xen/xenbus/xenbus_comms.c index d239fc3c5e3d..eb5151fc8efa 100644 --- a/drivers/xen/xenbus/xenbus_comms.c +++ b/drivers/xen/xenbus/xenbus_comms.c @@ -313,6 +313,8 @@ static int process_msg(void)  			req->msg.type = state.msg.type;  			req->msg.len = state.msg.len;  			req->body = state.body; +			/* write body, then update state */ +			virt_wmb();  			req->state = xb_req_state_got_reply;  			req->cb(req);  		} else @@ -395,6 +397,8 @@ static int process_writes(void)  	if (state.req->state == xb_req_state_aborted)  		kfree(state.req);  	else { +		/* write err, then update state */ +		virt_wmb();  		state.req->state = xb_req_state_got_reply;  		wake_up(&state.req->wq);  	} diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c index 66975da4f3b6..8c4d05b687b7 100644 --- a/drivers/xen/xenbus/xenbus_probe.c +++ b/drivers/xen/xenbus/xenbus_probe.c @@ -239,9 +239,9 @@ int xenbus_dev_probe(struct device *_dev)  		goto fail;  	} -	spin_lock(&dev->reclaim_lock); +	down(&dev->reclaim_sem);  	err = drv->probe(dev, id); -	spin_unlock(&dev->reclaim_lock); +	up(&dev->reclaim_sem);  	if (err)  		goto fail_put; @@ -271,9 +271,9 @@ int xenbus_dev_remove(struct device *_dev)  	free_otherend_watch(dev);  	if (drv->remove) { -		spin_lock(&dev->reclaim_lock); +		down(&dev->reclaim_sem);  		drv->remove(dev); -		spin_unlock(&dev->reclaim_lock); +		up(&dev->reclaim_sem);  	}  	module_put(drv->driver.owner); @@ -473,7 +473,7 @@ int xenbus_probe_node(struct xen_bus_type *bus,  		goto fail;  	dev_set_name(&xendev->dev, "%s", devname); -	spin_lock_init(&xendev->reclaim_lock); +	sema_init(&xendev->reclaim_sem, 1);  	/* Register with generic device framework. */  	err = device_register(&xendev->dev); diff --git a/drivers/xen/xenbus/xenbus_probe_backend.c b/drivers/xen/xenbus/xenbus_probe_backend.c index 791f6fe01e91..9b2fbe69bccc 100644 --- a/drivers/xen/xenbus/xenbus_probe_backend.c +++ b/drivers/xen/xenbus/xenbus_probe_backend.c @@ -45,6 +45,7 @@  #include <linux/mm.h>  #include <linux/notifier.h>  #include <linux/export.h> +#include <linux/semaphore.h>  #include <asm/page.h>  #include <asm/pgtable.h> @@ -257,10 +258,10 @@ static int backend_reclaim_memory(struct device *dev, void *data)  	drv = to_xenbus_driver(dev->driver);  	if (drv && drv->reclaim_memory) {  		xdev = to_xenbus_device(dev); -		if (!spin_trylock(&xdev->reclaim_lock)) +		if (down_trylock(&xdev->reclaim_sem))  			return 0;  		drv->reclaim_memory(xdev); -		spin_unlock(&xdev->reclaim_lock); +		up(&xdev->reclaim_sem);  	}  	return 0;  } diff --git a/drivers/xen/xenbus/xenbus_xs.c b/drivers/xen/xenbus/xenbus_xs.c index ddc18da61834..3a06eb699f33 100644 --- a/drivers/xen/xenbus/xenbus_xs.c +++ b/drivers/xen/xenbus/xenbus_xs.c @@ -191,8 +191,11 @@ static bool xenbus_ok(void)  static bool test_reply(struct xb_req_data *req)  { -	if (req->state == xb_req_state_got_reply || !xenbus_ok()) +	if (req->state == xb_req_state_got_reply || !xenbus_ok()) { +		/* read req->state before all other fields */ +		virt_rmb();  		return true; +	}  	/* Make sure to reread req->state each time. */  	barrier(); @@ -202,7 +205,7 @@ static bool test_reply(struct xb_req_data *req)  static void *read_reply(struct xb_req_data *req)  { -	while (req->state != xb_req_state_got_reply) { +	do {  		wait_event(req->wq, test_reply(req));  		if (!xenbus_ok()) @@ -216,7 +219,7 @@ static void *read_reply(struct xb_req_data *req)  		if (req->err)  			return ERR_PTR(req->err); -	} +	} while (req->state != xb_req_state_got_reply);  	return req->body;  } |