Message ID | 1417734048.2721.22.camel@perches.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On Thu, Dec 4, 2014 at 3:00 PM, Joe Perches <joe@perches.com> wrote: > Use the (1 << reg) & mask trick to reduce code size. > > x86-64 size difference -O2 without profiling for various > gcc versions: > > $ size arch/x86/net/bpf_jit_comp.o* > text data bss dec hex filename > 9266 4 0 9270 2436 arch/x86/net/bpf_jit_comp.o.4.4.new > 10042 4 0 10046 273e arch/x86/net/bpf_jit_comp.o.4.4.old > 9109 4 0 9113 2399 arch/x86/net/bpf_jit_comp.o.4.6.new > 9717 4 0 9721 25f9 arch/x86/net/bpf_jit_comp.o.4.6.old > 8789 4 0 8793 2259 arch/x86/net/bpf_jit_comp.o.4.7.new > 10245 4 0 10249 2809 arch/x86/net/bpf_jit_comp.o.4.7.old > 9671 4 0 9675 25cb arch/x86/net/bpf_jit_comp.o.4.9.new > 10679 4 0 10683 29bb arch/x86/net/bpf_jit_comp.o.4.9.old > > Signed-off-by: Joe Perches <joe@perches.com> probably it was worth noting in comment that reg is 4-bit value and AUX_REG==12, so it won't overflow. Dave, it's for net-next of course. Suggested-by: Alexei Starovoitov <ast@plumgrid.com> Tested-by: Alexei Starovoitov <ast@plumgrid.com> -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, 2014-12-04 at 15:00 -0800, Joe Perches wrote: > Use the (1 << reg) & mask trick to reduce code size. > > x86-64 size difference -O2 without profiling for various > gcc versions: > > Signed-off-by: Joe Perches <joe@perches.com> > --- > > compiled, untested by me, but per Alexei Starovoitov this passes > the test_bpf suite Really, the root cause of this is the 'inline' abuse in non fast paths for non trivial functions. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Dec 4, 2014 at 3:14 PM, Eric Dumazet <eric.dumazet@gmail.com> wrote: > On Thu, 2014-12-04 at 15:00 -0800, Joe Perches wrote: >> Use the (1 << reg) & mask trick to reduce code size. >> >> x86-64 size difference -O2 without profiling for various >> gcc versions: > >> >> Signed-off-by: Joe Perches <joe@perches.com> >> --- >> >> compiled, untested by me, but per Alexei Starovoitov this passes >> the test_bpf suite > > Really, the root cause of this is the 'inline' abuse in non fast paths > for non trivial functions. well, it is a trivial function even from compiler point of view. Dropping inline keyword doesn't help. gcc still inlines them. Changing all 3 functions to _noinline_ doesn't help either. So I think this patch is actually quite helpful to reduce code size. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, 2014-12-04 at 15:14 -0800, Eric Dumazet wrote: > On Thu, 2014-12-04 at 15:00 -0800, Joe Perches wrote: > > Use the (1 << reg) & mask trick to reduce code size. [] > Really, the root cause of this is the 'inline' abuse in non fast paths > for non trivial functions. There is no object size change with is_ereg() defined "static inline" or "static" Curiously, if you mark it noinline, the size increases. gcc 4.9.1, x86-64, -O2 no profiling support $ size arch/x86/net/bpf_jit_comp.o.st* text data bss dec hex filename 10679 4 0 10683 29bb arch/x86/net/bpf_jit_comp.o.static_inline 11535 4 0 11539 2d13 arch/x86/net/bpf_jit_comp.o.static_noinline 10679 4 0 10683 29bb arch/x86/net/bpf_jit_comp.o.static_without_inline -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, 2014-12-04 at 15:31 -0800, Alexei Starovoitov wrote: > well, it is a trivial function even from compiler point of view. > Dropping inline keyword doesn't help. gcc still inlines them. > Changing all 3 functions to _noinline_ doesn't help either. > So I think this patch is actually quite helpful to reduce code size. Well, again this might depend on CONFIG_CC_OPTIMIZE_FOR_SIZE I guess people trying to get very small kernels are using this option. My point was : If we care about code size, we should also remove these inline keywords at the same time, to increase SNR of netdev/lkml lists. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Joe Perches <joe@perches.com> Date: Thu, 04 Dec 2014 15:00:48 -0800 > Use the (1 << reg) & mask trick to reduce code size. > > x86-64 size difference -O2 without profiling for various > gcc versions: > > $ size arch/x86/net/bpf_jit_comp.o* > text data bss dec hex filename > 9266 4 0 9270 2436 arch/x86/net/bpf_jit_comp.o.4.4.new > 10042 4 0 10046 273e arch/x86/net/bpf_jit_comp.o.4.4.old > 9109 4 0 9113 2399 arch/x86/net/bpf_jit_comp.o.4.6.new > 9717 4 0 9721 25f9 arch/x86/net/bpf_jit_comp.o.4.6.old > 8789 4 0 8793 2259 arch/x86/net/bpf_jit_comp.o.4.7.new > 10245 4 0 10249 2809 arch/x86/net/bpf_jit_comp.o.4.7.old > 9671 4 0 9675 25cb arch/x86/net/bpf_jit_comp.o.4.9.new > 10679 4 0 10683 29bb arch/x86/net/bpf_jit_comp.o.4.9.old > > Signed-off-by: Joe Perches <joe@perches.com> Applied. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 3f62734..09e2cea 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -135,11 +135,11 @@ static const int reg2hex[] = { */ static inline bool is_ereg(u32 reg) { - if (reg == BPF_REG_5 || reg == AUX_REG || - (reg >= BPF_REG_7 && reg <= BPF_REG_9)) - return true; - else - return false; + return (1 << reg) & (BIT(BPF_REG_5) | + BIT(AUX_REG) | + BIT(BPF_REG_7) | + BIT(BPF_REG_8) | + BIT(BPF_REG_9)); } /* add modifiers if 'reg' maps to x64 registers r8..r15 */
Use the (1 << reg) & mask trick to reduce code size. x86-64 size difference -O2 without profiling for various gcc versions: $ size arch/x86/net/bpf_jit_comp.o* text data bss dec hex filename 9266 4 0 9270 2436 arch/x86/net/bpf_jit_comp.o.4.4.new 10042 4 0 10046 273e arch/x86/net/bpf_jit_comp.o.4.4.old 9109 4 0 9113 2399 arch/x86/net/bpf_jit_comp.o.4.6.new 9717 4 0 9721 25f9 arch/x86/net/bpf_jit_comp.o.4.6.old 8789 4 0 8793 2259 arch/x86/net/bpf_jit_comp.o.4.7.new 10245 4 0 10249 2809 arch/x86/net/bpf_jit_comp.o.4.7.old 9671 4 0 9675 25cb arch/x86/net/bpf_jit_comp.o.4.9.new 10679 4 0 10683 29bb arch/x86/net/bpf_jit_comp.o.4.9.old Signed-off-by: Joe Perches <joe@perches.com> --- compiled, untested by me, but per Alexei Starovoitov this passes the test_bpf suite -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html