On 7/8/20 9:38 AM, YU, Xiangning wrote:
> Lockless Token Bucket (LTB) is a qdisc implementation that controls the
> use of outbound bandwidth on a shared link. With the help of lockless
> qdisc, and by decoupling rate limiting and bandwidth sharing, LTB is
> designed to scale in the cloud data centers.
> 

...

This ltb_class struct has a size of 1579584 bytes :/

> +struct ltb_class {
> +     struct Qdisc_class_common common;
> +     struct psched_ratecfg ratecfg;
> +     struct psched_ratecfg ceilcfg;
> +     u32 prio;
> +     struct ltb_class *parent;
> +     struct Qdisc *qdisc;
> +     struct Qdisc *root_qdisc;
> +     u32 classid;
> +     struct list_head pnode;
> +     unsigned long state; ____cacheline_aligned_in_smp
> +
> +     /* Aggr/drain context only */
> +     s64 next_timestamp; ____cacheline_aligned_in_smp
> +     int num_cpus;
> +     int last_cpu;
> +     s64 bw_used;
> +     s64 last_bytes;
> +     s64 last_timestamp;
> +     s64 stat_bytes;
> +     s64 stat_packets;
> +     atomic64_t stat_drops;
> +
> +     /* Balance delayed work only */
> +     s64 rate; ____cacheline_aligned_in_smp
> +     s64 ceil;
> +     s64 high_water;
> +     int drop_delay;
> +     s64 bw_allocated;
> +     bool want_more;
> +
> +     /* Shared b/w aggr/drain thread and balancer */
> +     unsigned long curr_interval; ____cacheline_aligned_in_smp
> +     s64 bw_measured;        /* Measured actual bandwidth */
> +     s64 maxbw;      /* Calculated bandwidth */
> +
> +     STRUCT_KFIFO(struct sk_buff *, SKB_QLEN) aggr_queues[MAX_CPU_COUNT];
> +     ____cacheline_aligned_in_smp
> +     STRUCT_KFIFO(struct sk_buff *, SKB_QLEN * MAX_CPU_COUNT) drain_queue;
> +     ____cacheline_aligned_in_smp
> +     STRUCT_KFIFO(struct sk_buff *, SKB_QLEN) fanout_queues[MAX_CPU_COUNT];
> +     ____cacheline_aligned_in_smp
> +
> +     struct tasklet_struct aggr_tasklet;
> +     struct hrtimer aggr_timer;
> +};
> +
>

> +
> +static struct ltb_class *ltb_alloc_class(struct Qdisc *sch,
> +                                      struct ltb_class *parent, u32 classid,
> +                                      struct psched_ratecfg *ratecfg,
> +                                      struct psched_ratecfg *ceilcfg,
> +                                      u32 prio)
> +{
> +     struct ltb_sched *ltb  = qdisc_priv(sch);
> +     struct ltb_class *cl;
> +     int i;
> +
> +     if (ratecfg->rate_bytes_ps > ceilcfg->rate_bytes_ps ||
> +         prio < 0 || prio >= TC_LTB_NUMPRIO)
> +             return NULL;
> +
> +     cl = kzalloc(sizeof(*cl), GFP_KERNEL);

This is going to fail, 2MB chunks of physically contiguous memory is 
unreasonable.

2MB per class makes this qdisc very particular, especially with 1000 classes ?

In comparison, HTB class consumes less than 1 KB


Reply via email to