[PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

STALE8526d

14 messages, 3 authors, 2003-06-09 · open the first message on its own page

[PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: Stephen Hemminger <hidden>
Date: 2003-06-06 21:58:35

This is the first phase of a sequence of patches to resolve network
device reference count issues exposed by the new sysfs interface.

Phase I:  introduces release_netdev which is the hook to allow later
   changes to hold onto the net device after the device has potentially
   unloaded.  Includes patch for the easy to fix devices. 

Phase II: fixes devices that encapsulate network device structure
   inside their own structure, or allocate private data in a way
   that will break later.

Phase III: changes release_netdev to handle the case of delayed freeing
   of the network device, and appropriate state checking.


diff -Nru a/include/linux/netdevice.h b/include/linux/netdevice.h
--- a/include/linux/netdevice.h	Thu Jun  5 14:44:28 2003
+++ b/include/linux/netdevice.h	Thu Jun  5 14:44:28 2003
@@ -491,6 +491,7 @@
 extern int		dev_queue_xmit(struct sk_buff *skb);
 extern int		register_netdevice(struct net_device *dev);
 extern int		unregister_netdevice(struct net_device *dev);
+extern void		release_netdev(struct net_device *dev);
 extern void		synchronize_net(void);
 extern int 		register_netdevice_notifier(struct notifier_block *nb);
 extern int		unregister_netdevice_notifier(struct notifier_block *nb);
diff -Nru a/net/core/dev.c b/net/core/dev.c
--- a/net/core/dev.c	Thu Jun  5 14:44:28 2003
+++ b/net/core/dev.c	Thu Jun  5 14:44:28 2003
@@ -2768,6 +2768,21 @@
 	}
 }
 
+
+/**
+ *	release_netdev - free network device
+ *	@dev: device
+ *
+ *	This function does the last stage of destroying an allocated device 
+ * 	interface. Currently, it just frees the device.
+ *
+ */
+
+void release_netdev(struct net_device *dev)
+{
+	kfree(dev);
+}
+
 /* Synchronize with packet receive processing. */
 void synchronize_net(void) 
 {
diff -Nru a/net/netsyms.c b/net/netsyms.c
--- a/net/netsyms.c	Thu Jun  5 14:44:28 2003
+++ b/net/netsyms.c	Thu Jun  5 14:44:28 2003
@@ -558,6 +558,7 @@
 EXPORT_SYMBOL(loopback_dev);
 EXPORT_SYMBOL(register_netdevice);
 EXPORT_SYMBOL(unregister_netdevice);
+EXPORT_SYMBOL(release_netdev);
 EXPORT_SYMBOL(synchronize_net);
 EXPORT_SYMBOL(netdev_state_change);
 EXPORT_SYMBOL(dev_new_index);

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: Stephen Hemminger <hidden>
Date: 2003-06-06 23:07:39

Here is a patch to convert the "easy" drivers to use release_netdev, instead of directly
freeing the net_device.  They all compile but only e100 and e1000 have been tested with
real hardware.

diff -Nru a/drivers/net/3c59x.c b/drivers/net/3c59x.c
--- a/drivers/net/3c59x.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/3c59x.c	Thu Jun  5 15:51:50 2003
@@ -1021,7 +1021,7 @@
 	outw (TotalReset|0x14, ioaddr + EL3_CMD);
 	release_region (ioaddr, VORTEX_TOTAL_SIZE);
 
-	kfree (dev);
+	release_netdev (dev);
 	return 0;
 }
 #endif
@@ -3072,7 +3072,7 @@
 						vp->rx_ring_dma);
 	if (vp->must_free_region)
 		release_region(dev->base_addr, vp->io_size);
-	kfree(dev);
+	release_netdev(dev);
 }
 
 
diff -Nru a/drivers/net/8139cp.c b/drivers/net/8139cp.c
--- a/drivers/net/8139cp.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/8139cp.c	Thu Jun  5 15:51:50 2003
@@ -1969,7 +1969,7 @@
 	pci_release_regions(pdev);
 	pci_disable_device(pdev);
 	pci_set_drvdata(pdev, NULL);
-	kfree(dev);
+	release_netdev(dev);
 }
 
 #ifdef CONFIG_PM
diff -Nru a/drivers/net/8139too.c b/drivers/net/8139too.c
--- a/drivers/net/8139too.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/8139too.c	Thu Jun  5 15:51:50 2003
@@ -721,7 +721,7 @@
 		sizeof (struct rtl8139_private));
 #endif /* RTL8139_NDEBUG */
 
-	kfree (dev);
+	release_netdev (dev);
 
 	pci_set_drvdata (pdev, NULL);
 }
diff -Nru a/drivers/net/a2065.c b/drivers/net/a2065.c
--- a/drivers/net/a2065.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/a2065.c	Thu Jun  5 15:51:50 2003
@@ -820,7 +820,7 @@
 		release_mem_region(ZTWO_PADDR(dev->base_addr),
 				   sizeof(struct lance_regs));
 		release_mem_region(ZTWO_PADDR(dev->mem_start), A2065_RAM_SIZE);
-		kfree(dev);
+		release_netdev(dev);
 		root_a2065_dev = next;
 	}
 #endif
diff -Nru a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c
--- a/drivers/net/amd8111e.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/amd8111e.c	Thu Jun  5 15:51:50 2003
@@ -1709,7 +1709,7 @@
 	if (dev) {
 		unregister_netdev(dev);
 		iounmap((void *) ((struct amd8111e_priv *)(dev->priv))->mmio);
-		kfree(dev);
+		release_netdev(dev);
 		pci_release_regions(pdev);
 		pci_disable_device(pdev);
 		pci_set_drvdata(pdev, NULL);
diff -Nru a/drivers/net/ariadne.c b/drivers/net/ariadne.c
--- a/drivers/net/ariadne.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/ariadne.c	Thu Jun  5 15:51:50 2003
@@ -852,7 +852,7 @@
 	unregister_netdev(dev);
 	release_mem_region(ZTWO_PADDR(dev->base_addr), sizeof(struct Am79C960));
 	release_mem_region(ZTWO_PADDR(dev->mem_start), ARIADNE_RAM_SIZE);
-	kfree(dev);
+	release_netdev(dev);
 	root_ariadne_dev = next;
     }
 #endif
diff -Nru a/drivers/net/ariadne2.c b/drivers/net/ariadne2.c
--- a/drivers/net/ariadne2.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/ariadne2.c	Thu Jun  5 15:51:50 2003
@@ -413,7 +413,7 @@
 	unregister_netdev(dev);
 	free_irq(IRQ_AMIGA_PORTS, dev);
 	release_mem_region(ZTWO_PADDR(dev->base_addr), NE_IO_EXTENT*2);
-	kfree(dev);
+	release_netdev(dev);
 	root_ariadne2_dev = next;
     }
 #endif
diff -Nru a/drivers/net/arm/am79c961a.c b/drivers/net/arm/am79c961a.c
--- a/drivers/net/arm/am79c961a.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/arm/am79c961a.c	Thu Jun  5 15:51:50 2003
@@ -677,7 +677,7 @@
 	release_region(dev->base_addr, 0x18);
 nodev:
 	unregister_netdev(dev);
-	kfree(dev);
+	release_netdev(dev);
 out:
 	return ret;
 }
diff -Nru a/drivers/net/arm/ether1.c b/drivers/net/arm/ether1.c
--- a/drivers/net/arm/ether1.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/arm/ether1.c	Thu Jun  5 15:51:50 2003
@@ -1058,7 +1058,7 @@
 	release_region(dev->base_addr, 16);
 	release_region(dev->base_addr + 0x800, 4096);
 	unregister_netdev(dev);
-	kfree(dev);
+	release_netdev(dev);
 out:
 	return ret;
 }
@@ -1073,7 +1073,7 @@
 
 	release_region(dev->base_addr, 16);
 	release_region(dev->base_addr + 0x800, 4096);
-	kfree(dev);
+	release_netdev(dev);
 }
 
 static const struct ecard_id ether1_ids[] = {
diff -Nru a/drivers/net/arm/ether3.c b/drivers/net/arm/ether3.c
--- a/drivers/net/arm/ether3.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/arm/ether3.c	Thu Jun  5 15:51:50 2003
@@ -899,7 +899,7 @@
 	release_region(dev->base_addr, 128);
 free:
 	unregister_netdev(dev);
-	kfree(dev);
+	release_netdev(dev);
 out:
 	return ret;
 }
@@ -912,7 +912,7 @@
 
 	unregister_netdev(dev);
 	release_region(dev->base_addr, 128);
-	kfree(dev);
+	release_netdev(dev);
 }
 
 static const struct ecard_id ether3_ids[] = {
diff -Nru a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c
--- a/drivers/net/au1000_eth.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/au1000_eth.c	Thu Jun  5 15:51:50 2003
@@ -823,7 +823,7 @@
 				MAX_BUF_SIZE * (NUM_TX_BUFFS+NUM_RX_BUFFS));
 	printk(KERN_ERR "%s: au1000_probe1 failed.  Returns %d\n",
 	       dev->name, retval);
-	kfree(dev);
+	release_netdev(dev);
 	return retval;
 }
 
diff -Nru a/drivers/net/b44.c b/drivers/net/b44.c
--- a/drivers/net/b44.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/b44.c	Thu Jun  5 15:51:50 2003
@@ -1830,7 +1830,7 @@
 	if (dev) {
 		unregister_netdev(dev);
 		iounmap((void *) ((struct b44 *)(dev->priv))->regs);
-		kfree(dev);
+		release_netdev(dev);
 		pci_release_regions(pdev);
 		pci_disable_device(pdev);
 		pci_set_drvdata(pdev, NULL);
diff -Nru a/drivers/net/bmac.c b/drivers/net/bmac.c
--- a/drivers/net/bmac.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/bmac.c	Thu Jun  5 15:51:50 2003
@@ -1452,7 +1452,7 @@
 		pmac_call_feature(PMAC_FTR_BMAC_ENABLE, bp->node, 0, 0);
 	}
 	unregister_netdev(dev);
-	kfree(dev);
+	release_netdev(dev);
 }
 
 static int bmac_open(struct net_device *dev)
@@ -1710,7 +1710,7 @@
 		free_irq(bp->tx_dma_intr, dev);
 		free_irq(bp->rx_dma_intr, dev);
 
-		kfree(dev);
+		release_netdev(dev);
 	} while (bmac_devs != NULL);
 }
 
diff -Nru a/drivers/net/declance.c b/drivers/net/declance.c
--- a/drivers/net/declance.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/declance.c	Thu Jun  5 15:51:50 2003
@@ -1203,7 +1203,7 @@
 
 err_out:
 	unregister_netdev(dev);
-	kfree(dev);
+	release_netdev(dev);
 	return ret;
 }
 
diff -Nru a/drivers/net/dl2k.c b/drivers/net/dl2k.c
--- a/drivers/net/dl2k.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/dl2k.c	Thu Jun  5 15:51:50 2003
@@ -1844,7 +1844,7 @@
 #ifdef MEM_MAPPING
 		iounmap ((char *) (dev->base_addr));
 #endif
-		kfree (dev);
+		release_netdev (dev);
 		pci_release_regions (pdev);
 		pci_disable_device (pdev);
 	}
diff -Nru a/drivers/net/e100/e100_main.c b/drivers/net/e100/e100_main.c
--- a/drivers/net/e100/e100_main.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/e100/e100_main.c	Thu Jun  5 15:51:50 2003
@@ -716,7 +716,7 @@
 	e100_dealloc_space(bdp);
 err_dev:
 	pci_set_drvdata(pcid, NULL);
-	kfree(dev);
+	release_netdev(dev);
 out:
 	return rc;
 }
@@ -738,7 +738,7 @@
 
 	e100_dealloc_space(bdp);
 	pci_set_drvdata(bdp->pdev, NULL);
-	kfree(dev);
+	release_netdev(dev);
 }
 
 static void __devexit
diff -Nru a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
--- a/drivers/net/e1000/e1000_main.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/e1000/e1000_main.c	Thu Jun  5 15:51:50 2003
@@ -542,7 +542,7 @@
 	iounmap(adapter->hw.hw_addr);
 	pci_release_regions(pdev);
 
-	kfree(netdev);
+	release_netdev(netdev);
 }
 
 /**
diff -Nru a/drivers/net/eepro100.c b/drivers/net/eepro100.c
--- a/drivers/net/eepro100.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/eepro100.c	Thu Jun  5 15:51:50 2003
@@ -2364,7 +2364,7 @@
 								+ sizeof(struct speedo_stats),
 						sp->tx_ring, sp->tx_ring_dma);
 	pci_disable_device(pdev);
-	kfree(dev);
+	release_netdev(dev);
 }
 

 static struct pci_device_id eepro100_pci_tbl[] __devinitdata = {
diff -Nru a/drivers/net/epic100.c b/drivers/net/epic100.c
--- a/drivers/net/epic100.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/epic100.c	Thu Jun  5 15:51:50 2003
@@ -1482,7 +1482,7 @@
 	iounmap((void*) dev->base_addr);
 #endif
 	pci_release_regions(pdev);
-	kfree(dev);
+	release_netdev(dev);
 	pci_set_drvdata(pdev, NULL);
 	/* pci_power_off(pdev, -1); */
 }
diff -Nru a/drivers/net/fealnx.c b/drivers/net/fealnx.c
--- a/drivers/net/fealnx.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/fealnx.c	Thu Jun  5 15:51:50 2003
@@ -712,7 +712,7 @@
 #ifndef USE_IO_OPS
 		iounmap((void *)dev->base_addr);
 #endif
-		kfree(dev);
+		release_netdev(dev);
 		pci_release_regions(pdev);
 		pci_set_drvdata(pdev, NULL);
 	} else
diff -Nru a/drivers/net/hamachi.c b/drivers/net/hamachi.c
--- a/drivers/net/hamachi.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/hamachi.c	Thu Jun  5 15:51:50 2003
@@ -1976,7 +1976,7 @@
 			hmp->tx_ring_dma);
 		unregister_netdev(dev);
 		iounmap((char *)dev->base_addr);
-		kfree(dev);
+		release_netdev(dev);
 		pci_release_regions(pdev);
 		pci_set_drvdata(pdev, NULL);
 	}
diff -Nru a/drivers/net/hydra.c b/drivers/net/hydra.c
--- a/drivers/net/hydra.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/hydra.c	Thu Jun  5 15:51:50 2003
@@ -243,7 +243,7 @@
 	unregister_netdev(dev);
 	free_irq(IRQ_AMIGA_PORTS, dev);
 	release_mem_region(ZTWO_PADDR(dev->base_addr)-HYDRA_NIC_BASE, 0x10000);
-	kfree(dev);
+	release_netdev(dev);
 	root_hydra_dev = next;
     }
 #endif
diff -Nru a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c
--- a/drivers/net/ixgb/ixgb_main.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/ixgb/ixgb_main.c	Thu Jun  5 15:51:50 2003
@@ -478,7 +478,7 @@
 	iounmap((void *) adapter->hw.hw_addr);
 	pci_release_regions(pdev);
 
-	kfree(netdev);
+	release_netdev(netdev);
 }
 
 /**
diff -Nru a/drivers/net/mace.c b/drivers/net/mace.c
--- a/drivers/net/mace.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/mace.c	Thu Jun  5 15:51:50 2003
@@ -254,7 +254,7 @@
 		release_OF_resource(mp->of_node, 1);
 		release_OF_resource(mp->of_node, 2);
 	}
-	kfree(dev);
+	release_netdev(dev);
 }
 
 static void dbdma_reset(volatile struct dbdma_regs *dma)
@@ -976,7 +976,7 @@
 		release_OF_resource(mp->of_node, 1);
 		release_OF_resource(mp->of_node, 2);
 
-		kfree(dev);
+		release_netdev(dev);
     }
     if (dummy_buf != NULL) {
 		kfree(dummy_buf);
diff -Nru a/drivers/net/myri_sbus.c b/drivers/net/myri_sbus.c
--- a/drivers/net/myri_sbus.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/myri_sbus.c	Thu Jun  5 15:51:50 2003
@@ -1090,7 +1090,7 @@
 	return 0;
 err:	unregister_netdev(dev);
 	/* This will also free the co-allocated 'dev->priv' */
-	kfree(dev);
+	release_netdev(dev);
 	return -ENODEV;
 }
 
diff -Nru a/drivers/net/natsemi.c b/drivers/net/natsemi.c
--- a/drivers/net/natsemi.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/natsemi.c	Thu Jun  5 15:51:50 2003
@@ -838,7 +838,7 @@
 	if (i) {
 		pci_release_regions(pdev);
 		unregister_netdev(dev);
-		kfree(dev);
+		release_netdev(dev);
 		pci_set_drvdata(pdev, NULL);
 		return i;
 	}
diff -Nru a/drivers/net/ne2k-pci.c b/drivers/net/ne2k-pci.c
--- a/drivers/net/ne2k-pci.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/ne2k-pci.c	Thu Jun  5 15:51:50 2003
@@ -635,7 +635,7 @@
 
 	unregister_netdev(dev);
 	release_region(dev->base_addr, NE_IO_EXTENT);
-	kfree(dev);
+	release_netdev(dev);
 	pci_set_drvdata(pdev, NULL);
 }
 
diff -Nru a/drivers/net/pci-skeleton.c b/drivers/net/pci-skeleton.c
--- a/drivers/net/pci-skeleton.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/pci-skeleton.c	Thu Jun  5 15:51:50 2003
@@ -871,7 +871,7 @@
 		sizeof (struct netdrv_private));
 #endif /* NETDRV_NDEBUG */
 
-	kfree (dev);
+	release_netdev (dev);
 
 	pci_set_drvdata (pdev, NULL);
 
diff -Nru a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c
--- a/drivers/net/pcmcia/ibmtr_cs.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/pcmcia/ibmtr_cs.c	Thu Jun  5 15:51:50 2003
@@ -310,7 +310,7 @@
     /* Unlink device structure, free bits */
     *linkp = link->next;
     unregister_netdev(dev);
-    kfree(dev);
+    release_netdev(dev);
 } /* ibmtr_detach */
 
 /*======================================================================
diff -Nru a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c
--- a/drivers/net/pcnet32.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/pcnet32.c	Thu Jun  5 15:51:50 2003
@@ -1762,7 +1762,7 @@
 	if (lp->pci_dev)
 	    pci_unregister_driver(&pcnet32_driver);
 	pci_free_consistent(lp->pci_dev, sizeof(*lp), lp, lp->dma_addr);
-	kfree(pcnet32_dev);
+	release_netdev(pcnet32_dev);
 	pcnet32_dev = next_dev;
     }
 }
diff -Nru a/drivers/net/r8169.c b/drivers/net/r8169.c
--- a/drivers/net/r8169.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/r8169.c	Thu Jun  5 15:51:50 2003
@@ -646,7 +646,7 @@
 	       sizeof (struct net_device) + sizeof (struct rtl8169_private));
 
 	pci_disable_device(pdev);
-	kfree(dev);
+	release_netdev(dev);
 	pci_set_drvdata(pdev, NULL);
 }
 
diff -Nru a/drivers/net/rrunner.c b/drivers/net/rrunner.c
--- a/drivers/net/rrunner.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/rrunner.c	Thu Jun  5 15:51:50 2003
@@ -253,7 +253,7 @@
 				    rr->tx_ring_dma);
 		unregister_netdev(dev);
 		iounmap(rr->regs);
-		kfree(dev);
+		release_netdev(dev);
 		pci_release_regions(pdev);
 		pci_disable_device(pdev);
 		pci_set_drvdata(pdev, NULL);
diff -Nru a/drivers/net/sis900.c b/drivers/net/sis900.c
--- a/drivers/net/sis900.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/sis900.c	Thu Jun  5 15:51:50 2003
@@ -493,7 +493,7 @@
  	pci_set_drvdata(pci_dev, NULL);
 	pci_release_regions(pci_dev);
  err_out:
-	kfree(net_dev);
+	release_netdev(net_dev);
 	return ret;
 }
 
@@ -2189,7 +2189,7 @@
 	pci_free_consistent(pci_dev, TX_TOTAL_SIZE, sis_priv->tx_ring,
 		sis_priv->tx_ring_dma);
 	unregister_netdev(net_dev);
-	kfree(net_dev);
+	release_netdev(net_dev);
 	pci_release_regions(pci_dev);
 	pci_set_drvdata(pci_dev, NULL);
 }
diff -Nru a/drivers/net/skfp/skfddi.c b/drivers/net/skfp/skfddi.c
--- a/drivers/net/skfp/skfddi.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/skfp/skfddi.c	Thu Jun  5 15:51:50 2003
@@ -2633,7 +2633,7 @@
 	}
 	unregister_netdev(p);
 	printk("%s: unloaded\n", p->name);
-	kfree(p);		/* Free the device structure */
+	release_netdev(p);		/* Free the device structure */
 
 	return next;
 }				// unlink_modules
diff -Nru a/drivers/net/starfire.c b/drivers/net/starfire.c
--- a/drivers/net/starfire.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/starfire.c	Thu Jun  5 15:51:50 2003
@@ -2196,7 +2196,7 @@
 	pci_release_regions(pdev);
 
 	pci_set_drvdata(pdev, NULL);
-	kfree(dev);			/* Will also free np!! */
+	release_netdev(dev);			/* Will also free np!! */
 }
 
 
diff -Nru a/drivers/net/sunbmac.c b/drivers/net/sunbmac.c
--- a/drivers/net/sunbmac.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/sunbmac.c	Thu Jun  5 15:51:50 2003
@@ -1209,7 +1209,7 @@
 
 	unregister_netdev(dev);
 	/* This also frees the co-located 'dev->priv' */
-	kfree(dev);
+	release_netdev(dev);
 	return -ENODEV;
 }
 
diff -Nru a/drivers/net/sundance.c b/drivers/net/sundance.c
--- a/drivers/net/sundance.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/sundance.c	Thu Jun  5 15:51:50 2003
@@ -730,7 +730,7 @@
 #endif
 	pci_release_regions(pdev);
 err_out_netdev:
-	kfree (dev);
+	release_netdev(dev);
 	return -ENODEV;
 }
 
@@ -1784,7 +1784,7 @@
 #ifndef USE_IO_OPS
 		iounmap((char *)(dev->base_addr));
 #endif
-		kfree(dev);
+		release_netdev(dev);
 		pci_set_drvdata(pdev, NULL);
 	}
 }
diff -Nru a/drivers/net/sungem.c b/drivers/net/sungem.c
--- a/drivers/net/sungem.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/sungem.c	Thu Jun  5 15:51:50 2003
@@ -2885,7 +2885,7 @@
 				    gp->gblock_dvma);
 		iounmap((void *) gp->regs);
 		pci_release_regions(pdev);
-		kfree(dev);
+		release_netdev(dev);
 
 		pci_set_drvdata(pdev, NULL);
 	}
diff -Nru a/drivers/net/sunhme.c b/drivers/net/sunhme.c
--- a/drivers/net/sunhme.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/sunhme.c	Thu Jun  5 15:51:50 2003
@@ -3351,7 +3351,7 @@
 			pci_release_regions(hp->happy_dev);
 		}
 #endif
-		kfree(dev);
+		release_netdev(dev);
 
 		root_happy_dev = next;
 	}
diff -Nru a/drivers/net/tc35815.c b/drivers/net/tc35815.c
--- a/drivers/net/tc35815.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tc35815.c	Thu Jun  5 15:51:50 2003
@@ -1762,7 +1762,7 @@
 		next_dev = ((struct tc35815_local *)dev->priv)->next_module;
 		iounmap((void *)(dev->base_addr));
 		unregister_netdev(dev);
-		kfree(dev);
+		release_netdev(dev);
 		root_tc35815_dev = next_dev;
 	}
 }
diff -Nru a/drivers/net/tg3.c b/drivers/net/tg3.c
--- a/drivers/net/tg3.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tg3.c	Thu Jun  5 15:51:50 2003
@@ -6942,7 +6942,7 @@
 	if (dev) {
 		unregister_netdev(dev);
 		iounmap((void *) ((struct tg3 *)(dev->priv))->regs);
-		kfree(dev);
+		release_netdev(dev);
 		pci_release_regions(pdev);
 		pci_disable_device(pdev);
 		pci_set_drvdata(pdev, NULL);
diff -Nru a/drivers/net/tlan.c b/drivers/net/tlan.c
--- a/drivers/net/tlan.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tlan.c	Thu Jun  5 15:51:50 2003
@@ -447,7 +447,7 @@
 
 	pci_release_regions(pdev);
 	
-	kfree( dev );
+	release_netdev( dev );
 		
 	pci_set_drvdata( pdev, NULL );
 } 
@@ -695,7 +695,7 @@
 		release_region( dev->base_addr, 0x10);
 		unregister_netdev( dev );
 		TLan_Eisa_Devices = priv->nextDevice;
-		kfree( dev );
+		release_netdev( dev );
 		tlan_have_eisa--;
 	}
 }
diff -Nru a/drivers/net/tokenring/abyss.c b/drivers/net/tokenring/abyss.c
--- a/drivers/net/tokenring/abyss.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tokenring/abyss.c	Thu Jun  5 15:51:50 2003
@@ -443,7 +443,7 @@
 	release_region(dev->base_addr-0x10, ABYSS_IO_EXTENT);
 	free_irq(dev->irq, dev);
 	tmsdev_term(dev);
-	kfree(dev);
+	release_netdev(dev);
 	pci_set_drvdata(pdev, NULL);
 }
 
diff -Nru a/drivers/net/tokenring/lanstreamer.c b/drivers/net/tokenring/lanstreamer.c
--- a/drivers/net/tokenring/lanstreamer.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tokenring/lanstreamer.c	Thu Jun  5 15:51:50 2003
@@ -433,7 +433,7 @@
 	/* shouldn't we do iounmap here? */
 	release_region(pci_resource_start(pdev, 0), pci_resource_len(pdev,0));
 	release_mem_region(pci_resource_start(pdev, 1), pci_resource_len(pdev,1));
-	kfree(dev);
+	release_netdev(dev);
 	pci_set_drvdata(pdev, NULL);
 }
 
diff -Nru a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c
--- a/drivers/net/tokenring/olympic.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tokenring/olympic.c	Thu Jun  5 15:51:50 2003
@@ -1778,7 +1778,7 @@
 	iounmap(olympic_priv->olympic_lap) ; 
 	pci_release_regions(pdev) ;
 	pci_set_drvdata(pdev,NULL) ;  	
-	kfree(dev) ; 
+	release_netdev(dev) ; 
 }
 
 static struct pci_driver olympic_driver = { 
diff -Nru a/drivers/net/tokenring/smctr.c b/drivers/net/tokenring/smctr.c
--- a/drivers/net/tokenring/smctr.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tokenring/smctr.c	Thu Jun  5 15:51:50 2003
@@ -5730,7 +5730,7 @@
 		if (dev) {
 			unregister_netdev(dev);
 			cleanup_card(dev);
-			kfree(dev);
+			release_netdev(dev);
 		}
         }
 }
diff -Nru a/drivers/net/tokenring/tmspci.c b/drivers/net/tokenring/tmspci.c
--- a/drivers/net/tokenring/tmspci.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tokenring/tmspci.c	Thu Jun  5 15:51:50 2003
@@ -229,7 +229,7 @@
 	release_region(dev->base_addr, TMS_PCI_IO_EXTENT);
 	free_irq(dev->irq, dev);
 	tmsdev_term(dev);
-	kfree(dev);
+	release_netdev(dev);
 	pci_set_drvdata(pdev, NULL);
 }
 
diff -Nru a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c
--- a/drivers/net/tulip/de2104x.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tulip/de2104x.c	Thu Jun  5 15:51:50 2003
@@ -2153,7 +2153,7 @@
 	pci_release_regions(pdev);
 	pci_disable_device(pdev);
 	pci_set_drvdata(pdev, NULL);
-	kfree(dev);
+	release_netdev(dev);
 }
 
 #ifdef CONFIG_PM
diff -Nru a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c
--- a/drivers/net/tulip/dmfe.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tulip/dmfe.c	Thu Jun  5 15:51:50 2003
@@ -478,7 +478,7 @@
 					db->buf_pool_ptr, db->buf_pool_dma_ptr);
 		unregister_netdev(dev);
 		pci_release_regions(pdev);
-		kfree(dev);	/* free board information */
+		release_netdev(dev);	/* free board information */
 		pci_set_drvdata(pdev, NULL);
 	}
 
diff -Nru a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c
--- a/drivers/net/tulip/tulip_core.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tulip/tulip_core.c	Thu Jun  5 15:51:50 2003
@@ -1767,7 +1767,7 @@
 #ifndef USE_IO_OPS
 	iounmap((void *)dev->base_addr);
 #endif
-	kfree (dev);
+	release_netdev (dev);
 	pci_release_regions (pdev);
 	pci_set_drvdata (pdev, NULL);
 
diff -Nru a/drivers/net/tulip/winbond-840.c b/drivers/net/tulip/winbond-840.c
--- a/drivers/net/tulip/winbond-840.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tulip/winbond-840.c	Thu Jun  5 15:51:50 2003
@@ -1623,7 +1623,7 @@
 #ifndef USE_IO_OPS
 		iounmap((char *)(dev->base_addr));
 #endif
-		kfree(dev);
+		release_netdev(dev);
 	}
 
 	pci_set_drvdata(pdev, NULL);
diff -Nru a/drivers/net/tulip/xircom_cb.c b/drivers/net/tulip/xircom_cb.c
--- a/drivers/net/tulip/xircom_cb.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tulip/xircom_cb.c	Thu Jun  5 15:51:50 2003
@@ -338,7 +338,7 @@
 	}
 	release_region(dev->base_addr, 128);
 	unregister_netdev(dev);
-	kfree(dev);
+	release_netdev(dev);
 	leave("xircom_remove");
 } 
 
diff -Nru a/drivers/net/tulip/xircom_tulip_cb.c b/drivers/net/tulip/xircom_tulip_cb.c
--- a/drivers/net/tulip/xircom_tulip_cb.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/tulip/xircom_tulip_cb.c	Thu Jun  5 15:51:50 2003
@@ -645,11 +645,11 @@
 	return 0;
 
 err_out_cleardev:
+	unregister_netdev(dev);
 	pci_set_drvdata(pdev, NULL);
 	pci_release_regions(pdev);
 err_out_free_netdev:
-	unregister_netdev(dev);
-	kfree(dev);
+	release_netdev(dev);
 	return -ENODEV;
 }
 
@@ -1702,7 +1702,7 @@
 	printk(KERN_INFO "xircom_remove_one(%s)\n", dev->name);
 	unregister_netdev(dev);
 	pci_release_regions(pdev);
-	kfree(dev);
+	release_netdev(dev);
 	pci_set_drvdata(pdev, NULL);
 }
 
diff -Nru a/drivers/net/typhoon.c b/drivers/net/typhoon.c
--- a/drivers/net/typhoon.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/typhoon.c	Thu Jun  5 15:51:50 2003
@@ -2476,7 +2476,7 @@
 	pci_release_regions(pdev);
 	pci_disable_device(pdev);
 	pci_set_drvdata(pdev, NULL);
-	kfree(dev);
+	release_netdev(dev);
 }
 
 static struct pci_driver typhoon_driver = {
diff -Nru a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c
--- a/drivers/net/via-rhine.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/via-rhine.c	Thu Jun  5 15:51:50 2003
@@ -1872,7 +1872,7 @@
 	iounmap((char *)(dev->base_addr));
 #endif
 
-	kfree(dev);
+	release_netdev(dev);
 	pci_disable_device(pdev);
 	pci_set_drvdata(pdev, NULL);
 }
diff -Nru a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
--- a/drivers/net/wireless/airo.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/wireless/airo.c	Thu Jun  5 15:51:50 2003
@@ -1573,7 +1573,7 @@
 	        release_region( dev->base_addr, 64 );
         }
 	del_airo_dev( dev );
-	kfree( dev );
+	release_netdev( dev );
 }
 
 EXPORT_SYMBOL(stop_airo_card);
diff -Nru a/drivers/net/wireless/orinoco_cs.c b/drivers/net/wireless/orinoco_cs.c
--- a/drivers/net/wireless/orinoco_cs.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/wireless/orinoco_cs.c	Thu Jun  5 15:51:50 2003
@@ -290,8 +290,9 @@
 		DEBUG(0, "orinoco_cs: About to unregister net device %p\n",
 		      dev);
 		unregister_netdev(dev);
-	}
-	kfree(dev);
+		release_netdev(dev);
+	} else
+		kfree(dev);
 }				/* orinoco_cs_detach */
 
 /*
diff -Nru a/drivers/net/wireless/orinoco_pci.c b/drivers/net/wireless/orinoco_pci.c
--- a/drivers/net/wireless/orinoco_pci.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/wireless/orinoco_pci.c	Thu Jun  5 15:51:50 2003
@@ -289,7 +289,7 @@
 		iounmap((unsigned char *) priv->hw.iobase);
 
 	pci_set_drvdata(pdev, NULL);
-	kfree(dev);
+	release_netdev(dev);
 
 	pci_disable_device(pdev);
 }
diff -Nru a/drivers/net/wireless/orinoco_tmd.c b/drivers/net/wireless/orinoco_tmd.c
--- a/drivers/net/wireless/orinoco_tmd.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/wireless/orinoco_tmd.c	Thu Jun  5 15:51:50 2003
@@ -182,7 +182,7 @@
 		
 	pci_set_drvdata(pdev, NULL);
 
-	kfree(dev);
+	release_netdev(dev);
 
 	release_region(pci_resource_start(pdev, 2), pci_resource_len(pdev, 2));
 
diff -Nru a/drivers/net/yellowfin.c b/drivers/net/yellowfin.c
--- a/drivers/net/yellowfin.c	Thu Jun  5 15:51:50 2003
+++ b/drivers/net/yellowfin.c	Thu Jun  5 15:51:50 2003
@@ -1486,7 +1486,7 @@
 	iounmap ((void *) dev->base_addr);
 #endif
 
-	kfree (dev);
+	release_netdev (dev);
 	pci_set_drvdata(pdev, NULL);
 }
 

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: David S. Miller <hidden>
Date: 2003-06-07 09:05:28

   From: Stephen Hemminger [off-list ref]
   Date: Fri, 6 Jun 2003 14:58:35 -0700
   
   Phase I:  introduces release_netdev which is the hook to allow later
      changes to hold onto the net device after the device has potentially
      unloaded.  Includes patch for the easy to fix devices. 

Besides naming (thought this was going to be named netdev_drop)
I have no problems.

Al?

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: Stephen Hemminger <hidden>
Date: 2003-06-07 15:25:15

On Sat, 07 Jun 2003 02:05:28 -0700 (PDT)
"David S. Miller" [off-list ref] wrote:
   From: Stephen Hemminger [off-list ref]
   Date: Fri, 6 Jun 2003 14:58:35 -0700
   
   Phase I:  introduces release_netdev which is the hook to allow later
      changes to hold onto the net device after the device has potentially
      unloaded.  Includes patch for the easy to fix devices. 

Besides naming (thought this was going to be named netdev_drop)
I have no problems.

Al?
My (admittedly weak) rational for this was:
	- it seemed more like part of the register/unregister process
	  and those functions are named {un}register_netdevice
	- RTNL should not be held, same as unregister_netdev
	  (vs unregister_netdevice which requires it).
	- release rather than drop because release is used as name
	  in the kobject callback hook

But it's easy to change now.

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: Jeff Garzik <hidden>
Date: 2003-06-07 19:15:22

On Fri, Jun 06, 2003 at 02:58:35PM -0700, Stephen Hemminger wrote:
This is the first phase of a sequence of patches to resolve network
device reference count issues exposed by the new sysfs interface.

Phase I:  introduces release_netdev which is the hook to allow later
   changes to hold onto the net device after the device has potentially
   unloaded.  Includes patch for the easy to fix devices. 

Phase II: fixes devices that encapsulate network device structure
   inside their own structure, or allocate private data in a way
   that will break later.
I would prefer to fix the drivers _before_ anything else.  i.e. Phase 2
becomes Phase 1.

These often need to be merged into 2.4 as well, and they can be applied
to all drivers without any API changes.  The changes are separated out
from any refcounting/sysfs stuff, and can (potentially) be considered
and reviewed by the respective maintainers.

	Jeff

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: Jeff Garzik <hidden>
Date: 2003-06-07 19:16:28

IOW, release_netdev is basically a search-n-replace change that can be done
to drivers anytime.  Let's apply the "meat" changes to mainline first,
the bug fixes / cleanups to use dynamic alloc.

	Jeff

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: David S. Miller <hidden>
Date: 2003-06-08 06:58:25

   From: Jeff Garzik [off-list ref]
   Date: Sat, 7 Jun 2003 15:15:22 -0400

   I would prefer to fix the drivers _before_ anything else.  i.e. Phase 2
   becomes Phase 1.
   
   These often need to be merged into 2.4 as well, and they can be applied
   to all drivers without any API changes.  The changes are separated out
   from any refcounting/sysfs stuff, and can (potentially) be considered
   and reviewed by the respective maintainers.

Have you extracted out all the init_etherdev() killings Al and
myself did so you can backport them to 2.4.x too?

If you're not going to do that, there is not much point in trying to
sync other such things back to 2.4.x as well.

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: Jeff Garzik <hidden>
Date: 2003-06-09 03:51:57

David S. Miller wrote:
Have you extracted out all the init_etherdev() killings Al and
myself did so you can backport them to 2.4.x too?
That's the plan, yes.

	Jeff

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: David S. Miller <hidden>
Date: 2003-06-09 05:53:09

   From: Jeff Garzik [off-list ref]
   Date: Sun, 08 Jun 2003 23:51:57 -0400

   David S. Miller wrote:
   > Have you extracted out all the init_etherdev() killings Al and
   > myself did so you can backport them to 2.4.x too?
   
   That's the plan, yes.
   
That's your plan, but did you do any of this yet?  It'll keep
going deeper and deeper into bitkeeper history the longer that
you wait :-)

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: Jeff Garzik <hidden>
Date: 2003-06-09 17:09:13

David S. Miller wrote:
   From: Jeff Garzik [off-list ref]
   Date: Sun, 08 Jun 2003 23:51:57 -0400

   David S. Miller wrote:
   > Have you extracted out all the init_etherdev() killings Al and
   > myself did so you can backport them to 2.4.x too?
   
   That's the plan, yes.
   
That's your plan, but did you do any of this yet?  It'll keep
going deeper and deeper into bitkeeper history the longer that
you wait :-)

Yes, I have been following my plan.  You will see when Marcelo opens 2.4.22-pre1 that I have been committing these to my net-drivers-2.4 queue.

	Jeff

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: David S. Miller <hidden>
Date: 2003-06-09 17:09:48

   From: Jeff Garzik [off-list ref]
   Date: Mon, 09 Jun 2003 13:09:13 -0400

   David S. Miller wrote:
   > That's your plan, but did you do any of this yet?  It'll keep
   > going deeper and deeper into bitkeeper history the longer that
   > you wait :-)
   
   Yes, I have been following my plan.  You will see when Marcelo opens 
   2.4.22-pre1 that I have been committing these to my net-drivers-2.4 queue.

Awesome.

Now why was I asking this to begin with?  You wanted to do something,
what was that? :-)

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: Jeff Garzik <hidden>
Date: 2003-06-09 17:14:46

On Mon, Jun 09, 2003 at 10:09:48AM -0700, David S. Miller wrote:
   From: Jeff Garzik [off-list ref]
   Date: Mon, 09 Jun 2003 13:09:13 -0400

   David S. Miller wrote:
   > That's your plan, but did you do any of this yet?  It'll keep
   > going deeper and deeper into bitkeeper history the longer that
   > you wait :-)
   
   Yes, I have been following my plan.  You will see when Marcelo opens 
   2.4.22-pre1 that I have been committing these to my net-drivers-2.4 queue.

Awesome.

Now why was I asking this to begin with?  You wanted to do something,
what was that? :-)
I wanted to wait on the s/kfree/release_netdev/ patch until the other
stuff is done.  Said patch can be applied anytime, and doing it in this
order reduces 2.4 backport merge pain.  :)

	Jeff

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: David S. Miller <hidden>
Date: 2003-06-09 17:18:07

   From: Jeff Garzik [off-list ref]
   Date: Mon, 9 Jun 2003 13:14:46 -0400
   
   I wanted to wait on the s/kfree/release_netdev/ patch until the other
   stuff is done.  Said patch can be applied anytime, and doing it in this
   order reduces 2.4 backport merge pain.  :)

No problem, but once all the init_etherdev() etc. crap is abolished,
Stephen's work or something similar goes in...

Ok?

Re: [PATCH 2.5.70] Add release_netdev -- hook for sysfs/net device cleanup

From: Jeff Garzik <hidden>
Date: 2003-06-09 18:11:51

On Mon, Jun 09, 2003 at 10:18:07AM -0700, David S. Miller wrote:
   From: Jeff Garzik [off-list ref]
   Date: Mon, 9 Jun 2003 13:14:46 -0400
   
   I wanted to wait on the s/kfree/release_netdev/ patch until the other
   stuff is done.  Said patch can be applied anytime, and doing it in this
   order reduces 2.4 backport merge pain.  :)

No problem, but once all the init_etherdev() etc. crap is abolished,
Stephen's work or something similar goes in...

Ok?
Right.  That's what I want :)

	Jeff
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help