* Maksym Planeta <mcsim.planeta@xxxxxxxxx> wrote: > For x86 architecture get_order function can be optimized due to > assembler instruction bsr. > > This is second version of patch where for constants gcc precompute the > result. > > Signed-off-by: Maksym Planeta <mcsim.planeta@xxxxxxxxx> > --- > arch/x86/include/asm/getorder.h | 48 +++++++++++++++++++++++++++++++++++++++ > arch/x86/include/asm/page.h | 2 +- > 2 files changed, 49 insertions(+), 1 deletions(-) > create mode 100644 arch/x86/include/asm/getorder.h > > diff --git a/arch/x86/include/asm/getorder.h b/arch/x86/include/asm/getorder.h > new file mode 100644 > index 0000000..b0c6f57 > --- /dev/null > +++ b/arch/x86/include/asm/getorder.h > @@ -0,0 +1,48 @@ > +#ifndef __ASM_GENERIC_GETORDER_H > +#define __ASM_GENERIC_GETORDER_H > + > +#ifndef __ASSEMBLY__ > + > +#include <linux/compiler.h> > + > +#ifdef CONFIG_X86_CMOV > +#define ASM_CMOVZ(op, dest) \ > + "cmovzl %" #op ",%" #dest ";\n\t" > +#else > +#define ASM_CMOVZ(op, dest) \ > + "jnz 1f;\n\t" \ > + "movl %" #op ", %" #dest ";\n\t" \ > + "1: " > +#endif > + > +static __always_inline int __get_order(unsigned long size) > +{ > + int order; > + > + size = (size - 1) >> (PAGE_SHIFT - 1); > + asm("bsr %1, %0\n\t" > + ASM_CMOVZ(2, 0) > + : "=&r" (order) : "rm" (size), "rm" (0)); > + return order; > +} > + > +/* Pure 2^n version of get_order */ > +static inline __attribute_const__ int get_order(unsigned long size) > +{ > + int order; > + > + if (__builtin_constant_p(size)) { > + size = (size - 1) >> (PAGE_SHIFT - 1); > + order = -1; > + do { > + size >>= 1; > + order++; > + } while (size); > + return order; > + } > + return __get_order(size); > +} > + > +#endif /* __ASSEMBLY__ */ > + > +#endif /* __ASM_GENERIC_GETORDER_H */ > diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h > index 8ca8283..10e4c45 100644 > --- a/arch/x86/include/asm/page.h > +++ b/arch/x86/include/asm/page.h > @@ -63,7 +63,7 @@ extern bool __virt_addr_valid(unsigned long kaddr); > #endif /* __ASSEMBLY__ */ > > #include <asm-generic/memory_model.h> > -#include <asm-generic/getorder.h> > +#include <asm/getorder.h> Just wondering, what's the before/after 'size vmlinux' effect on a 'make defconfig' x86 kernel? Does the optimization make the kernel smaller as well, besides making it faster? Thanks, Ingo -- To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html