All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch] fix netfront race
@ 2006-08-29  7:34 Gerd Hoffmann
  0 siblings, 0 replies; only message in thread
From: Gerd Hoffmann @ 2006-08-29  7:34 UTC (permalink / raw)
  To: Xen devel list; +Cc: Kay Sievers

[-- Attachment #1: Type: text/plain, Size: 424 bytes --]

  Hi,

this patch moves register_netdev() + sysfs attribute
registering from create_netdev() into the new open_netdev()
function. open_netdev is called as very last thing in
netdev_probe.

This closes at least one initialization race: uninitialized
mac address is visible for a short time in
/sys/class/net/${if}/address

please apply,

  Gerd

-- 
Gerd Hoffmann <kraxel@suse.de>
http://www.suse.de/~kraxel/julika-dora.jpeg

[-- Attachment #2: netfront-race --]
[-- Type: text/plain, Size: 2762 bytes --]

move register_netdev() + sysfs attribute registering from
create_netdev() into the new open_netdev() function.
open_netdev is called as very last thing in netdev_probe.

This closes at least one initialization race: uninitialized
mac address is visible for a short time in
/sys/class/net/${if}/address

Signed-off-by: Gerd Hoffmann <kraxel@suse.de>
diff -r f790546ecfda linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c	Mon Aug 28 20:22:56 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c	Tue Aug 29 09:18:23 2006 +0200
@@ -193,6 +193,7 @@ static void netfront_closing(struct xenb
 
 static void end_access(int, void *);
 static void netif_disconnect_backend(struct netfront_info *);
+static int open_netdev(struct netfront_info *);
 static void close_netdev(struct netfront_info *);
 static void netif_free(struct netfront_info *);
 
@@ -263,15 +264,22 @@ static int __devinit netfront_probe(stru
 	dev->dev.driver_data = info;
 
 	err = talk_to_backend(dev, info);
-	if (err) {
-		xennet_sysfs_delif(info->netdev);
-		unregister_netdev(netdev);
-		free_netdev(netdev);
-		dev->dev.driver_data = NULL;
-		return err;
-	}
+	if (err)
+		goto fail_backend;
+
+	err = open_netdev(info);
+	if (err)
+		goto fail_open;
 
 	return 0;
+
+ fail_open:
+	xennet_sysfs_delif(info->netdev);
+	unregister_netdev(netdev);
+ fail_backend:
+	free_netdev(netdev);
+	dev->dev.driver_data = NULL;
+	return err;
 }
 
 
@@ -1887,27 +1895,9 @@ create_netdev(int handle, int copying_re
 	SET_MODULE_OWNER(netdev);
 	SET_NETDEV_DEV(netdev, &dev->dev);
 
-	err = register_netdev(netdev);
-	if (err) {
-		printk(KERN_WARNING "%s> register_netdev err=%d\n",
-		       __FUNCTION__, err);
-		goto exit_free_rx;
-	}
-
-	err = xennet_sysfs_addif(netdev);
-	if (err) {
-		/* This can be non-fatal: it only means no tuning parameters */
-		printk(KERN_WARNING "%s> add sysfs failed err=%d\n",
-		       __FUNCTION__, err);
-	}
-
 	np->netdev = netdev;
-
 	return netdev;
 
-
- exit_free_rx:
-	gnttab_free_grant_references(np->gref_rx_head);
  exit_free_tx:
 	gnttab_free_grant_references(np->gref_tx_head);
  exit:
@@ -1966,6 +1955,26 @@ static int __devexit netfront_remove(str
 	return 0;
 }
 
+
+static int open_netdev(struct netfront_info *info)
+{
+	int err;
+	
+	err = register_netdev(info->netdev);
+	if (err) {
+		printk(KERN_WARNING "%s: register_netdev err=%d\n",
+		       __FUNCTION__, err);
+		return err;
+	}
+
+	err = xennet_sysfs_addif(info->netdev);
+	if (err) {
+		/* This can be non-fatal: it only means no tuning parameters */
+		printk(KERN_WARNING "%s: add sysfs failed err=%d\n",
+		       __FUNCTION__, err);
+	}
+	return 0;
+}
 
 static void close_netdev(struct netfront_info *info)
 {

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2006-08-29  7:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-29  7:34 [patch] fix netfront race Gerd Hoffmann

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.