Commit 40964cc0 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller

[PKT_SCHED]: cacheline-align qdisc data in qdisc_create()

Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@redhat.com>
parent 1c864127
......@@ -389,7 +389,8 @@ qdisc_create(struct net_device *dev, u32 handle, struct rtattr **tca, int *errp)
{
int err;
struct rtattr *kind = tca[TCA_KIND-1];
struct Qdisc *sch = NULL;
void *p = NULL;
struct Qdisc *sch;
struct Qdisc_ops *ops;
int size;
......@@ -407,12 +408,18 @@ qdisc_create(struct net_device *dev, u32 handle, struct rtattr **tca, int *errp)
if (ops == NULL)
goto err_out;
size = sizeof(*sch) + ops->priv_size;
/* ensure that the Qdisc and the private data are 32-byte aligned */
size = ((sizeof(*sch) + QDISC_ALIGN_CONST) & ~QDISC_ALIGN_CONST);
size += ops->priv_size + QDISC_ALIGN_CONST;
sch = kmalloc(size, GFP_KERNEL);
p = kmalloc(size, GFP_KERNEL);
err = -ENOBUFS;
if (!sch)
if (!p)
goto err_out;
memset(p, 0, size);
sch = (struct Qdisc *)(((unsigned long)p + QDISC_ALIGN_CONST)
& ~QDISC_ALIGN_CONST);
sch->padded = (char *)sch - (char *)p;
/* Grrr... Resolve race condition with module unload */
......@@ -420,8 +427,6 @@ qdisc_create(struct net_device *dev, u32 handle, struct rtattr **tca, int *errp)
if (ops != qdisc_lookup_ops(kind))
goto err_out;
memset(sch, 0, size);
INIT_LIST_HEAD(&sch->list);
skb_queue_head_init(&sch->q);
......@@ -470,8 +475,8 @@ qdisc_create(struct net_device *dev, u32 handle, struct rtattr **tca, int *errp)
err_out:
*errp = err;
if (sch)
kfree(sch);
if (p)
kfree(p);
return NULL;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment