Skip to contentSkip to conversation

Allow multiple dummy devices again

PATCH In review Andi Kleen 4 participants 6 messages Nov 28, 2003

Subsystems (2)
lore
Share & tools
lore

Andi Kleen

author
#0 lore raw

PATCH 1/1 Allow multiple dummy devices again

In 2.6 the old trick of copying the dummy module to get multiple dummy devices doesn't work anymore because the "dummy" device name is embedded in the module.

This patch adds a new module option that allows to specify how many dummy devices you want.

-Andi

drivers/net/dummy.c renamed from drivers/net/dummy.c-o +36 -5
diff -u linux/drivers/net/dummy.c-o linux-2.6.0test11-amd64/drivers/net/dummy.c
@@ -34,6 +34,8 @@
 #include <linux/netdevice.h>
 #include <linux/init.h>
 
+static int numdummies = 1;
+
 static int dummy_xmit(struct sk_buff *skb, struct net_device *dev);
 static struct net_device_stats *dummy_get_stats(struct net_device *dev);
 
@@ -83,10 +85,14 @@
 	return dev->priv;
 }
 
-static struct net_device *dev_dummy;
+static struct net_device **dummies;
 
-static int __init dummy_init_module(void)
+/* Number of dummy devices to be set up by this module. */
+MODULE_PARM(numdummies, "i")
+
+static int __init dummy_init_one(int index)
 {
+	struct net_device *dev_dummy;
 	int err;
 
 	dev_dummy = alloc_netdev(sizeof(struct net_device_stats),
@@ -98,15 +104,40 @@
 	if ((err = register_netdev(dev_dummy))) {
 		kfree(dev_dummy);
 		dev_dummy = NULL;
+	} else {
+		dummies[index] = dev_dummy; 
 	}
+
 	return err;
 }
 
+static void __exit dummy_free_one(int index) 
+{
+	unregister_netdev(dummies[index]);
+	free_netdev(dummies[index]);
+} 
+
+static int __init dummy_init_module(void)
+{ 
+	int i, err = 0;
+	dummies = kmalloc(numdummies * sizeof(void *), GFP_KERNEL); 
+	if (!dummies)
+		return -ENOMEM; 
+	for (i = 0; i < numdummies && !err; i++)
+		err = dummy_init_one(i); 
+	if (err) { 
+		while (--i >= 0)
+			dummy_free_one(i);
+	}
+	return err;
+} 
+
 static void __exit dummy_cleanup_module(void)
 {
-	unregister_netdev(dev_dummy);
-	free_netdev(dev_dummy);
-	dev_dummy = NULL;
+	int i;
+	for (i = 0; i < numdummies; i++) 
+		dummy_free_one(i); 
+	kfree(dummies);	
 }
 
 module_init(dummy_init_module);
#1 lore raw
Quoted 6 lines · On Fri, 28 Nov 2003 01:44:45 +0100 Andi Kleen <[email protected]> wrote:

In 2.6 the old trick of copying the dummy module to get multiple dummy devices doesn't work anymore because the "dummy" device name is embedded in the module.

This patch adds a new module option that allows to specify how many dummy devices you want.

Jeff, FWIW I'm fine with this.

Even though we generally frown upon module options for networking devices, I think it's wholly appropriate for this case.

#2 lore raw
Quoted 2 lines · David S. Miller

Even though we generally frown upon module options for networking devices, I think it's wholly appropriate for this case.

Why not make it also a boot option?

cheers,
jamal

#3 lore raw
Quoted 6 lines · On 27 Nov 2003 20:33:22 -0500 jamal <[email protected]> wrote:
Quoted 2 lines · David S. Miller

Even though we generally frown upon module options for networking devices, I think it's wholly appropriate for this case.

Why not make it also a boot option?

They're one in the same these days.

If the driver is built as a module, you pass the option in with at modload time, else you pass it in on the kernel command line.

#4 lore raw
Quoted 8 lines · David S. Miller
Quoted 5 lines · On 27 Nov 2003 20:33:22 -0500 jamal <[email protected]> wrote:
Quoted 2 lines · David S. Miller

Even though we generally frown upon module options for networking devices, I think it's wholly appropriate for this case.

Quoted 6 lines
Quoted 1 line

Why not make it also a boot option?

They're one in the same these days.

If the driver is built as a module, you pass the option in with at modload time, else you pass it in on the kernel command line.

You'd have to use module_param for that, but it appears the driver uses the deprectated MODULE_PARAM..

#5 lore raw
Quoted 2 lines · On Fri, 28 Nov 2003 07:04:37 +0000 Christoph Hellwig <[email protected]> wrote:

You'd have to use module_param for that, but it appears the driver uses the deprectated MODULE_PARAM..

Indeed, that should be fixed. Good catch.