lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sun, 16 Mar 2014 09:06:30 -0700 From: Eric Dumazet <eric.dumazet@...il.com> To: David Miller <davem@...emloft.net> Cc: John Fastabend <john.fastabend@...il.com>, netdev@...r.kernel.org, Thomas Graf <tgraf@...g.ch> Subject: [PATCH net-next] net: sched: use no more than one page in struct fw_head From: Eric Dumazet <edumazet@...gle.com> In commit b4e9b520ca5d ("[NET_SCHED]: Add mask support to fwmark classifier") Patrick added an u32 field in fw_head, making it slightly bigger than one page. Change the layout of this structure and let compiler emit a reciprocal divide for fw_hash(), as this makes the core more readable and more efficient those days. This brings back the memory usage to a single page, and permits John to add a rcu_head later without any worry. Signed-off-by: Eric Dumazet <edumazet@...gle.com> Cc: Thomas Graf <tgraf@...g.ch> Cc: John Fastabend <john.fastabend@...il.com> --- net/sched/cls_fw.c | 38 ++++++++++---------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c index a366537f82c6..e054adafe836 100644 --- a/net/sched/cls_fw.c +++ b/net/sched/cls_fw.c @@ -29,13 +29,16 @@ #include <net/act_api.h> #include <net/pkt_cls.h> -#define HTSIZE (PAGE_SIZE/sizeof(struct fw_filter *)) - struct fw_head { - struct fw_filter *ht[HTSIZE]; - u32 mask; + u32 mask; + struct fw_filter *ht[0]; }; +#define FW_HEAD_SIZE PAGE_SIZE + +#define HTSIZE ((FW_HEAD_SIZE - sizeof(struct fw_head)) / \ + sizeof(struct fw_filter *)) + struct fw_filter { struct fw_filter *next; u32 id; @@ -46,30 +49,9 @@ struct fw_filter { struct tcf_exts exts; }; -static inline int fw_hash(u32 handle) +static u32 fw_hash(u32 handle) { - if (HTSIZE == 4096) - return ((handle >> 24) & 0xFFF) ^ - ((handle >> 12) & 0xFFF) ^ - (handle & 0xFFF); - else if (HTSIZE == 2048) - return ((handle >> 22) & 0x7FF) ^ - ((handle >> 11) & 0x7FF) ^ - (handle & 0x7FF); - else if (HTSIZE == 1024) - return ((handle >> 20) & 0x3FF) ^ - ((handle >> 10) & 0x3FF) ^ - (handle & 0x3FF); - else if (HTSIZE == 512) - return (handle >> 27) ^ - ((handle >> 18) & 0x1FF) ^ - ((handle >> 9) & 0x1FF) ^ - (handle & 0x1FF); - else if (HTSIZE == 256) { - u8 *t = (u8 *) &handle; - return t[0] ^ t[1] ^ t[2] ^ t[3]; - } else - return handle & (HTSIZE - 1); + return handle % HTSIZE; } static int fw_classify(struct sk_buff *skb, const struct tcf_proto *tp, @@ -266,7 +248,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb, if (tb[TCA_FW_MASK]) mask = nla_get_u32(tb[TCA_FW_MASK]); - head = kzalloc(sizeof(struct fw_head), GFP_KERNEL); + head = kzalloc(FW_HEAD_SIZE, GFP_KERNEL); if (head == NULL) return -ENOBUFS; head->mask = mask; -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists