Message ID | 1416327778-17716-2-git-send-email-pagupta@redhat.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On Tue, Nov 18, 2014 at 8:22 AM, Pankaj Gupta <pagupta@redhat.com> wrote: > > As vmalloc() adds overhead on a critical network path, > __GFP_REPEAT flag is used with kzalloc() to do this fallback > only when really needed. > Are you sure we need __GFP_REPEAT? We have vmalloc() as fallback of kmalloc() in many places of networking (grep kvfree), none of those I checked has this flag set. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> On Tue, Nov 18, 2014 at 8:22 AM, Pankaj Gupta <pagupta@redhat.com> wrote: > > > > As vmalloc() adds overhead on a critical network path, > > __GFP_REPEAT flag is used with kzalloc() to do this fallback > > only when really needed. > > > > Are you sure we need __GFP_REPEAT? We have vmalloc() as > fallback of kmalloc() in many places of networking (grep kvfree), > none of those I checked has this flag set. Its there in netif_alloc_netdev_queues() function in same file. Also, I found it some other places as well. I think its good to have. > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/core/dev.c b/net/core/dev.c index e916ba8..abe9560 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -6059,17 +6059,25 @@ void netif_stacked_transfer_operstate(const struct net_device *rootdev, EXPORT_SYMBOL(netif_stacked_transfer_operstate); #ifdef CONFIG_SYSFS +static void netif_free_rx_queues(struct net_device *dev) +{ + kvfree(dev->_rx); +} + static int netif_alloc_rx_queues(struct net_device *dev) { unsigned int i, count = dev->num_rx_queues; struct netdev_rx_queue *rx; + size_t sz = count * sizeof(*rx); BUG_ON(count < 1); - rx = kcalloc(count, sizeof(struct netdev_rx_queue), GFP_KERNEL); - if (!rx) - return -ENOMEM; - + rx = kzalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT); + if (!rx) { + rx = vzalloc(sz); + if (!rx) + return -ENOMEM; + } dev->_rx = rx; for (i = 0; i < count; i++) @@ -6698,9 +6706,8 @@ void free_netdev(struct net_device *dev) netif_free_tx_queues(dev); #ifdef CONFIG_SYSFS - kfree(dev->_rx); + netif_free_rx_queues(dev); #endif - kfree(rcu_dereference_protected(dev->ingress_queue, 1)); /* Flush device addresses */