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/infiniband/hw | |
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/infiniband/hw')
-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 |
3 files changed, 6 insertions, 6 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) |