aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2006-12-08 05:37:49 -0500
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-08 11:28:51 -0500
commitf0d1b0b30d250a07627ad8b9fbbb5c7cc08422e8 (patch)
tree0aa5379150574374351fb92af7881a48dbfcf2ce /drivers
parentb3d7ae5f47a58a9f7b152deeaf7daa1fc558a8f1 (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.c4
-rw-r--r--drivers/infiniband/hw/mthca/mthca_qp.c4
-rw-r--r--drivers/infiniband/hw/mthca/mthca_srq.c4
-rw-r--r--drivers/infiniband/ulp/iser/iser_memory.c4
-rw-r--r--drivers/md/dm-crypt.c2
-rw-r--r--drivers/mmc/tifm_sd.c2
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);