Skip to contentSkip to conversation

fix netfront race

PATCH New Gerd Hoffmann 1 participant 1 message Aug 29, 2006

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fix netfront race

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

Signature · 2 lines
Gerd Hoffmann <[email protected]>
http://www.suse.de/~kraxel/julika-dora.jpeg

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

linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c +35 -25
diff -r f790546ecfda linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
@@ -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)
 {

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel