|
@@ -1139,6 +1139,7 @@ static int macvlan_port_create(struct net_device *dev)
|
|
|
static void macvlan_port_destroy(struct net_device *dev)
|
|
|
{
|
|
|
struct macvlan_port *port = macvlan_port_get_rtnl(dev);
|
|
|
+ struct sk_buff *skb;
|
|
|
|
|
|
dev->priv_flags &= ~IFF_MACVLAN_PORT;
|
|
|
netdev_rx_handler_unregister(dev);
|
|
@@ -1147,7 +1148,15 @@ static void macvlan_port_destroy(struct net_device *dev)
|
|
|
* but we need to cancel it and purge left skbs if any.
|
|
|
*/
|
|
|
cancel_work_sync(&port->bc_work);
|
|
|
- __skb_queue_purge(&port->bc_queue);
|
|
|
+
|
|
|
+ while ((skb = __skb_dequeue(&port->bc_queue))) {
|
|
|
+ const struct macvlan_dev *src = MACVLAN_SKB_CB(skb)->src;
|
|
|
+
|
|
|
+ if (src)
|
|
|
+ dev_put(src->dev);
|
|
|
+
|
|
|
+ kfree_skb(skb);
|
|
|
+ }
|
|
|
|
|
|
kfree(port);
|
|
|
}
|