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 /drivers | |
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_provider.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_qp.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_srq.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/ulp/iser/iser_memory.c | 4 | ||||
-rw-r--r-- | drivers/md/dm-crypt.c | 2 | ||||
-rw-r--r-- | drivers/mmc/tifm_sd.c | 2 |
6 files changed, 10 insertions, 10 deletions
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); |