Skip to content

Commit

Permalink
netem: use vmalloc for distribution table
Browse files Browse the repository at this point in the history
The netem probability table can be large (up to 64K bytes)
which may be too large to allocate in one contiguous chunk.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
stephen hemminger authored and David S. Miller committed Feb 25, 2011
1 parent 861d7f7 commit 6373a9a
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions net/sched/sch_netem.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,23 +308,37 @@ static void netem_reset(struct Qdisc *sch)
qdisc_watchdog_cancel(&q->watchdog);
}

static void dist_free(struct disttable *d)
{
if (d) {
if (is_vmalloc_addr(d))
vfree(d);
else
kfree(d);
}
}

/*
* Distribution data is a variable size payload containing
* signed 16 bit values.
*/
static int get_dist_table(struct Qdisc *sch, const struct nlattr *attr)
{
struct netem_sched_data *q = qdisc_priv(sch);
unsigned long n = nla_len(attr)/sizeof(__s16);
size_t n = nla_len(attr)/sizeof(__s16);
const __s16 *data = nla_data(attr);
spinlock_t *root_lock;
struct disttable *d;
int i;
size_t s;

if (n > 65536)
return -EINVAL;

d = kmalloc(sizeof(*d) + n*sizeof(d->table[0]), GFP_KERNEL);
s = sizeof(struct disttable) + n * sizeof(s16);
d = kmalloc(s, GFP_KERNEL);
if (!d)
d = vmalloc(s);
if (!d)
return -ENOMEM;

Expand All @@ -335,7 +349,7 @@ static int get_dist_table(struct Qdisc *sch, const struct nlattr *attr)
root_lock = qdisc_root_sleeping_lock(sch);

spin_lock_bh(root_lock);
kfree(q->delay_dist);
dist_free(q->delay_dist);
q->delay_dist = d;
spin_unlock_bh(root_lock);
return 0;
Expand Down Expand Up @@ -556,7 +570,7 @@ static void netem_destroy(struct Qdisc *sch)

qdisc_watchdog_cancel(&q->watchdog);
qdisc_destroy(q->qdisc);
kfree(q->delay_dist);
dist_free(q->delay_dist);
}

static int netem_dump(struct Qdisc *sch, struct sk_buff *skb)
Expand Down

0 comments on commit 6373a9a

Please sign in to comment.