aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_generic.c
diff options
context:
space:
mode:
authorEric Dumazet <eric.dumazet@gmail.com>2011-03-03 14:10:02 -0500
committerDavid S. Miller <davem@davemloft.net>2011-03-03 14:10:02 -0500
commitd276055c4e90a7278cd5167ba9755c9b214bcff7 (patch)
treed99d4e808f880921660dfdf73af8e97e3a6fdba9 /net/sched/sch_generic.c
parentc53fa1ed92cd671a1dfb1e7569e9ab672612ddc6 (diff)
net_sched: reduce fifo qdisc size
Because of various alignements [SLUB / qdisc], we use 512 bytes of memory for one {p|b}fifo qdisc, instead of 256 bytes on 64bit arches and 192 bytes on 32bit ones. Move the "u32 limit" inside "struct Qdisc" (no impact on other qdiscs) Change qdisc_alloc(), first trying a regular allocation before an oversized one. Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_generic.c')
-rw-r--r--net/sched/sch_generic.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 0da09d508737..a854cab03f1e 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -550,21 +550,25 @@ struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
550{ 550{
551 void *p; 551 void *p;
552 struct Qdisc *sch; 552 struct Qdisc *sch;
553 unsigned int size; 553 unsigned int size = QDISC_ALIGN(sizeof(*sch)) + ops->priv_size;
554 int err = -ENOBUFS; 554 int err = -ENOBUFS;
555 555
556 /* ensure that the Qdisc and the private data are 64-byte aligned */
557 size = QDISC_ALIGN(sizeof(*sch));
558 size += ops->priv_size + (QDISC_ALIGNTO - 1);
559
560 p = kzalloc_node(size, GFP_KERNEL, 556 p = kzalloc_node(size, GFP_KERNEL,
561 netdev_queue_numa_node_read(dev_queue)); 557 netdev_queue_numa_node_read(dev_queue));
562 558
563 if (!p) 559 if (!p)
564 goto errout; 560 goto errout;
565 sch = (struct Qdisc *) QDISC_ALIGN((unsigned long) p); 561 sch = (struct Qdisc *) QDISC_ALIGN((unsigned long) p);
566 sch->padded = (char *) sch - (char *) p; 562 /* if we got non aligned memory, ask more and do alignment ourself */
567 563 if (sch != p) {
564 kfree(p);
565 p = kzalloc_node(size + QDISC_ALIGNTO - 1, GFP_KERNEL,
566 netdev_queue_numa_node_read(dev_queue));
567 if (!p)
568 goto errout;
569 sch = (struct Qdisc *) QDISC_ALIGN((unsigned long) p);
570 sch->padded = (char *) sch - (char *) p;
571 }
568 INIT_LIST_HEAD(&sch->list); 572 INIT_LIST_HEAD(&sch->list);
569 skb_queue_head_init(&sch->q); 573 skb_queue_head_init(&sch->q);
570 spin_lock_init(&sch->busylock); 574 spin_lock_init(&sch->busylock);