From: Pankaj Gupta <pagupta@redhat.com>
To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org
Cc: davem@davemloft.net, jasowang@redhat.com, mst@redhat.com,
dgibson@redhat.com, vfalico@gmail.com, edumazet@google.com,
vyasevic@redhat.com, hkchu@google.com, wuzhy@linux.vnet.ibm.com,
xemul@parallels.com, therbert@google.com,
bhutchings@solarflare.com, xii@google.com,
stephen@networkplumber.org, Pankaj Gupta <pagupta@redhat.com>
Subject: [RFC 1/4] net: allow large number of rx queues
Date: Mon, 18 Aug 2014 19:07:17 +0530 [thread overview]
Message-ID: <1408369040-1216-2-git-send-email-pagupta@redhat.com> (raw)
In-Reply-To: <1408369040-1216-1-git-send-email-pagupta@redhat.com>
netif_alloc_rx_queues() uses kcalloc() to allocate memory
for "struct netdev_queue *_rx" array.
If we are doing large rx queue allocation kcalloc() might
fail, so this patch does a fallback to vzalloc().
Similar implementation is done for tx queue allocation in
netif_alloc_netdev_queues().
We avoid failure of high order memory allocation
with the help of vzalloc(), this allows us to do large
rx and tx queue allocation which in turn helps us to
increase the number of queues in tun.
As vmalloc() adds overhead on a critical network path,
__GFP_REPEAT flag is used with kzalloc() to do this fallback
only when really needed.
Signed-off-by: Pankaj Gupta <pagupta@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: David Gibson <dgibson@redhat.com>
---
net/core/dev.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/net/core/dev.c b/net/core/dev.c
index 1c15b18..a455a02 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5942,17 +5942,24 @@ 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++)
@@ -6581,9 +6588,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 */
--
1.8.3.1
next prev parent reply other threads:[~2014-08-18 13:37 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-18 13:37 [RFC 0/4] Increase the limit of tuntap queues Pankaj Gupta
2014-08-18 13:37 ` Pankaj Gupta [this message]
2014-08-18 17:43 ` [RFC 1/4] net: allow large number of rx queues Sergei Shtylyov
2014-08-19 5:15 ` Pankaj Gupta
2014-08-18 13:37 ` [RFC 2/4] tuntap: Publish tuntap maximum number of queues as module_param Pankaj Gupta
2014-08-20 10:58 ` Jiri Pirko
2014-08-20 11:17 ` Michael S. Tsirkin
2014-08-20 11:46 ` Jiri Pirko
2014-08-20 11:49 ` Michael S. Tsirkin
2014-08-20 11:53 ` Jiri Pirko
2014-08-21 4:30 ` Jason Wang
2014-08-22 11:52 ` Pankaj Gupta
2014-08-24 11:14 ` Michael S. Tsirkin
2014-08-25 2:57 ` Jason Wang
2014-08-26 15:30 ` Pankaj Gupta
2014-08-18 13:37 ` [RFC 3/4] tuntap: reduce the size of tun_struct by using flex array Pankaj Gupta
2014-08-25 1:35 ` David Gibson
2014-08-18 13:37 ` [RFC 4/4] tuntap: Increase the number of queues in tun Pankaj Gupta
2014-08-25 1:37 ` David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1408369040-1216-2-git-send-email-pagupta@redhat.com \
--to=pagupta@redhat.com \
--cc=bhutchings@solarflare.com \
--cc=davem@davemloft.net \
--cc=dgibson@redhat.com \
--cc=edumazet@google.com \
--cc=hkchu@google.com \
--cc=jasowang@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=stephen@networkplumber.org \
--cc=therbert@google.com \
--cc=vfalico@gmail.com \
--cc=vyasevic@redhat.com \
--cc=wuzhy@linux.vnet.ibm.com \
--cc=xemul@parallels.com \
--cc=xii@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).