diff options
Diffstat (limited to 'drivers/net/xen-netback')
| -rw-r--r-- | drivers/net/xen-netback/netback.c | 25 | ||||
| -rw-r--r-- | drivers/net/xen-netback/xenbus.c | 37 | 
2 files changed, 33 insertions, 29 deletions
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 4de46aa61d95..880d0d63e872 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -44,15 +44,15 @@  #include <xen/xen.h>  #include <xen/events.h>  #include <xen/interface/memory.h> +#include <xen/page.h>  #include <asm/xen/hypercall.h> -#include <asm/xen/page.h>  /* Provide an option to disable split event channels at load time as   * event channels are limited resource. Split event channels are   * enabled by default.   */ -bool separate_tx_rx_irq = 1; +bool separate_tx_rx_irq = true;  module_param(separate_tx_rx_irq, bool, 0644);  /* The time that packets can stay on the guest Rx internal queue @@ -515,14 +515,9 @@ static void xenvif_rx_action(struct xenvif_queue *queue)  	while (xenvif_rx_ring_slots_available(queue, XEN_NETBK_RX_SLOTS_MAX)  	       && (skb = xenvif_rx_dequeue(queue)) != NULL) { -		RING_IDX old_req_cons; -		RING_IDX ring_slots_used; -  		queue->last_rx_time = jiffies; -		old_req_cons = queue->rx.req_cons;  		XENVIF_RX_CB(skb)->meta_slots_used = xenvif_gop_skb(skb, &npo, queue); -		ring_slots_used = queue->rx.req_cons - old_req_cons;  		__skb_queue_tail(&rxq, skb);  	} @@ -753,7 +748,7 @@ static int xenvif_count_requests(struct xenvif_queue *queue,  		slots++;  		if (unlikely((txp->offset + txp->size) > PAGE_SIZE)) { -			netdev_err(queue->vif->dev, "Cross page boundary, txp->offset: %x, size: %u\n", +			netdev_err(queue->vif->dev, "Cross page boundary, txp->offset: %u, size: %u\n",  				 txp->offset, txp->size);  			xenvif_fatal_tx_err(queue->vif);  			return -EINVAL; @@ -879,7 +874,7 @@ static inline void xenvif_grant_handle_set(struct xenvif_queue *queue,  	if (unlikely(queue->grant_tx_handle[pending_idx] !=  		     NETBACK_INVALID_HANDLE)) {  		netdev_err(queue->vif->dev, -			   "Trying to overwrite active handle! pending_idx: %x\n", +			   "Trying to overwrite active handle! pending_idx: 0x%x\n",  			   pending_idx);  		BUG();  	} @@ -892,7 +887,7 @@ static inline void xenvif_grant_handle_reset(struct xenvif_queue *queue,  	if (unlikely(queue->grant_tx_handle[pending_idx] ==  		     NETBACK_INVALID_HANDLE)) {  		netdev_err(queue->vif->dev, -			   "Trying to unmap invalid handle! pending_idx: %x\n", +			   "Trying to unmap invalid handle! pending_idx: 0x%x\n",  			   pending_idx);  		BUG();  	} @@ -1248,9 +1243,9 @@ static void xenvif_tx_build_gops(struct xenvif_queue *queue,  		/* No crossing a page as the payload mustn't fragment. */  		if (unlikely((txreq.offset + txreq.size) > PAGE_SIZE)) {  			netdev_err(queue->vif->dev, -				   "txreq.offset: %x, size: %u, end: %lu\n", +				   "txreq.offset: %u, size: %u, end: %lu\n",  				   txreq.offset, txreq.size, -				   (txreq.offset&~PAGE_MASK) + txreq.size); +				   (unsigned long)(txreq.offset&~PAGE_MASK) + txreq.size);  			xenvif_fatal_tx_err(queue->vif);  			break;  		} @@ -1598,12 +1593,12 @@ static inline void xenvif_tx_dealloc_action(struct xenvif_queue *queue)  					queue->pages_to_unmap,  					gop - queue->tx_unmap_ops);  		if (ret) { -			netdev_err(queue->vif->dev, "Unmap fail: nr_ops %tx ret %d\n", +			netdev_err(queue->vif->dev, "Unmap fail: nr_ops %tu ret %d\n",  				   gop - queue->tx_unmap_ops, ret);  			for (i = 0; i < gop - queue->tx_unmap_ops; ++i) {  				if (gop[i].status != GNTST_okay)  					netdev_err(queue->vif->dev, -						   " host_addr: %llx handle: %x status: %d\n", +						   " host_addr: 0x%llx handle: 0x%x status: %d\n",  						   gop[i].host_addr,  						   gop[i].handle,  						   gop[i].status); @@ -1736,7 +1731,7 @@ void xenvif_idx_unmap(struct xenvif_queue *queue, u16 pending_idx)  				&queue->mmap_pages[pending_idx], 1);  	if (ret) {  		netdev_err(queue->vif->dev, -			   "Unmap fail: ret: %d pending_idx: %d host_addr: %llx handle: %x status: %d\n", +			   "Unmap fail: ret: %d pending_idx: %d host_addr: %llx handle: 0x%x status: %d\n",  			   ret,  			   pending_idx,  			   tx_unmap_op.host_addr, diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c index fee02414529e..ec383b0f5443 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c @@ -34,6 +34,8 @@ struct backend_info {  	enum xenbus_state frontend_state;  	struct xenbus_watch hotplug_status_watch;  	u8 have_hotplug_status_watch:1; + +	const char *hotplug_script;  };  static int connect_rings(struct backend_info *be, struct xenvif_queue *queue); @@ -238,6 +240,7 @@ static int netback_remove(struct xenbus_device *dev)  		xenvif_free(be->vif);  		be->vif = NULL;  	} +	kfree(be->hotplug_script);  	kfree(be);  	dev_set_drvdata(&dev->dev, NULL);  	return 0; @@ -255,6 +258,7 @@ static int netback_probe(struct xenbus_device *dev,  	struct xenbus_transaction xbt;  	int err;  	int sg; +	const char *script;  	struct backend_info *be = kzalloc(sizeof(struct backend_info),  					  GFP_KERNEL);  	if (!be) { @@ -347,6 +351,15 @@ static int netback_probe(struct xenbus_device *dev,  	if (err)  		pr_debug("Error writing multi-queue-max-queues\n"); +	script = xenbus_read(XBT_NIL, dev->nodename, "script", NULL); +	if (IS_ERR(script)) { +		err = PTR_ERR(script); +		xenbus_dev_fatal(dev, err, "reading script"); +		goto fail; +	} + +	be->hotplug_script = script; +  	err = xenbus_switch_state(dev, XenbusStateInitWait);  	if (err)  		goto fail; @@ -379,22 +392,14 @@ static int netback_uevent(struct xenbus_device *xdev,  			  struct kobj_uevent_env *env)  {  	struct backend_info *be = dev_get_drvdata(&xdev->dev); -	char *val; -	val = xenbus_read(XBT_NIL, xdev->nodename, "script", NULL); -	if (IS_ERR(val)) { -		int err = PTR_ERR(val); -		xenbus_dev_fatal(xdev, err, "reading script"); -		return err; -	} else { -		if (add_uevent_var(env, "script=%s", val)) { -			kfree(val); -			return -ENOMEM; -		} -		kfree(val); -	} +	if (!be) +		return 0; -	if (!be || !be->vif) +	if (add_uevent_var(env, "script=%s", be->hotplug_script)) +		return -ENOMEM; + +	if (!be->vif)  		return 0;  	return add_uevent_var(env, "vif=%s", be->vif->dev->name); @@ -676,6 +681,9 @@ static int xen_register_watchers(struct xenbus_device *dev, struct xenvif *vif)  	char *node;  	unsigned maxlen = strlen(dev->nodename) + sizeof("/rate"); +	if (vif->credit_watch.node) +		return -EADDRINUSE; +  	node = kmalloc(maxlen, GFP_KERNEL);  	if (!node)  		return -ENOMEM; @@ -765,6 +773,7 @@ static void connect(struct backend_info *be)  	}  	xen_net_read_rate(dev, &credit_bytes, &credit_usec); +	xen_unregister_watchers(be->vif);  	xen_register_watchers(dev, be->vif);  	read_xenbus_vif_flags(be);  |