Skip to contentSkip to conversation

rps: memory leak due to forget to release rx queues

PATCH In review Changli Gao 2 participants 3 messages Mar 23, 2010

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 rps: memory leak due to forget to release rx queues

memory leak due to forget to release rx queues.

rx queues is allocated in alloc_netdev_mq(), but they aren't released in free_netdev(), and the field rps_map is also miss.

----
net/core/dev.c | 8 ++++++++

1 file changed, 8 insertions(+)
net/core/dev.c +8 -0
index c0e2608..51b86e0 100644
@@ -5746,6 +5746,14 @@ void free_netdev(struct net_device *dev)
 
 	release_net(dev_net(dev));
 
+	if (dev->num_rx_queues) {
+		int i;
+
+		for (i = 0; i < dev->num_rx_queues; i++)
+			kfree(dev->_rx[i].rps_map);
+		kfree(dev->_rx);
+	}
+
 	kfree(dev->_tx);
 
 	/* Flush device addresses */
#1 lore raw

2010/3/22 Changli Gao <[email protected]>:

Quoted 5 lines

memory leak due to forget to release rx queues.

rx queues is allocated in alloc_netdev_mq(), but they aren't released in free_netdev(), and the field rps_map is also miss.

rx_queues can't be free from free_netdev since they contain kobjects (only freed when refcnt goes to zero). They should be freed when the device kobject is freed (netdev_unregister_kobject).

Tom

Quoted 27 lines

----
net/core/dev.c | 8 ++++++++

1 file changed, 8 insertions(+)
net/core/dev.c +8 -0
index c0e2608..51b86e0 100644
@@ -5746,6 +5746,14 @@ void free_netdev(struct net_device *dev)
 
        release_net(dev_net(dev));
 
+       if (dev->num_rx_queues) {
+               int i;
+
+               for (i = 0; i < dev->num_rx_queues; i++)
+                       kfree(dev->_rx[i].rps_map);
+               kfree(dev->_rx);
+       }
+
        kfree(dev->_tx);
 
        /* Flush device addresses */
#2 lore raw
Quoted 6 lines · Tom Herbert

2010/3/22 Changli Gao <[email protected]>:

Quoted 5 lines

memory leak due to forget to release rx queues.

rx queues is allocated in alloc_netdev_mq(), but they aren't released in free_netdev(), and the field rps_map is also miss.

Thanks for explaining.

Signature · 2 lines
Regards,
Changli Gao([email protected])