diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-03-03 14:10:02 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-03-03 14:10:02 -0500 |
commit | d276055c4e90a7278cd5167ba9755c9b214bcff7 (patch) | |
tree | d99d4e808f880921660dfdf73af8e97e3a6fdba9 /net/sched/sch_generic.c | |
parent | c53fa1ed92cd671a1dfb1e7569e9ab672612ddc6 (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.c | 18 |
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); |