[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <87ocxox0bu.fsf@basil.nowhere.org>
Date: Fri, 30 Jan 2009 16:47:33 +0100
From: Andi Kleen <andi@...stfloor.org>
To: Eric Dumazet <dada1@...mosbay.com>
Cc: Patrick McHardy <kaber@...sh.net>,
"David S. Miller" <davem@...emloft.net>,
Netfilter Developers <netfilter-devel@...r.kernel.org>,
Linux Network Development list <netdev@...r.kernel.org>
Subject: Re: [PATCH] netfilter: unfold two critical loops in ip_packet_match()
Eric Dumazet <dada1@...mosbay.com> writes:
> While doing oprofile tests I noticed two loops are not properly unrolled by gcc
That's because nobody passed -funroll-loops. Did you try that for
that file? Likely will need -O2 too
> +static unsigned long ifname_compare(const void *_a, const void *_b, const void *_mask)
> +{
> + const unsigned long *a = (const unsigned long *)_a;
> + const unsigned long *b = (const unsigned long *)_b;
> + const unsigned long *mask = (const unsigned long *)_mask;
> + unsigned long ret;
> +
> + ret = (a[0] ^ b[0]) & mask[0];
> + ret |= (a[1] ^ b[1]) & mask[1];
> + if (IFNAMSIZ > 2 * sizeof(unsigned long))
> + ret |= (a[2] ^ b[2]) & mask[2];
> + if (IFNAMSIZ > 3 * sizeof(unsigned long))
> + ret |= (a[3] ^ b[3]) & mask[3];
That will silently break for IFNAMSIZ >= 4*sizeof(unsigned long)
You should add a dummy loop for that or at least a BUILD_BUG_ON
-Andi
--
ak@...ux.intel.com -- Speaking for myself only.
--
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