]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/core/net-sysfs.c
net: Allow changing number of RX queues after device allocation
[net-next-2.6.git] / net / core / net-sysfs.c
index 76485a3f910bf00446131687c018ab8b044ca691..fa81fd0a488f79e6f8730e63e3c6a6aed7a1774a 100644 (file)
@@ -742,34 +742,38 @@ static int rx_queue_add_kobject(struct net_device *net, int index)
        return error;
 }
 
-static int rx_queue_register_kobjects(struct net_device *net)
+int
+net_rx_queue_update_kobjects(struct net_device *net, int old_num, int new_num)
 {
        int i;
        int error = 0;
 
-       net->queues_kset = kset_create_and_add("queues",
-           NULL, &net->dev.kobj);
-       if (!net->queues_kset)
-               return -ENOMEM;
-       for (i = 0; i < net->num_rx_queues; i++) {
+       for (i = old_num; i < new_num; i++) {
                error = rx_queue_add_kobject(net, i);
-               if (error)
+               if (error) {
+                       new_num = old_num;
                        break;
+               }
        }
 
-       if (error)
-               while (--i >= 0)
-                       kobject_put(&net->_rx[i].kobj);
+       while (--i >= new_num)
+               kobject_put(&net->_rx[i].kobj);
 
        return error;
 }
 
-static void rx_queue_remove_kobjects(struct net_device *net)
+static int rx_queue_register_kobjects(struct net_device *net)
 {
-       int i;
+       net->queues_kset = kset_create_and_add("queues",
+           NULL, &net->dev.kobj);
+       if (!net->queues_kset)
+               return -ENOMEM;
+       return net_rx_queue_update_kobjects(net, 0, net->real_num_rx_queues);
+}
 
-       for (i = 0; i < net->num_rx_queues; i++)
-               kobject_put(&net->_rx[i].kobj);
+static void rx_queue_remove_kobjects(struct net_device *net)
+{
+       net_rx_queue_update_kobjects(net, net->real_num_rx_queues, 0);
        kset_unregister(net->queues_kset);
 }
 #endif /* CONFIG_RPS */