diff options
| author | Juergen Gross <jgross@suse.com> | 2016-09-22 11:06:25 +0200 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2016-09-22 08:26:24 -0400 | 
| commit | 0364a8824c020f12e2d5e9fad963685b58f7574e (patch) | |
| tree | 42bc8abc5f8c7e1b243bed56bf309ff55ebbe144 /drivers/net/xen-netback/interface.c | |
| parent | f6f7d9c03f5daae04449ad19de5e2f0c20c5eaac (diff) | |
| download | blackbird-op-linux-0364a8824c020f12e2d5e9fad963685b58f7574e.tar.gz blackbird-op-linux-0364a8824c020f12e2d5e9fad963685b58f7574e.zip | |
xen-netback: switch to threaded irq for control ring
Instead of open coding it use the threaded irq mechanism in
xen-netback.
Signed-off-by: Juergen Gross <jgross@suse.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/xen-netback/interface.c')
| -rw-r--r-- | drivers/net/xen-netback/interface.c | 38 | 
1 files changed, 6 insertions, 32 deletions
| diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 83deeebfc2d1..fb50c6d5f6c3 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -128,15 +128,6 @@ irqreturn_t xenvif_interrupt(int irq, void *dev_id)  	return IRQ_HANDLED;  } -irqreturn_t xenvif_ctrl_interrupt(int irq, void *dev_id) -{ -	struct xenvif *vif = dev_id; - -	wake_up(&vif->ctrl_wq); - -	return IRQ_HANDLED; -} -  int xenvif_queue_stopped(struct xenvif_queue *queue)  {  	struct net_device *dev = queue->vif->dev; @@ -570,8 +561,7 @@ int xenvif_connect_ctrl(struct xenvif *vif, grant_ref_t ring_ref,  	struct net_device *dev = vif->dev;  	void *addr;  	struct xen_netif_ctrl_sring *shared; -	struct task_struct *task; -	int err = -ENOMEM; +	int err;  	err = xenbus_map_ring_valloc(xenvif_to_xenbus_device(vif),  				     &ring_ref, 1, &addr); @@ -581,11 +571,7 @@ int xenvif_connect_ctrl(struct xenvif *vif, grant_ref_t ring_ref,  	shared = (struct xen_netif_ctrl_sring *)addr;  	BACK_RING_INIT(&vif->ctrl, shared, XEN_PAGE_SIZE); -	init_waitqueue_head(&vif->ctrl_wq); - -	err = bind_interdomain_evtchn_to_irqhandler(vif->domid, evtchn, -						    xenvif_ctrl_interrupt, -						    0, dev->name, vif); +	err = bind_interdomain_evtchn_to_irq(vif->domid, evtchn);  	if (err < 0)  		goto err_unmap; @@ -593,19 +579,13 @@ int xenvif_connect_ctrl(struct xenvif *vif, grant_ref_t ring_ref,  	xenvif_init_hash(vif); -	task = kthread_create(xenvif_ctrl_kthread, (void *)vif, -			      "%s-control", dev->name); -	if (IS_ERR(task)) { -		pr_warn("Could not allocate kthread for %s\n", dev->name); -		err = PTR_ERR(task); +	err = request_threaded_irq(vif->ctrl_irq, NULL, xenvif_ctrl_irq_fn, +				   IRQF_ONESHOT, "xen-netback-ctrl", vif); +	if (err) { +		pr_warn("Could not setup irq handler for %s\n", dev->name);  		goto err_deinit;  	} -	get_task_struct(task); -	vif->ctrl_task = task; - -	wake_up_process(vif->ctrl_task); -  	return 0;  err_deinit: @@ -774,12 +754,6 @@ void xenvif_disconnect_data(struct xenvif *vif)  void xenvif_disconnect_ctrl(struct xenvif *vif)  { -	if (vif->ctrl_task) { -		kthread_stop(vif->ctrl_task); -		put_task_struct(vif->ctrl_task); -		vif->ctrl_task = NULL; -	} -  	if (vif->ctrl_irq) {  		xenvif_deinit_hash(vif);  		unbind_from_irqhandler(vif->ctrl_irq, vif); | 

