get_order() cleanup
Subsystems (2)
RFC 1/1 get_order() cleanup
I wrote a patch to clean up get_order(). When I'd done a rough cut of it I did some google searches and found that Andrey Panin had already wrote a nearly equivelant patch (down to some of the same identifier names :-) over a year ago for kernel 2.5.10:
http://www.ussg.iu.edu/hypermail/linux/kernel/0204.3/0720.html
I combined some ideas from his patch into mine. He really deserves the credit since he came up with it first.
Anyway, all architectures but two (ia64, ppc) use the same get_order() inline function in asm-*/page.h. This patch adds a asm-generic/get_order.h file that all of them now #include.
1. For the majority of archs that DON'T have their own assembly version of get_order() we now provide it in one place - lib/get_order.c
This is one place where my patch is different than Andrey's - he left it as an inline like it is currently. I personally don't think it's worth inlining - it IS very short (22 bytes on i386) but it's still longer than a function call. It's rarely (if ever) called from performance cricial points. Usually it's just used in setup/teardown code.
Architectures with inline-assembly implementations of get_order() continue to use them instead.
2. We now compute get_order(CONSTANT) at compile-time. There aren't too many cases of this, but there are some. Now that it's free it may get useful in more places.
When Andrey posted his patch it didn't seem to generate any discussion. Any interest this time?
-Mitch
include/asm-alpha/page.h +1 -13
@@ -59,19 +59,7 @@#endif /* STRICT_MM_TYPECHECKS */ -/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #endif /* !__ASSEMBLY__ */
include/asm-arm/page.h +1 -14
@@ -160,20 +160,7 @@#ifdef __KERNEL__#ifndef __ASSEMBLY__ -/* Pure 2^n version of get_order */ -static inline int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} - +#include <asm-generic/get_order.h> #include <asm/memory.h> #endif /* !__ASSEMBLY__ */
include/asm-arm26/page.h +1 -14
@@ -89,20 +89,7 @@#ifdef __KERNEL__#ifndef __ASSEMBLY__ -/* Pure 2^n version of get_order */ -static inline int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} - +#include <asm-generic/get_order.h> #include <asm/memory.h> #endif /* !__ASSEMBLY__ */
include/asm-cris/page.h +1 -13
@@ -74,19 +74,7 @@#endif /* __ASSEMBLY__ */ -/* Pure 2^n version of get_order */ -static inline int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
include/asm-generic/get_order.h +42 -0
42 lines not on this page · raw message
include/asm-h8300/page.h +1 -13
@@ -51,19 +51,7 @@/* to align the pointer to the (next) page boundary */ #define PAGE_ALIGN (addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) -/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> extern unsigned long memory_start;extern unsigned long memory_end;
include/asm-i386/page.h +1 -13
@@ -98,19 +98,7 @@#ifndef __ASSEMBLY__ -/* Pure 2^n version of get_order */ -static __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #endif /* __ASSEMBLY__ */
include/asm-ia64/page.h +3 -1
@@ -138,7 +138,7 @@#endif static __inline__int -get_order (unsigned long size) +__get_order (unsigned long size) {double d = size -1 ;long order;
@@ -149,6 +149,8 @@ order =0 ;return order; } +#define __HAVE_ARCH_GET_ORDER +#include <asm-generic/get_order.h> # endif /* __KERNEL__ */ #endif /* !__ASSEMBLY__ */
include/asm-m68k/page.h +1 -13
@@ -109,19 +109,7 @@/* to align the pointer to the (next) page boundary */ #define PAGE_ALIGN (addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) -/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #endif /* !__ASSEMBLY__ */
include/asm-m68knommu/page.h +1 -13
@@ -51,19 +51,7 @@/* to align the pointer to the (next) page boundary */ #define PAGE_ALIGN (addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) -/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> extern unsigned long memory_start;extern unsigned long memory_end;
include/asm-mips/page.h +1 -13
@@ -81,19 +81,7 @@#define __pgd (x) ((pgd_t) { (x) } )#define __pgprot (x) ((pgprot_t) { (x) } ) -/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #endif /* !__ASSEMBLY__ */
include/asm-mips64/page.h +1 -13
@@ -76,19 +76,7 @@#define __pgd (x) ((pgd_t) { (x) } )#define __pgprot (x) ((pgprot_t) { (x) } ) -/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #endif /* !__ASSEMBLY__ */
include/asm-parisc/page.h +1 -13
@@ -53,19 +53,7 @@#define __pgd (x) ((pgd_t) { (x) } )#define __pgprot (x) ((pgprot_t) { (x) } ) -/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #ifdef __LP64__#define MAX_PHYSMEM_RANGES 8/* Fix the size for now (current known max is 3) */
include/asm-ppc/page.h +3 -1
@@ -128,7 +128,7 @@#define virt_addr_valid (kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) +extern __inline__int __get_order (unsigned long size) {int lz;
@@ -136,6 +136,8 @@ asm ("cntlzw %0,%1" :"=r" (lz) :"r" (size)); return 32 - lz; } +#define __HAVE_ARCH_GET_ORDER +#include <asm-generic/get_order.h> #endif /* __ASSEMBLY__ */
include/asm-ppc64/page.h +1 -13
@@ -113,19 +113,7 @@#endif -/* Pure 2^n version of get_order */ -static inline int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #define __pa (x) ((unsigned long)(x)-PAGE_OFFSET)
include/asm-s390/page.h +1 -13
@@ -106,19 +106,7 @@#define clear_user_page (page, vaddr, pg) clear_page(page)#define copy_user_page (to, from, vaddr, pg) copy_page(to, from) -/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> /* * These are used to make use of C type-checking..
include/asm-sh/page.h +1 -13
@@ -102,19 +102,7 @@#ifndef __ASSEMBLY__ -/* Pure 2^n version of get_order */ -static __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #endif
include/asm-sparc/page.h +1 -13
@@ -132,19 +132,7 @@#define TASK_UNMAPPED_BASE BTFIXUP_SETHI(sparc_unmapped_base) -/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #else /* !(__ASSEMBLY__) */
include/asm-sparc64/page.h +1 -13
@@ -149,19 +149,7 @@extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS ]; -/* Pure 2^n version of get_order */ -static __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #endif /* !(__ASSEMBLY__) */
include/asm-v850/page.h +1 -13
@@ -100,19 +100,7 @@#ifndef __ASSEMBLY__ -/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #endif /* !__ASSEMBLY__ */
include/asm-x86_64/page.h +1 -13
@@ -86,19 +86,7 @@#include <asm/bug.h> -/* Pure 2^n version of get_order */ -extern __inline__int get_order (unsigned long size) -{ -int order; - - size = (size-1 ) >> (PAGE_SHIFT -1 ); - order =-1 ; -do { - size >>=1 ; - order++; - }while (size); -return order; -} +#include <asm-generic/get_order.h> #endif /* __ASSEMBLY__ */
lib/get_order.c +25 -0
@@ -0,0 +1,25 @@ +/* +* linux/lib/get_order.c +* +* See <asm-generic/get_order.h> for information about this function +*/ + +#include <linux/module.h> +#include <asm/page.h> + +#ifndef __HAVE_ARCH_GET_ORDER + +int __get_order (unsigned long size) +{ +int order =-1 ; + + size = (size -1 ) >> (PAGE_SHIFT -1 ); +do { + size >>=1 ; + order++; + }while (size !=0 ); +return order; +} +EXPORT_SYMBOL (__get_order); + +#endif /* !__HAVE_ARCH_GET_ORDER */
lib/Makefile +1 -1
@@ -5,7 +5,7 @@ lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \ bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \ - kobject.o idr.o div64.o + kobject.o idr.o div64.o get_order.o lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o