diff options
author | David Howells <dhowells@redhat.com> | 2006-12-08 05:37:49 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-08 11:28:51 -0500 |
commit | f0d1b0b30d250a07627ad8b9fbbb5c7cc08422e8 (patch) | |
tree | 0aa5379150574374351fb92af7881a48dbfcf2ce | |
parent | b3d7ae5f47a58a9f7b152deeaf7daa1fc558a8f1 (diff) |
[PATCH] LOG2: Implement a general integer log2 facility in the kernel
This facility provides three entry points:
ilog2() Log base 2 of unsigned long
ilog2_u32() Log base 2 of u32
ilog2_u64() Log base 2 of u64
These facilities can either be used inside functions on dynamic data:
int do_something(long q)
{
...;
y = ilog2(x)
...;
}
Or can be used to statically initialise global variables with constant values:
unsigned n = ilog2(27);
When performing static initialisation, the compiler will report "error:
initializer element is not constant" if asked to take a log of zero or of
something not reducible to a constant. They treat negative numbers as
unsigned.
When not dealing with a constant, they fall back to using fls() which permits
them to use arch-specific log calculation instructions - such as BSR on
x86/x86_64 or SCAN on FRV - if available.
[akpm@osdl.org: MMC fix]
Signed-off-by: David Howells <dhowells@redhat.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: David Howells <dhowells@redhat.com>
Cc: Wojtek Kaniewski <wojtekka@toxygen.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
36 files changed, 384 insertions, 28 deletions
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 7e55ea66c6d4..84caf50725b5 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
@@ -25,6 +25,14 @@ config RWSEM_XCHGADD_ALGORITHM | |||
25 | bool | 25 | bool |
26 | default y | 26 | default y |
27 | 27 | ||
28 | config ARCH_HAS_ILOG2_U32 | ||
29 | bool | ||
30 | default n | ||
31 | |||
32 | config ARCH_HAS_ILOG2_U64 | ||
33 | bool | ||
34 | default n | ||
35 | |||
28 | config GENERIC_FIND_NEXT_BIT | 36 | config GENERIC_FIND_NEXT_BIT |
29 | bool | 37 | bool |
30 | default y | 38 | default y |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 8c05d4321ae9..aa1d400d721a 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -74,6 +74,14 @@ config RWSEM_GENERIC_SPINLOCK | |||
74 | config RWSEM_XCHGADD_ALGORITHM | 74 | config RWSEM_XCHGADD_ALGORITHM |
75 | bool | 75 | bool |
76 | 76 | ||
77 | config ARCH_HAS_ILOG2_U32 | ||
78 | bool | ||
79 | default n | ||
80 | |||
81 | config ARCH_HAS_ILOG2_U64 | ||
82 | bool | ||
83 | default n | ||
84 | |||
77 | config GENERIC_HWEIGHT | 85 | config GENERIC_HWEIGHT |
78 | bool | 86 | bool |
79 | default y | 87 | default y |
diff --git a/arch/arm26/Kconfig b/arch/arm26/Kconfig index c14fe918bc4c..74eba8b5a8ca 100644 --- a/arch/arm26/Kconfig +++ b/arch/arm26/Kconfig | |||
@@ -41,6 +41,14 @@ config RWSEM_GENERIC_SPINLOCK | |||
41 | config RWSEM_XCHGADD_ALGORITHM | 41 | config RWSEM_XCHGADD_ALGORITHM |
42 | bool | 42 | bool |
43 | 43 | ||
44 | config ARCH_HAS_ILOG2_U32 | ||
45 | bool | ||
46 | default n | ||
47 | |||
48 | config ARCH_HAS_ILOG2_U64 | ||
49 | bool | ||
50 | default n | ||
51 | |||
44 | config GENERIC_HWEIGHT | 52 | config GENERIC_HWEIGHT |
45 | bool | 53 | bool |
46 | default y | 54 | default y |
diff --git a/arch/avr32/Kconfig b/arch/avr32/Kconfig index 5f1694eea842..bb059a4e1df9 100644 --- a/arch/avr32/Kconfig +++ b/arch/avr32/Kconfig | |||
@@ -45,6 +45,14 @@ config GENERIC_TIME | |||
45 | config RWSEM_XCHGADD_ALGORITHM | 45 | config RWSEM_XCHGADD_ALGORITHM |
46 | bool | 46 | bool |
47 | 47 | ||
48 | config ARCH_HAS_ILOG2_U32 | ||
49 | bool | ||
50 | default n | ||
51 | |||
52 | config ARCH_HAS_ILOG2_U64 | ||
53 | bool | ||
54 | default n | ||
55 | |||
48 | config GENERIC_BUST_SPINLOCK | 56 | config GENERIC_BUST_SPINLOCK |
49 | bool | 57 | bool |
50 | 58 | ||
diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index 6a1238a29d6c..3474309e049c 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig | |||
@@ -16,6 +16,14 @@ config RWSEM_GENERIC_SPINLOCK | |||
16 | config RWSEM_XCHGADD_ALGORITHM | 16 | config RWSEM_XCHGADD_ALGORITHM |
17 | bool | 17 | bool |
18 | 18 | ||
19 | config ARCH_HAS_ILOG2_U32 | ||
20 | bool | ||
21 | default n | ||
22 | |||
23 | config ARCH_HAS_ILOG2_U64 | ||
24 | bool | ||
25 | default n | ||
26 | |||
19 | config GENERIC_FIND_NEXT_BIT | 27 | config GENERIC_FIND_NEXT_BIT |
20 | bool | 28 | bool |
21 | default y | 29 | default y |
diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig index cf1c446e003a..7561d7b72e75 100644 --- a/arch/frv/Kconfig +++ b/arch/frv/Kconfig | |||
@@ -41,6 +41,14 @@ config TIME_LOW_RES | |||
41 | bool | 41 | bool |
42 | default y | 42 | default y |
43 | 43 | ||
44 | config ARCH_HAS_ILOG2_U32 | ||
45 | bool | ||
46 | default y | ||
47 | |||
48 | config ARCH_HAS_ILOG2_U64 | ||
49 | bool | ||
50 | default y | ||
51 | |||
44 | mainmenu "Fujitsu FR-V Kernel Configuration" | 52 | mainmenu "Fujitsu FR-V Kernel Configuration" |
45 | 53 | ||
46 | source "init/Kconfig" | 54 | source "init/Kconfig" |
diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig index cabf0bfffc53..34a84bc4baf5 100644 --- a/arch/h8300/Kconfig +++ b/arch/h8300/Kconfig | |||
@@ -29,6 +29,14 @@ config RWSEM_XCHGADD_ALGORITHM | |||
29 | bool | 29 | bool |
30 | default n | 30 | default n |
31 | 31 | ||
32 | config ARCH_HAS_ILOG2_U32 | ||
33 | bool | ||
34 | default n | ||
35 | |||
36 | config ARCH_HAS_ILOG2_U64 | ||
37 | bool | ||
38 | default n | ||
39 | |||
32 | config GENERIC_FIND_NEXT_BIT | 40 | config GENERIC_FIND_NEXT_BIT |
33 | bool | 41 | bool |
34 | default y | 42 | default y |
diff --git a/arch/i386/Kconfig.cpu b/arch/i386/Kconfig.cpu index 821fd269ca58..2aecfba4ac4f 100644 --- a/arch/i386/Kconfig.cpu +++ b/arch/i386/Kconfig.cpu | |||
@@ -248,6 +248,14 @@ config RWSEM_XCHGADD_ALGORITHM | |||
248 | depends on !M386 | 248 | depends on !M386 |
249 | default y | 249 | default y |
250 | 250 | ||
251 | config ARCH_HAS_ILOG2_U32 | ||
252 | bool | ||
253 | default n | ||
254 | |||
255 | config ARCH_HAS_ILOG2_U64 | ||
256 | bool | ||
257 | default n | ||
258 | |||
251 | config GENERIC_CALIBRATE_DELAY | 259 | config GENERIC_CALIBRATE_DELAY |
252 | bool | 260 | bool |
253 | default y | 261 | default y |
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 75d839715b2f..fcacfe291b9b 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
@@ -34,6 +34,14 @@ config RWSEM_XCHGADD_ALGORITHM | |||
34 | bool | 34 | bool |
35 | default y | 35 | default y |
36 | 36 | ||
37 | config ARCH_HAS_ILOG2_U32 | ||
38 | bool | ||
39 | default n | ||
40 | |||
41 | config ARCH_HAS_ILOG2_U64 | ||
42 | bool | ||
43 | default n | ||
44 | |||
37 | config GENERIC_FIND_NEXT_BIT | 45 | config GENERIC_FIND_NEXT_BIT |
38 | bool | 46 | bool |
39 | default y | 47 | default y |
diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig index 41fd490af3b4..f383dab973f5 100644 --- a/arch/m32r/Kconfig +++ b/arch/m32r/Kconfig | |||
@@ -214,6 +214,14 @@ config RWSEM_XCHGADD_ALGORITHM | |||
214 | bool | 214 | bool |
215 | default n | 215 | default n |
216 | 216 | ||
217 | config ARCH_HAS_ILOG2_U32 | ||
218 | bool | ||
219 | default n | ||
220 | |||
221 | config ARCH_HAS_ILOG2_U64 | ||
222 | bool | ||
223 | default n | ||
224 | |||
217 | config GENERIC_FIND_NEXT_BIT | 225 | config GENERIC_FIND_NEXT_BIT |
218 | bool | 226 | bool |
219 | default y | 227 | default y |
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index 7bc14461a6ac..70a577c89c7c 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig | |||
@@ -17,6 +17,14 @@ config RWSEM_GENERIC_SPINLOCK | |||
17 | config RWSEM_XCHGADD_ALGORITHM | 17 | config RWSEM_XCHGADD_ALGORITHM |
18 | bool | 18 | bool |
19 | 19 | ||
20 | config ARCH_HAS_ILOG2_U32 | ||
21 | bool | ||
22 | default n | ||
23 | |||
24 | config ARCH_HAS_ILOG2_U64 | ||
25 | bool | ||
26 | default n | ||
27 | |||
20 | config GENERIC_HWEIGHT | 28 | config GENERIC_HWEIGHT |
21 | bool | 29 | bool |
22 | default y | 30 | default y |
diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig index aa70dde54228..25993c2a8fbb 100644 --- a/arch/m68knommu/Kconfig +++ b/arch/m68knommu/Kconfig | |||
@@ -25,6 +25,14 @@ config RWSEM_XCHGADD_ALGORITHM | |||
25 | bool | 25 | bool |
26 | default n | 26 | default n |
27 | 27 | ||
28 | config ARCH_HAS_ILOG2_U32 | ||
29 | bool | ||
30 | default n | ||
31 | |||
32 | config ARCH_HAS_ILOG2_U64 | ||
33 | bool | ||
34 | default n | ||
35 | |||
28 | config GENERIC_FIND_NEXT_BIT | 36 | config GENERIC_FIND_NEXT_BIT |
29 | bool | 37 | bool |
30 | default y | 38 | default y |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index d8af858fe3f5..57af8d8cf46f 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -819,6 +819,14 @@ config RWSEM_GENERIC_SPINLOCK | |||
819 | config RWSEM_XCHGADD_ALGORITHM | 819 | config RWSEM_XCHGADD_ALGORITHM |
820 | bool | 820 | bool |
821 | 821 | ||
822 | config ARCH_HAS_ILOG2_U32 | ||
823 | bool | ||
824 | default n | ||
825 | |||
826 | config ARCH_HAS_ILOG2_U64 | ||
827 | bool | ||
828 | default n | ||
829 | |||
822 | config GENERIC_FIND_NEXT_BIT | 830 | config GENERIC_FIND_NEXT_BIT |
823 | bool | 831 | bool |
824 | default y | 832 | default y |
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index d2101237442e..0f9ff618c6d7 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig | |||
@@ -25,6 +25,14 @@ config RWSEM_GENERIC_SPINLOCK | |||
25 | config RWSEM_XCHGADD_ALGORITHM | 25 | config RWSEM_XCHGADD_ALGORITHM |
26 | bool | 26 | bool |
27 | 27 | ||
28 | config ARCH_HAS_ILOG2_U32 | ||
29 | bool | ||
30 | default n | ||
31 | |||
32 | config ARCH_HAS_ILOG2_U64 | ||
33 | bool | ||
34 | default n | ||
35 | |||
28 | config GENERIC_FIND_NEXT_BIT | 36 | config GENERIC_FIND_NEXT_BIT |
29 | bool | 37 | bool |
30 | default y | 38 | default y |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 291c95ac4b31..97c7a212cdda 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -41,6 +41,14 @@ config RWSEM_XCHGADD_ALGORITHM | |||
41 | bool | 41 | bool |
42 | default y | 42 | default y |
43 | 43 | ||
44 | config ARCH_HAS_ILOG2_U32 | ||
45 | bool | ||
46 | default n | ||
47 | |||
48 | config ARCH_HAS_ILOG2_U64 | ||
49 | bool | ||
50 | default n | ||
51 | |||
44 | config GENERIC_HWEIGHT | 52 | config GENERIC_HWEIGHT |
45 | bool | 53 | bool |
46 | default y | 54 | default y |
diff --git a/arch/ppc/Kconfig b/arch/ppc/Kconfig index f76a146cff13..692b5ba53209 100644 --- a/arch/ppc/Kconfig +++ b/arch/ppc/Kconfig | |||
@@ -19,6 +19,14 @@ config RWSEM_XCHGADD_ALGORITHM | |||
19 | bool | 19 | bool |
20 | default y | 20 | default y |
21 | 21 | ||
22 | config ARCH_HAS_ILOG2_U32 | ||
23 | bool | ||
24 | default y | ||
25 | |||
26 | config ARCH_HAS_ILOG2_U64 | ||
27 | bool | ||
28 | default n | ||
29 | |||
22 | config GENERIC_HWEIGHT | 30 | config GENERIC_HWEIGHT |
23 | bool | 31 | bool |
24 | default y | 32 | default y |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 583d9ff0a571..45e47bfb68a9 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -22,6 +22,14 @@ config RWSEM_XCHGADD_ALGORITHM | |||
22 | bool | 22 | bool |
23 | default y | 23 | default y |
24 | 24 | ||
25 | config ARCH_HAS_ILOG2_U32 | ||
26 | bool | ||
27 | default n | ||
28 | |||
29 | config ARCH_HAS_ILOG2_U64 | ||
30 | bool | ||
31 | default n | ||
32 | |||
25 | config GENERIC_HWEIGHT | 33 | config GENERIC_HWEIGHT |
26 | bool | 34 | bool |
27 | default y | 35 | default y |
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index d83d64af31f2..8e24c40662e3 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -59,6 +59,14 @@ config LOCKDEP_SUPPORT | |||
59 | bool | 59 | bool |
60 | default y | 60 | default y |
61 | 61 | ||
62 | config ARCH_HAS_ILOG2_U32 | ||
63 | bool | ||
64 | default n | ||
65 | |||
66 | config ARCH_HAS_ILOG2_U64 | ||
67 | bool | ||
68 | default n | ||
69 | |||
62 | source "init/Kconfig" | 70 | source "init/Kconfig" |
63 | 71 | ||
64 | menu "System type" | 72 | menu "System type" |
diff --git a/arch/sh64/Kconfig b/arch/sh64/Kconfig index 58c678e06667..7bc0744b7ab6 100644 --- a/arch/sh64/Kconfig +++ b/arch/sh64/Kconfig | |||
@@ -39,6 +39,14 @@ config RWSEM_XCHGADD_ALGORITHM | |||
39 | config GENERIC_ISA_DMA | 39 | config GENERIC_ISA_DMA |
40 | bool | 40 | bool |
41 | 41 | ||
42 | config ARCH_HAS_ILOG2_U32 | ||
43 | bool | ||
44 | default n | ||
45 | |||
46 | config ARCH_HAS_ILOG2_U64 | ||
47 | bool | ||
48 | default n | ||
49 | |||
42 | source init/Kconfig | 50 | source init/Kconfig |
43 | 51 | ||
44 | menu "System type" | 52 | menu "System type" |
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 92a7c8a636d3..d0dec1ea2eed 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -166,6 +166,14 @@ config ARCH_MAY_HAVE_PC_FDC | |||
166 | bool | 166 | bool |
167 | default y | 167 | default y |
168 | 168 | ||
169 | config ARCH_HAS_ILOG2_U32 | ||
170 | bool | ||
171 | default n | ||
172 | |||
173 | config ARCH_HAS_ILOG2_U64 | ||
174 | bool | ||
175 | default n | ||
176 | |||
169 | config SUN_PM | 177 | config SUN_PM |
170 | bool | 178 | bool |
171 | default y | 179 | default y |
diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig index b627f8dbcaad..d391d11f245a 100644 --- a/arch/sparc64/Kconfig +++ b/arch/sparc64/Kconfig | |||
@@ -34,6 +34,14 @@ config ARCH_MAY_HAVE_PC_FDC | |||
34 | bool | 34 | bool |
35 | default y | 35 | default y |
36 | 36 | ||
37 | config ARCH_HAS_ILOG2_U32 | ||
38 | bool | ||
39 | default n | ||
40 | |||
41 | config ARCH_HAS_ILOG2_U64 | ||
42 | bool | ||
43 | default n | ||
44 | |||
37 | config AUDIT_ARCH | 45 | config AUDIT_ARCH |
38 | bool | 46 | bool |
39 | default y | 47 | default y |
diff --git a/arch/v850/Kconfig b/arch/v850/Kconfig index 37ec644603ab..bcf825875d17 100644 --- a/arch/v850/Kconfig +++ b/arch/v850/Kconfig | |||
@@ -38,6 +38,14 @@ config TIME_LOW_RES | |||
38 | bool | 38 | bool |
39 | default y | 39 | default y |
40 | 40 | ||
41 | config ARCH_HAS_ILOG2_U32 | ||
42 | bool | ||
43 | default n | ||
44 | |||
45 | config ARCH_HAS_ILOG2_U64 | ||
46 | bool | ||
47 | default n | ||
48 | |||
41 | # Turn off some random 386 crap that can affect device config | 49 | # Turn off some random 386 crap that can affect device config |
42 | config ISA | 50 | config ISA |
43 | bool | 51 | bool |
diff --git a/arch/x86_64/Kconfig b/arch/x86_64/Kconfig index 3254a616c69e..3ac581d17202 100644 --- a/arch/x86_64/Kconfig +++ b/arch/x86_64/Kconfig | |||
@@ -101,6 +101,14 @@ config GENERIC_BUG | |||
101 | default y | 101 | default y |
102 | depends on BUG | 102 | depends on BUG |
103 | 103 | ||
104 | config ARCH_HAS_ILOG2_U32 | ||
105 | bool | ||
106 | default n | ||
107 | |||
108 | config ARCH_HAS_ILOG2_U64 | ||
109 | bool | ||
110 | default n | ||
111 | |||
104 | source "init/Kconfig" | 112 | source "init/Kconfig" |
105 | 113 | ||
106 | 114 | ||
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index c1e69a1f92a4..9eccfbd1b536 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig | |||
@@ -34,6 +34,14 @@ config GENERIC_HARDIRQS | |||
34 | bool | 34 | bool |
35 | default y | 35 | default y |
36 | 36 | ||
37 | config ARCH_HAS_ILOG2_U32 | ||
38 | bool | ||
39 | default n | ||
40 | |||
41 | config ARCH_HAS_ILOG2_U64 | ||
42 | bool | ||
43 | default n | ||
44 | |||
37 | source "init/Kconfig" | 45 | source "init/Kconfig" |
38 | 46 | ||
39 | menu "Processor type and features" | 47 | menu "Processor type and features" |
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c index 21422a3336ad..7ec7c4b937f9 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c | |||
@@ -124,7 +124,7 @@ static int mthca_query_device(struct ib_device *ibdev, | |||
124 | props->max_map_per_fmr = 255; | 124 | props->max_map_per_fmr = 255; |
125 | else | 125 | else |
126 | props->max_map_per_fmr = | 126 | props->max_map_per_fmr = |
127 | (1 << (32 - long_log2(mdev->limits.num_mpts))) - 1; | 127 | (1 << (32 - ilog2(mdev->limits.num_mpts))) - 1; |
128 | 128 | ||
129 | err = 0; | 129 | err = 0; |
130 | out: | 130 | out: |
@@ -816,7 +816,7 @@ static int mthca_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *uda | |||
816 | lkey = ucmd.lkey; | 816 | lkey = ucmd.lkey; |
817 | } | 817 | } |
818 | 818 | ||
819 | ret = mthca_RESIZE_CQ(dev, cq->cqn, lkey, long_log2(entries), &status); | 819 | ret = mthca_RESIZE_CQ(dev, cq->cqn, lkey, ilog2(entries), &status); |
820 | if (status) | 820 | if (status) |
821 | ret = -EINVAL; | 821 | ret = -EINVAL; |
822 | 822 | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index 33e3ba7937f1..d844a2569b47 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c | |||
@@ -636,11 +636,11 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask, | |||
636 | 636 | ||
637 | if (mthca_is_memfree(dev)) { | 637 | if (mthca_is_memfree(dev)) { |
638 | if (qp->rq.max) | 638 | if (qp->rq.max) |
639 | qp_context->rq_size_stride = long_log2(qp->rq.max) << 3; | 639 | qp_context->rq_size_stride = ilog2(qp->rq.max) << 3; |
640 | qp_context->rq_size_stride |= qp->rq.wqe_shift - 4; | 640 | qp_context->rq_size_stride |= qp->rq.wqe_shift - 4; |
641 | 641 | ||
642 | if (qp->sq.max) | 642 | if (qp->sq.max) |
643 | qp_context->sq_size_stride = long_log2(qp->sq.max) << 3; | 643 | qp_context->sq_size_stride = ilog2(qp->sq.max) << 3; |
644 | qp_context->sq_size_stride |= qp->sq.wqe_shift - 4; | 644 | qp_context->sq_size_stride |= qp->sq.wqe_shift - 4; |
645 | } | 645 | } |
646 | 646 | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c index 34d2c4768962..10684da33d58 100644 --- a/drivers/infiniband/hw/mthca/mthca_srq.c +++ b/drivers/infiniband/hw/mthca/mthca_srq.c | |||
@@ -120,7 +120,7 @@ static void mthca_arbel_init_srq_context(struct mthca_dev *dev, | |||
120 | 120 | ||
121 | memset(context, 0, sizeof *context); | 121 | memset(context, 0, sizeof *context); |
122 | 122 | ||
123 | logsize = long_log2(srq->max); | 123 | logsize = ilog2(srq->max); |
124 | context->state_logsize_srqn = cpu_to_be32(logsize << 24 | srq->srqn); | 124 | context->state_logsize_srqn = cpu_to_be32(logsize << 24 | srq->srqn); |
125 | context->lkey = cpu_to_be32(srq->mr.ibmr.lkey); | 125 | context->lkey = cpu_to_be32(srq->mr.ibmr.lkey); |
126 | context->db_index = cpu_to_be32(srq->db_index); | 126 | context->db_index = cpu_to_be32(srq->db_index); |
@@ -213,7 +213,7 @@ int mthca_alloc_srq(struct mthca_dev *dev, struct mthca_pd *pd, | |||
213 | if (!mthca_is_memfree(dev) && (ds > dev->limits.max_desc_sz)) | 213 | if (!mthca_is_memfree(dev) && (ds > dev->limits.max_desc_sz)) |
214 | return -EINVAL; | 214 | return -EINVAL; |
215 | 215 | ||
216 | srq->wqe_shift = long_log2(ds); | 216 | srq->wqe_shift = ilog2(ds); |
217 | 217 | ||
218 | srq->srqn = mthca_alloc(&dev->srq_table.alloc); | 218 | srq->srqn = mthca_alloc(&dev->srq_table.alloc); |
219 | if (srq->srqn == -1) | 219 | if (srq->srqn == -1) |
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c index 5e122501fd80..3aedd59b8a84 100644 --- a/drivers/infiniband/ulp/iser/iser_memory.c +++ b/drivers/infiniband/ulp/iser/iser_memory.c | |||
@@ -114,7 +114,7 @@ int iser_start_rdma_unaligned_sg(struct iscsi_iser_cmd_task *iser_ctask, | |||
114 | 114 | ||
115 | if (cmd_data_len > ISER_KMALLOC_THRESHOLD) | 115 | if (cmd_data_len > ISER_KMALLOC_THRESHOLD) |
116 | mem = (void *)__get_free_pages(GFP_NOIO, | 116 | mem = (void *)__get_free_pages(GFP_NOIO, |
117 | long_log2(roundup_pow_of_two(cmd_data_len)) - PAGE_SHIFT); | 117 | ilog2(roundup_pow_of_two(cmd_data_len)) - PAGE_SHIFT); |
118 | else | 118 | else |
119 | mem = kmalloc(cmd_data_len, GFP_NOIO); | 119 | mem = kmalloc(cmd_data_len, GFP_NOIO); |
120 | 120 | ||
@@ -211,7 +211,7 @@ void iser_finalize_rdma_unaligned_sg(struct iscsi_iser_cmd_task *iser_ctask, | |||
211 | 211 | ||
212 | if (cmd_data_len > ISER_KMALLOC_THRESHOLD) | 212 | if (cmd_data_len > ISER_KMALLOC_THRESHOLD) |
213 | free_pages((unsigned long)mem_copy->copy_buf, | 213 | free_pages((unsigned long)mem_copy->copy_buf, |
214 | long_log2(roundup_pow_of_two(cmd_data_len)) - PAGE_SHIFT); | 214 | ilog2(roundup_pow_of_two(cmd_data_len)) - PAGE_SHIFT); |
215 | else | 215 | else |
216 | kfree(mem_copy->copy_buf); | 216 | kfree(mem_copy->copy_buf); |
217 | 217 | ||
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index a1086ee8cccd..96152868525b 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
@@ -220,7 +220,7 @@ static int crypt_iv_benbi_ctr(struct crypt_config *cc, struct dm_target *ti, | |||
220 | const char *opts) | 220 | const char *opts) |
221 | { | 221 | { |
222 | unsigned int bs = crypto_blkcipher_blocksize(cc->tfm); | 222 | unsigned int bs = crypto_blkcipher_blocksize(cc->tfm); |
223 | int log = long_log2(bs); | 223 | int log = ilog2(bs); |
224 | 224 | ||
225 | /* we need to calculate how far we must shift the sector count | 225 | /* we need to calculate how far we must shift the sector count |
226 | * to get the cipher block count, we use this shift in _gen */ | 226 | * to get the cipher block count, we use this shift in _gen */ |
diff --git a/drivers/mmc/tifm_sd.c b/drivers/mmc/tifm_sd.c index e846499a004c..f18ad998b3cb 100644 --- a/drivers/mmc/tifm_sd.c +++ b/drivers/mmc/tifm_sd.c | |||
@@ -387,7 +387,7 @@ static void tifm_sd_prepare_data(struct tifm_sd *card, struct mmc_command *cmd) | |||
387 | 387 | ||
388 | writel(TIFM_FIFO_INT_SETALL, | 388 | writel(TIFM_FIFO_INT_SETALL, |
389 | sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR); | 389 | sock->addr + SOCK_DMA_FIFO_INT_ENABLE_CLEAR); |
390 | writel(long_log2(cmd->data->blksz) - 2, | 390 | writel(ilog2(cmd->data->blksz) - 2, |
391 | sock->addr + SOCK_FIFO_PAGE_SIZE); | 391 | sock->addr + SOCK_FIFO_PAGE_SIZE); |
392 | writel(TIFM_FIFO_ENABLE, sock->addr + SOCK_FIFO_CONTROL); | 392 | writel(TIFM_FIFO_ENABLE, sock->addr + SOCK_FIFO_CONTROL); |
393 | writel(TIFM_FIFO_INTMASK, sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET); | 393 | writel(TIFM_FIFO_INTMASK, sock->addr + SOCK_DMA_FIFO_INT_ENABLE_SET); |
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 255cef5f7420..6347c2dbdd81 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
@@ -597,8 +597,6 @@ static int ext2_check_descriptors (struct super_block * sb) | |||
597 | return 1; | 597 | return 1; |
598 | } | 598 | } |
599 | 599 | ||
600 | #define log2(n) ffz(~(n)) | ||
601 | |||
602 | /* | 600 | /* |
603 | * Maximal file size. There is a direct, and {,double-,triple-}indirect | 601 | * Maximal file size. There is a direct, and {,double-,triple-}indirect |
604 | * block limit, and also a limit of (2^32 - 1) 512-byte sectors in i_blocks. | 602 | * block limit, and also a limit of (2^32 - 1) 512-byte sectors in i_blocks. |
@@ -834,9 +832,9 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) | |||
834 | sbi->s_sbh = bh; | 832 | sbi->s_sbh = bh; |
835 | sbi->s_mount_state = le16_to_cpu(es->s_state); | 833 | sbi->s_mount_state = le16_to_cpu(es->s_state); |
836 | sbi->s_addr_per_block_bits = | 834 | sbi->s_addr_per_block_bits = |
837 | log2 (EXT2_ADDR_PER_BLOCK(sb)); | 835 | ilog2 (EXT2_ADDR_PER_BLOCK(sb)); |
838 | sbi->s_desc_per_block_bits = | 836 | sbi->s_desc_per_block_bits = |
839 | log2 (EXT2_DESC_PER_BLOCK(sb)); | 837 | ilog2 (EXT2_DESC_PER_BLOCK(sb)); |
840 | 838 | ||
841 | if (sb->s_magic != EXT2_SUPER_MAGIC) | 839 | if (sb->s_magic != EXT2_SUPER_MAGIC) |
842 | goto cantfind_ext2; | 840 | goto cantfind_ext2; |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 580b8a6ca979..b34886734a44 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -1347,8 +1347,6 @@ static void ext3_orphan_cleanup (struct super_block * sb, | |||
1347 | sb->s_flags = s_flags; /* Restore MS_RDONLY status */ | 1347 | sb->s_flags = s_flags; /* Restore MS_RDONLY status */ |
1348 | } | 1348 | } |
1349 | 1349 | ||
1350 | #define log2(n) ffz(~(n)) | ||
1351 | |||
1352 | /* | 1350 | /* |
1353 | * Maximal file size. There is a direct, and {,double-,triple-}indirect | 1351 | * Maximal file size. There is a direct, and {,double-,triple-}indirect |
1354 | * block limit, and also a limit of (2^32 - 1) 512-byte sectors in i_blocks. | 1352 | * block limit, and also a limit of (2^32 - 1) 512-byte sectors in i_blocks. |
@@ -1597,8 +1595,8 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) | |||
1597 | sbi->s_desc_per_block = blocksize / sizeof(struct ext3_group_desc); | 1595 | sbi->s_desc_per_block = blocksize / sizeof(struct ext3_group_desc); |
1598 | sbi->s_sbh = bh; | 1596 | sbi->s_sbh = bh; |
1599 | sbi->s_mount_state = le16_to_cpu(es->s_state); | 1597 | sbi->s_mount_state = le16_to_cpu(es->s_state); |
1600 | sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb)); | 1598 | sbi->s_addr_per_block_bits = ilog2(EXT3_ADDR_PER_BLOCK(sb)); |
1601 | sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb)); | 1599 | sbi->s_desc_per_block_bits = ilog2(EXT3_DESC_PER_BLOCK(sb)); |
1602 | for (i=0; i < 4; i++) | 1600 | for (i=0; i < 4; i++) |
1603 | sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); | 1601 | sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); |
1604 | sbi->s_def_hash_version = es->s_def_hash_version; | 1602 | sbi->s_def_hash_version = es->s_def_hash_version; |
diff --git a/include/asm-frv/bitops.h b/include/asm-frv/bitops.h index 1f70d47148bd..f8560edf59ff 100644 --- a/include/asm-frv/bitops.h +++ b/include/asm-frv/bitops.h | |||
@@ -256,6 +256,50 @@ int __ffs(unsigned long x) | |||
256 | return 31 - bit; | 256 | return 31 - bit; |
257 | } | 257 | } |
258 | 258 | ||
259 | /* | ||
260 | * special slimline version of fls() for calculating ilog2_u32() | ||
261 | * - note: no protection against n == 0 | ||
262 | */ | ||
263 | #define ARCH_HAS_ILOG2_U32 | ||
264 | static inline __attribute__((const)) | ||
265 | int __ilog2_u32(u32 n) | ||
266 | { | ||
267 | int bit; | ||
268 | asm("scan %1,gr0,%0" : "=r"(bit) : "r"(n)); | ||
269 | return 31 - bit; | ||
270 | } | ||
271 | |||
272 | /* | ||
273 | * special slimline version of fls64() for calculating ilog2_u64() | ||
274 | * - note: no protection against n == 0 | ||
275 | */ | ||
276 | #define ARCH_HAS_ILOG2_U64 | ||
277 | static inline __attribute__((const)) | ||
278 | int __ilog2_u64(u64 n) | ||
279 | { | ||
280 | union { | ||
281 | u64 ll; | ||
282 | struct { u32 h, l; }; | ||
283 | } _; | ||
284 | int bit, x, y; | ||
285 | |||
286 | _.ll = n; | ||
287 | |||
288 | asm(" subcc %3,gr0,gr0,icc0 \n" | ||
289 | " ckeq icc0,cc4 \n" | ||
290 | " cscan.p %3,gr0,%0 ,cc4,0 \n" | ||
291 | " setlos #63,%1 \n" | ||
292 | " cscan.p %4,gr0,%0 ,cc4,1 \n" | ||
293 | " setlos #31,%2 \n" | ||
294 | " csub.p %1,%0,%0 ,cc4,0 \n" | ||
295 | " csub %2,%0,%0 ,cc4,1 \n" | ||
296 | : "=&r"(bit), "=r"(x), "=r"(y) | ||
297 | : "0r"(_.h), "r"(_.l) | ||
298 | : "icc0", "cc4" | ||
299 | ); | ||
300 | return bit; | ||
301 | } | ||
302 | |||
259 | #include <asm-generic/bitops/sched.h> | 303 | #include <asm-generic/bitops/sched.h> |
260 | #include <asm-generic/bitops/hweight.h> | 304 | #include <asm-generic/bitops/hweight.h> |
261 | 305 | ||
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 6738283ac385..3710cce16642 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/types.h> | 13 | #include <linux/types.h> |
14 | #include <linux/compiler.h> | 14 | #include <linux/compiler.h> |
15 | #include <linux/bitops.h> | 15 | #include <linux/bitops.h> |
16 | #include <linux/log2.h> | ||
16 | #include <asm/byteorder.h> | 17 | #include <asm/byteorder.h> |
17 | #include <asm/bug.h> | 18 | #include <asm/bug.h> |
18 | 19 | ||
@@ -157,14 +158,6 @@ static inline int printk(const char *s, ...) { return 0; } | |||
157 | 158 | ||
158 | unsigned long int_sqrt(unsigned long); | 159 | unsigned long int_sqrt(unsigned long); |
159 | 160 | ||
160 | static inline int __attribute_pure__ long_log2(unsigned long x) | ||
161 | { | ||
162 | int r = 0; | ||
163 | for (x >>= 1; x > 0; x >>= 1) | ||
164 | r++; | ||
165 | return r; | ||
166 | } | ||
167 | |||
168 | static inline unsigned long | 161 | static inline unsigned long |
169 | __attribute_const__ roundup_pow_of_two(unsigned long x) | 162 | __attribute_const__ roundup_pow_of_two(unsigned long x) |
170 | { | 163 | { |
diff --git a/include/linux/log2.h b/include/linux/log2.h new file mode 100644 index 000000000000..3979c60325ff --- /dev/null +++ b/include/linux/log2.h | |||
@@ -0,0 +1,131 @@ | |||
1 | /* Integer base 2 logarithm calculation | ||
2 | * | ||
3 | * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #ifndef _LINUX_LOG2_H | ||
13 | #define _LINUX_LOG2_H | ||
14 | |||
15 | #include <linux/types.h> | ||
16 | #include <linux/bitops.h> | ||
17 | |||
18 | /* | ||
19 | * deal with unrepresentable constant logarithms | ||
20 | */ | ||
21 | extern __attribute__((const, noreturn)) | ||
22 | int ____ilog2_NaN(void); | ||
23 | |||
24 | /* | ||
25 | * non-constant log of base 2 calculators | ||
26 | * - the arch may override these in asm/bitops.h if they can be implemented | ||
27 | * more efficiently than using fls() and fls64() | ||
28 | * - the arch is not required to handle n==0 if implementing the fallback | ||
29 | */ | ||
30 | #ifndef CONFIG_ARCH_HAS_ILOG2_U32 | ||
31 | static inline __attribute__((const)) | ||
32 | int __ilog2_u32(u32 n) | ||
33 | { | ||
34 | return fls(n) - 1; | ||
35 | } | ||
36 | #endif | ||
37 | |||
38 | #ifndef CONFIG_ARCH_HAS_ILOG2_U64 | ||
39 | static inline __attribute__((const)) | ||
40 | int __ilog2_u64(u64 n) | ||
41 | { | ||
42 | return fls64(n) - 1; | ||
43 | } | ||
44 | #endif | ||
45 | |||
46 | /** | ||
47 | * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value | ||
48 | * @n - parameter | ||
49 | * | ||
50 | * constant-capable log of base 2 calculation | ||
51 | * - this can be used to initialise global variables from constant data, hence | ||
52 | * the massive ternary operator construction | ||
53 | * | ||
54 | * selects the appropriately-sized optimised version depending on sizeof(n) | ||
55 | */ | ||
56 | #define ilog2(n) \ | ||
57 | ( \ | ||
58 | __builtin_constant_p(n) ? ( \ | ||
59 | (n) < 1 ? ____ilog2_NaN() : \ | ||
60 | (n) & (1ULL << 63) ? 63 : \ | ||
61 | (n) & (1ULL << 62) ? 62 : \ | ||
62 | (n) & (1ULL << 61) ? 61 : \ | ||
63 | (n) & (1ULL << 60) ? 60 : \ | ||
64 | (n) & (1ULL << 59) ? 59 : \ | ||
65 | (n) & (1ULL << 58) ? 58 : \ | ||
66 | (n) & (1ULL << 57) ? 57 : \ | ||
67 | (n) & (1ULL << 56) ? 56 : \ | ||
68 | (n) & (1ULL << 55) ? 55 : \ | ||
69 | (n) & (1ULL << 54) ? 54 : \ | ||
70 | (n) & (1ULL << 53) ? 53 : \ | ||
71 | (n) & (1ULL << 52) ? 52 : \ | ||
72 | (n) & (1ULL << 51) ? 51 : \ | ||
73 | (n) & (1ULL << 50) ? 50 : \ | ||
74 | (n) & (1ULL << 49) ? 49 : \ | ||
75 | (n) & (1ULL << 48) ? 48 : \ | ||
76 | (n) & (1ULL << 47) ? 47 : \ | ||
77 | (n) & (1ULL << 46) ? 46 : \ | ||
78 | (n) & (1ULL << 45) ? 45 : \ | ||
79 | (n) & (1ULL << 44) ? 44 : \ | ||
80 | (n) & (1ULL << 43) ? 43 : \ | ||
81 | (n) & (1ULL << 42) ? 42 : \ | ||
82 | (n) & (1ULL << 41) ? 41 : \ | ||
83 | (n) & (1ULL << 40) ? 40 : \ | ||
84 | (n) & (1ULL << 39) ? 39 : \ | ||
85 | (n) & (1ULL << 38) ? 38 : \ | ||
86 | (n) & (1ULL << 37) ? 37 : \ | ||
87 | (n) & (1ULL << 36) ? 36 : \ | ||
88 | (n) & (1ULL << 35) ? 35 : \ | ||
89 | (n) & (1ULL << 34) ? 34 : \ | ||
90 | (n) & (1ULL << 33) ? 33 : \ | ||
91 | (n) & (1ULL << 32) ? 32 : \ | ||
92 | (n) & (1ULL << 31) ? 31 : \ | ||
93 | (n) & (1ULL << 30) ? 30 : \ | ||
94 | (n) & (1ULL << 29) ? 29 : \ | ||
95 | (n) & (1ULL << 28) ? 28 : \ | ||
96 | (n) & (1ULL << 27) ? 27 : \ | ||
97 | (n) & (1ULL << 26) ? 26 : \ | ||
98 | (n) & (1ULL << 25) ? 25 : \ | ||
99 | (n) & (1ULL << 24) ? 24 : \ | ||
100 | (n) & (1ULL << 23) ? 23 : \ | ||
101 | (n) & (1ULL << 22) ? 22 : \ | ||
102 | (n) & (1ULL << 21) ? 21 : \ | ||
103 | (n) & (1ULL << 20) ? 20 : \ | ||
104 | (n) & (1ULL << 19) ? 19 : \ | ||
105 | (n) & (1ULL << 18) ? 18 : \ | ||
106 | (n) & (1ULL << 17) ? 17 : \ | ||
107 | (n) & (1ULL << 16) ? 16 : \ | ||
108 | (n) & (1ULL << 15) ? 15 : \ | ||
109 | (n) & (1ULL << 14) ? 14 : \ | ||
110 | (n) & (1ULL << 13) ? 13 : \ | ||
111 | (n) & (1ULL << 12) ? 12 : \ | ||
112 | (n) & (1ULL << 11) ? 11 : \ | ||
113 | (n) & (1ULL << 10) ? 10 : \ | ||
114 | (n) & (1ULL << 9) ? 9 : \ | ||
115 | (n) & (1ULL << 8) ? 8 : \ | ||
116 | (n) & (1ULL << 7) ? 7 : \ | ||
117 | (n) & (1ULL << 6) ? 6 : \ | ||
118 | (n) & (1ULL << 5) ? 5 : \ | ||
119 | (n) & (1ULL << 4) ? 4 : \ | ||
120 | (n) & (1ULL << 3) ? 3 : \ | ||
121 | (n) & (1ULL << 2) ? 2 : \ | ||
122 | (n) & (1ULL << 1) ? 1 : \ | ||
123 | (n) & (1ULL << 0) ? 0 : \ | ||
124 | ____ilog2_NaN() \ | ||
125 | ) : \ | ||
126 | (sizeof(n) <= 4) ? \ | ||
127 | __ilog2_u32(n) : \ | ||
128 | __ilog2_u64(n) \ | ||
129 | ) | ||
130 | |||
131 | #endif /* _LINUX_LOG2_H */ | ||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index cace22b3ac25..18f0e044c43d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -3244,7 +3244,7 @@ void *__init alloc_large_system_hash(const char *tablename, | |||
3244 | if (numentries > max) | 3244 | if (numentries > max) |
3245 | numentries = max; | 3245 | numentries = max; |
3246 | 3246 | ||
3247 | log2qty = long_log2(numentries); | 3247 | log2qty = ilog2(numentries); |
3248 | 3248 | ||
3249 | do { | 3249 | do { |
3250 | size = bucketsize << log2qty; | 3250 | size = bucketsize << log2qty; |
@@ -3266,7 +3266,7 @@ void *__init alloc_large_system_hash(const char *tablename, | |||
3266 | printk("%s hash table entries: %d (order: %d, %lu bytes)\n", | 3266 | printk("%s hash table entries: %d (order: %d, %lu bytes)\n", |
3267 | tablename, | 3267 | tablename, |
3268 | (1U << log2qty), | 3268 | (1U << log2qty), |
3269 | long_log2(size) - PAGE_SHIFT, | 3269 | ilog2(size) - PAGE_SHIFT, |
3270 | size); | 3270 | size); |
3271 | 3271 | ||
3272 | if (_hash_shift) | 3272 | if (_hash_shift) |