aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/xen-netback/interface.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2014-01-05 06:34:29 -0500
committerIngo Molnar <mingo@kernel.org>2014-01-05 06:34:29 -0500
commitef0b8b9a521c65201bfca9747ee1bf374296133c (patch)
tree644c3390c07d06fb7807182a4935f7c3f675b157 /drivers/net/xen-netback/interface.c
parent5c12af0c41e3417e1939095325920463b5f8e726 (diff)
parentd6e0a2dd12f4067a5bcefb8bbd8ddbeff800afbc (diff)
Merge tag 'v3.13-rc7' into x86/efi-kexec to resolve conflicts
Conflicts: arch/x86/platform/efi/efi.c drivers/firmware/efi/Kconfig Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/net/xen-netback/interface.c')
-rw-r--r--drivers/net/xen-netback/interface.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
index 2329cccf1fa6..34ca4e58a43d 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -307,6 +307,15 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
307 SET_NETDEV_DEV(dev, parent); 307 SET_NETDEV_DEV(dev, parent);
308 308
309 vif = netdev_priv(dev); 309 vif = netdev_priv(dev);
310
311 vif->grant_copy_op = vmalloc(sizeof(struct gnttab_copy) *
312 MAX_GRANT_COPY_OPS);
313 if (vif->grant_copy_op == NULL) {
314 pr_warn("Could not allocate grant copy space for %s\n", name);
315 free_netdev(dev);
316 return ERR_PTR(-ENOMEM);
317 }
318
310 vif->domid = domid; 319 vif->domid = domid;
311 vif->handle = handle; 320 vif->handle = handle;
312 vif->can_sg = 1; 321 vif->can_sg = 1;
@@ -368,11 +377,11 @@ int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref,
368 unsigned long rx_ring_ref, unsigned int tx_evtchn, 377 unsigned long rx_ring_ref, unsigned int tx_evtchn,
369 unsigned int rx_evtchn) 378 unsigned int rx_evtchn)
370{ 379{
380 struct task_struct *task;
371 int err = -ENOMEM; 381 int err = -ENOMEM;
372 382
373 /* Already connected through? */ 383 BUG_ON(vif->tx_irq);
374 if (vif->tx_irq) 384 BUG_ON(vif->task);
375 return 0;
376 385
377 err = xenvif_map_frontend_rings(vif, tx_ring_ref, rx_ring_ref); 386 err = xenvif_map_frontend_rings(vif, tx_ring_ref, rx_ring_ref);
378 if (err < 0) 387 if (err < 0)
@@ -411,14 +420,16 @@ int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref,
411 } 420 }
412 421
413 init_waitqueue_head(&vif->wq); 422 init_waitqueue_head(&vif->wq);
414 vif->task = kthread_create(xenvif_kthread, 423 task = kthread_create(xenvif_kthread,
415 (void *)vif, "%s", vif->dev->name); 424 (void *)vif, "%s", vif->dev->name);
416 if (IS_ERR(vif->task)) { 425 if (IS_ERR(task)) {
417 pr_warn("Could not allocate kthread for %s\n", vif->dev->name); 426 pr_warn("Could not allocate kthread for %s\n", vif->dev->name);
418 err = PTR_ERR(vif->task); 427 err = PTR_ERR(task);
419 goto err_rx_unbind; 428 goto err_rx_unbind;
420 } 429 }
421 430
431 vif->task = task;
432
422 rtnl_lock(); 433 rtnl_lock();
423 if (!vif->can_sg && vif->dev->mtu > ETH_DATA_LEN) 434 if (!vif->can_sg && vif->dev->mtu > ETH_DATA_LEN)
424 dev_set_mtu(vif->dev, ETH_DATA_LEN); 435 dev_set_mtu(vif->dev, ETH_DATA_LEN);
@@ -461,8 +472,10 @@ void xenvif_disconnect(struct xenvif *vif)
461 if (netif_carrier_ok(vif->dev)) 472 if (netif_carrier_ok(vif->dev))
462 xenvif_carrier_off(vif); 473 xenvif_carrier_off(vif);
463 474
464 if (vif->task) 475 if (vif->task) {
465 kthread_stop(vif->task); 476 kthread_stop(vif->task);
477 vif->task = NULL;
478 }
466 479
467 if (vif->tx_irq) { 480 if (vif->tx_irq) {
468 if (vif->tx_irq == vif->rx_irq) 481 if (vif->tx_irq == vif->rx_irq)
@@ -483,6 +496,7 @@ void xenvif_free(struct xenvif *vif)
483 496
484 unregister_netdev(vif->dev); 497 unregister_netdev(vif->dev);
485 498
499 vfree(vif->grant_copy_op);
486 free_netdev(vif->dev); 500 free_netdev(vif->dev);
487 501
488 module_put(THIS_MODULE); 502 module_put(THIS_MODULE);