Some users need to make sure their rounding function accepts and returns
64bit long variables regardless of the architecture. Sadly
roundup/rounddown_pow_two() takes and returns unsigned longs. It turns
out ilog2() already handles 32/64bit calculations properly, and being
the building block to the round functions we can rework them as a
wrapper around it.

Suggested-by: Robin Murphy <robin.mur...@arm.con>
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulie...@suse.de>
---
 drivers/clk/clk-divider.c                    |  8 ++--
 drivers/clk/sunxi/clk-sunxi.c                |  2 +-
 drivers/infiniband/hw/hfi1/chip.c            |  4 +-
 drivers/infiniband/hw/hfi1/init.c            |  4 +-
 drivers/infiniband/hw/mlx4/srq.c             |  2 +-
 drivers/infiniband/hw/mthca/mthca_srq.c      |  2 +-
 drivers/infiniband/sw/rxe/rxe_qp.c           |  4 +-
 drivers/iommu/intel-iommu.c                  |  4 +-
 drivers/iommu/intel-svm.c                    |  4 +-
 drivers/iommu/intel_irq_remapping.c          |  2 +-
 drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c |  4 +-
 drivers/net/ethernet/marvell/sky2.c          |  2 +-
 drivers/net/ethernet/rocker/rocker_hw.h      |  4 +-
 drivers/net/ethernet/sfc/ef10.c              |  2 +-
 drivers/net/ethernet/sfc/efx.h               |  2 +-
 drivers/net/ethernet/sfc/falcon/efx.h        |  2 +-
 drivers/pci/msi.c                            |  2 +-
 include/linux/log2.h                         | 44 +++++---------------
 kernel/kexec_core.c                          |  3 +-
 lib/rhashtable.c                             |  2 +-
 net/sunrpc/xprtrdma/verbs.c                  |  2 +-
 21 files changed, 41 insertions(+), 64 deletions(-)

diff --git a/drivers/clk/clk-divider.c b/drivers/clk/clk-divider.c
index 098b2b01f0af..ba947e4c8193 100644
--- a/drivers/clk/clk-divider.c
+++ b/drivers/clk/clk-divider.c
@@ -222,7 +222,7 @@ static int _div_round_up(const struct clk_div_table *table,
        int div = DIV_ROUND_UP_ULL((u64)parent_rate, rate);
 
        if (flags & CLK_DIVIDER_POWER_OF_TWO)
-               div = __roundup_pow_of_two(div);
+               div = roundup_pow_of_two(div);
        if (table)
                div = _round_up_table(table, div);
 
@@ -240,8 +240,8 @@ static int _div_round_closest(const struct clk_div_table 
*table,
        down = parent_rate / rate;
 
        if (flags & CLK_DIVIDER_POWER_OF_TWO) {
-               up = __roundup_pow_of_two(up);
-               down = __rounddown_pow_of_two(down);
+               up = roundup_pow_of_two(up);
+               down = rounddown_pow_of_two(down);
        } else if (table) {
                up = _round_up_table(table, up);
                down = _round_down_table(table, down);
@@ -278,7 +278,7 @@ static int _next_div(const struct clk_div_table *table, int 
div,
        div++;
 
        if (flags & CLK_DIVIDER_POWER_OF_TWO)
-               return __roundup_pow_of_two(div);
+               return roundup_pow_of_two(div);
        if (table)
                return _round_up_table(table, div);
 
diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
index 27201fd26e44..faec99dc09c0 100644
--- a/drivers/clk/sunxi/clk-sunxi.c
+++ b/drivers/clk/sunxi/clk-sunxi.c
@@ -311,7 +311,7 @@ static void sun6i_get_ahb1_factors(struct factors_request 
*req)
 
                calcm = DIV_ROUND_UP(div, 1 << calcp);
        } else {
-               calcp = __roundup_pow_of_two(div);
+               calcp = roundup_pow_of_two(div);
                calcp = calcp > 3 ? 3 : calcp;
        }
 
diff --git a/drivers/infiniband/hw/hfi1/chip.c 
b/drivers/infiniband/hw/hfi1/chip.c
index 9b1fb84a3d45..96b1d343c32f 100644
--- a/drivers/infiniband/hw/hfi1/chip.c
+++ b/drivers/infiniband/hw/hfi1/chip.c
@@ -14199,10 +14199,10 @@ static int qos_rmt_entries(struct hfi1_devdata *dd, 
unsigned int *mp,
                        max_by_vl = krcvqs[i];
        if (max_by_vl > 32)
                goto no_qos;
-       m = ilog2(__roundup_pow_of_two(max_by_vl));
+       m = ilog2(roundup_pow_of_two(max_by_vl));
 
        /* determine bits for vl */
-       n = ilog2(__roundup_pow_of_two(num_vls));
+       n = ilog2(roundup_pow_of_two(num_vls));
 
        /* reject if too much is used */
        if ((m + n) > 7)
diff --git a/drivers/infiniband/hw/hfi1/init.c 
b/drivers/infiniband/hw/hfi1/init.c
index 26b792bb1027..838c789c7cce 100644
--- a/drivers/infiniband/hw/hfi1/init.c
+++ b/drivers/infiniband/hw/hfi1/init.c
@@ -467,7 +467,7 @@ int hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, int 
numa,
                 * MTU supported.
                 */
                if (rcd->egrbufs.size < hfi1_max_mtu) {
-                       rcd->egrbufs.size = __roundup_pow_of_two(hfi1_max_mtu);
+                       rcd->egrbufs.size = roundup_pow_of_two(hfi1_max_mtu);
                        hfi1_cdbg(PROC,
                                  "ctxt%u: eager bufs size too small. Adjusting 
to %u\n",
                                    rcd->ctxt, rcd->egrbufs.size);
@@ -1959,7 +1959,7 @@ int hfi1_setup_eagerbufs(struct hfi1_ctxtdata *rcd)
         * to satisfy the "multiple of 8 RcvArray entries" requirement.
         */
        if (rcd->egrbufs.size <= (1 << 20))
-               rcd->egrbufs.rcvtid_size = max((unsigned long)round_mtu,
+               rcd->egrbufs.rcvtid_size = max((unsigned long long)round_mtu,
                        rounddown_pow_of_two(rcd->egrbufs.size / 8));
 
        while (alloced_bytes < rcd->egrbufs.size &&
diff --git a/drivers/infiniband/hw/mlx4/srq.c b/drivers/infiniband/hw/mlx4/srq.c
index 8dcf6e3d9ae2..7e685600a7b3 100644
--- a/drivers/infiniband/hw/mlx4/srq.c
+++ b/drivers/infiniband/hw/mlx4/srq.c
@@ -96,7 +96,7 @@ int mlx4_ib_create_srq(struct ib_srq *ib_srq,
        srq->msrq.max    = roundup_pow_of_two(init_attr->attr.max_wr + 1);
        srq->msrq.max_gs = init_attr->attr.max_sge;
 
-       desc_size = max(32UL,
+       desc_size = max(32ULL,
                        roundup_pow_of_two(sizeof (struct 
mlx4_wqe_srq_next_seg) +
                                           srq->msrq.max_gs *
                                           sizeof (struct mlx4_wqe_data_seg)));
diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c 
b/drivers/infiniband/hw/mthca/mthca_srq.c
index a85935ccce88..0c2e14b4142a 100644
--- a/drivers/infiniband/hw/mthca/mthca_srq.c
+++ b/drivers/infiniband/hw/mthca/mthca_srq.c
@@ -225,7 +225,7 @@ int mthca_alloc_srq(struct mthca_dev *dev, struct mthca_pd 
*pd,
        else
                srq->max = srq->max + 1;
 
-       ds = max(64UL,
+       ds = max(64ULL,
                 roundup_pow_of_two(sizeof (struct mthca_next_seg) +
                                    srq->max_gs * sizeof (struct 
mthca_data_seg)));
 
diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c 
b/drivers/infiniband/sw/rxe/rxe_qp.c
index e2c6d1cedf41..040b707b0877 100644
--- a/drivers/infiniband/sw/rxe/rxe_qp.c
+++ b/drivers/infiniband/sw/rxe/rxe_qp.c
@@ -592,7 +592,7 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr 
*attr, int mask,
        int err;
 
        if (mask & IB_QP_MAX_QP_RD_ATOMIC) {
-               int max_rd_atomic = __roundup_pow_of_two(attr->max_rd_atomic);
+               int max_rd_atomic = roundup_pow_of_two(attr->max_rd_atomic);
 
                qp->attr.max_rd_atomic = max_rd_atomic;
                atomic_set(&qp->req.rd_atomic, max_rd_atomic);
@@ -600,7 +600,7 @@ int rxe_qp_from_attr(struct rxe_qp *qp, struct ib_qp_attr 
*attr, int mask,
 
        if (mask & IB_QP_MAX_DEST_RD_ATOMIC) {
                int max_dest_rd_atomic =
-                       __roundup_pow_of_two(attr->max_dest_rd_atomic);
+                       roundup_pow_of_two(attr->max_dest_rd_atomic);
 
                qp->attr.max_dest_rd_atomic = max_dest_rd_atomic;
 
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 0c8d81f56a30..ce7c900bd666 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -1488,7 +1488,7 @@ static void iommu_flush_iotlb_psi(struct intel_iommu 
*iommu,
                                  unsigned long pfn, unsigned int pages,
                                  int ih, int map)
 {
-       unsigned int mask = ilog2(__roundup_pow_of_two(pages));
+       unsigned int mask = ilog2(roundup_pow_of_two(pages));
        uint64_t addr = (uint64_t)pfn << VTD_PAGE_SHIFT;
        u16 did = domain->iommu_did[iommu->seq_id];
 
@@ -3390,7 +3390,7 @@ static unsigned long intel_alloc_iova(struct device *dev,
        /* Restrict dma_mask to the width that the iommu can handle */
        dma_mask = min_t(uint64_t, DOMAIN_MAX_ADDR(domain->gaw), dma_mask);
        /* Ensure we reserve the whole size-aligned region */
-       nrpages = __roundup_pow_of_two(nrpages);
+       nrpages = roundup_pow_of_two(nrpages);
 
        if (!dmar_forcedac && dma_mask > DMA_BIT_MASK(32)) {
                /*
diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c
index 9b159132405d..602caca3cd1a 100644
--- a/drivers/iommu/intel-svm.c
+++ b/drivers/iommu/intel-svm.c
@@ -115,7 +115,7 @@ static void intel_flush_svm_range_dev (struct intel_svm 
*svm, struct intel_svm_d
                        QI_EIOTLB_TYPE;
                desc.qw1 = 0;
        } else {
-               int mask = ilog2(__roundup_pow_of_two(pages));
+               int mask = ilog2(roundup_pow_of_two(pages));
 
                desc.qw0 = QI_EIOTLB_PASID(svm->pasid) |
                                QI_EIOTLB_DID(sdev->did) |
@@ -142,7 +142,7 @@ static void intel_flush_svm_range_dev (struct intel_svm 
*svm, struct intel_svm_d
                         * for example, an "address" value of 0x12345f000 will
                         * flush from 0x123440000 to 0x12347ffff (256KiB). */
                        unsigned long last = address + ((unsigned long)(pages - 
1) << VTD_PAGE_SHIFT);
-                       unsigned long mask = __rounddown_pow_of_two(address ^ 
last);
+                       unsigned long mask = rounddown_pow_of_two(address ^ 
last);
 
                        desc.qw1 = QI_DEV_EIOTLB_ADDR((address & ~mask) |
                                        (mask - 1)) | QI_DEV_EIOTLB_SIZE;
diff --git a/drivers/iommu/intel_irq_remapping.c 
b/drivers/iommu/intel_irq_remapping.c
index 81e43c1df7ec..935657b2c661 100644
--- a/drivers/iommu/intel_irq_remapping.c
+++ b/drivers/iommu/intel_irq_remapping.c
@@ -113,7 +113,7 @@ static int alloc_irte(struct intel_iommu *iommu,
                return -1;
 
        if (count > 1) {
-               count = __roundup_pow_of_two(count);
+               count = roundup_pow_of_two(count);
                mask = ilog2(count);
        }
 
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c 
b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c
index 6a757dadb5f1..fd5b12c23eaa 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c
@@ -680,13 +680,13 @@ static int xgbe_set_ringparam(struct net_device *netdev,
                return -EINVAL;
        }
 
-       rx = __rounddown_pow_of_two(ringparam->rx_pending);
+       rx = rounddown_pow_of_two(ringparam->rx_pending);
        if (rx != ringparam->rx_pending)
                netdev_notice(netdev,
                              "rx ring parameter rounded to power of two: %u\n",
                              rx);
 
-       tx = __rounddown_pow_of_two(ringparam->tx_pending);
+       tx = rounddown_pow_of_two(ringparam->tx_pending);
        if (tx != ringparam->tx_pending)
                netdev_notice(netdev,
                              "tx ring parameter rounded to power of two: %u\n",
diff --git a/drivers/net/ethernet/marvell/sky2.c 
b/drivers/net/ethernet/marvell/sky2.c
index 5f56ee83e3b1..cc3a03b4a611 100644
--- a/drivers/net/ethernet/marvell/sky2.c
+++ b/drivers/net/ethernet/marvell/sky2.c
@@ -4139,7 +4139,7 @@ static int sky2_set_coalesce(struct net_device *dev,
  */
 static unsigned long roundup_ring_size(unsigned long pending)
 {
-       return max(128ul, roundup_pow_of_two(pending+1));
+       return max(128ull, roundup_pow_of_two(pending+1));
 }
 
 static void sky2_get_ringparam(struct net_device *dev,
diff --git a/drivers/net/ethernet/rocker/rocker_hw.h 
b/drivers/net/ethernet/rocker/rocker_hw.h
index 59f1f8b690d2..d8de15509e2c 100644
--- a/drivers/net/ethernet/rocker/rocker_hw.h
+++ b/drivers/net/ethernet/rocker/rocker_hw.h
@@ -88,8 +88,8 @@ enum rocker_dma_type {
 };
 
 /* Rocker DMA ring size limits and default sizes */
-#define ROCKER_DMA_SIZE_MIN            2ul
-#define ROCKER_DMA_SIZE_MAX            65536ul
+#define ROCKER_DMA_SIZE_MIN            2ull
+#define ROCKER_DMA_SIZE_MAX            65536ull
 #define ROCKER_DMA_CMD_DEFAULT_SIZE    32ul
 #define ROCKER_DMA_EVENT_DEFAULT_SIZE  32ul
 #define ROCKER_DMA_TX_DEFAULT_SIZE     64ul
diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c
index 4d9bbccc6f89..4f4d9a5b3b75 100644
--- a/drivers/net/ethernet/sfc/ef10.c
+++ b/drivers/net/ethernet/sfc/ef10.c
@@ -27,7 +27,7 @@ enum {
 };
 /* The maximum size of a shared RSS context */
 /* TODO: this should really be from the mcdi protocol export */
-#define EFX_EF10_MAX_SHARED_RSS_CONTEXT_SIZE 64UL
+#define EFX_EF10_MAX_SHARED_RSS_CONTEXT_SIZE 64ULL
 
 /* The filter table(s) are managed by firmware and we have write-only
  * access.  When removing filters we must identify them to the
diff --git a/drivers/net/ethernet/sfc/efx.h b/drivers/net/ethernet/sfc/efx.h
index 2dd8d5002315..fea2add5860e 100644
--- a/drivers/net/ethernet/sfc/efx.h
+++ b/drivers/net/ethernet/sfc/efx.h
@@ -52,7 +52,7 @@ void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue);
 
 #define EFX_MAX_DMAQ_SIZE 4096UL
 #define EFX_DEFAULT_DMAQ_SIZE 1024UL
-#define EFX_MIN_DMAQ_SIZE 512UL
+#define EFX_MIN_DMAQ_SIZE 512ULL
 
 #define EFX_MAX_EVQ_SIZE 16384UL
 #define EFX_MIN_EVQ_SIZE 512UL
diff --git a/drivers/net/ethernet/sfc/falcon/efx.h 
b/drivers/net/ethernet/sfc/falcon/efx.h
index d3b4646545fa..0d16257156d6 100644
--- a/drivers/net/ethernet/sfc/falcon/efx.h
+++ b/drivers/net/ethernet/sfc/falcon/efx.h
@@ -55,7 +55,7 @@ void ef4_schedule_slow_fill(struct ef4_rx_queue *rx_queue);
 
 #define EF4_MAX_DMAQ_SIZE 4096UL
 #define EF4_DEFAULT_DMAQ_SIZE 1024UL
-#define EF4_MIN_DMAQ_SIZE 512UL
+#define EF4_MIN_DMAQ_SIZE 512ULL
 
 #define EF4_MAX_EVQ_SIZE 16384UL
 #define EF4_MIN_EVQ_SIZE 512UL
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index c7709e49f0e4..f0391e88bc42 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -578,7 +578,7 @@ msi_setup_entry(struct pci_dev *dev, int nvec, struct 
irq_affinity *affd)
        entry->msi_attrib.maskbit       = !!(control & PCI_MSI_FLAGS_MASKBIT);
        entry->msi_attrib.default_irq   = dev->irq;     /* Save IOAPIC IRQ */
        entry->msi_attrib.multi_cap     = (control & PCI_MSI_FLAGS_QMASK) >> 1;
-       entry->msi_attrib.multiple      = ilog2(__roundup_pow_of_two(nvec));
+       entry->msi_attrib.multiple      = ilog2(roundup_pow_of_two(nvec));
 
        if (control & PCI_MSI_FLAGS_64BIT)
                entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_64;
diff --git a/include/linux/log2.h b/include/linux/log2.h
index 83a4a3ca3e8a..53a727303dac 100644
--- a/include/linux/log2.h
+++ b/include/linux/log2.h
@@ -47,26 +47,6 @@ bool is_power_of_2(unsigned long n)
        return (n != 0 && ((n & (n - 1)) == 0));
 }
 
-/**
- * __roundup_pow_of_two() - round up to nearest power of two
- * @n: value to round up
- */
-static inline __attribute__((const))
-unsigned long __roundup_pow_of_two(unsigned long n)
-{
-       return 1UL << fls_long(n - 1);
-}
-
-/**
- * __rounddown_pow_of_two() - round down to nearest power of two
- * @n: value to round down
- */
-static inline __attribute__((const))
-unsigned long __rounddown_pow_of_two(unsigned long n)
-{
-       return 1UL << (fls_long(n) - 1);
-}
-
 /**
  * const_ilog2 - log base 2 of 32-bit or a 64-bit constant unsigned value
  * @n: parameter
@@ -170,14 +150,11 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
  * - the result is undefined when n == 0
  * - this can be used to initialise global variables from constant data
  */
-#define roundup_pow_of_two(n)                  \
-(                                              \
-       __builtin_constant_p(n) ? (             \
-               (n == 1) ? 1 :                  \
-               (1UL << (ilog2((n) - 1) + 1))   \
-                                  ) :          \
-       __roundup_pow_of_two(n)                 \
- )
+#define roundup_pow_of_two(n)                    \
+(                                                \
+       (__builtin_constant_p(n) && ((n) == 1)) ? \
+       1 : (1ULL << (ilog2((n) - 1) + 1))        \
+)
 
 /**
  * rounddown_pow_of_two - round the given value down to nearest power of two
@@ -187,12 +164,11 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
  * - the result is undefined when n == 0
  * - this can be used to initialise global variables from constant data
  */
-#define rounddown_pow_of_two(n)                        \
-(                                              \
-       __builtin_constant_p(n) ? (             \
-               (1UL << ilog2(n))) :            \
-       __rounddown_pow_of_two(n)               \
- )
+#define rounddown_pow_of_two(n)                          \
+(                                                \
+       (__builtin_constant_p(n) && ((n) == 1)) ? \
+       1 : (1ULL << (ilog2(n)))                  \
+)
 
 static inline __attribute_const__
 int __order_base_2(unsigned long n)
diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
index 15d70a90b50d..bb9efc6944a4 100644
--- a/kernel/kexec_core.c
+++ b/kernel/kexec_core.c
@@ -1094,7 +1094,8 @@ static int __init crash_notes_memory_init(void)
         * crash_notes is allocated inside one physical page.
         */
        size = sizeof(note_buf_t);
-       align = min(roundup_pow_of_two(sizeof(note_buf_t)), PAGE_SIZE);
+       align = min(roundup_pow_of_two(sizeof(note_buf_t)),
+                   (unsigned long long)PAGE_SIZE);
 
        /*
         * Break compile if size is bigger than PAGE_SIZE since crash_notes
diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index bdb7e4cadf05..70908678c7a8 100644
--- a/lib/rhashtable.c
+++ b/lib/rhashtable.c
@@ -950,7 +950,7 @@ static size_t rounded_hashtable_size(const struct 
rhashtable_params *params)
 
        if (params->nelem_hint)
                retsize = max(roundup_pow_of_two(params->nelem_hint * 4 / 3),
-                             (unsigned long)params->min_size);
+                             (unsigned long long)params->min_size);
        else
                retsize = max(HASH_DEFAULT_SIZE,
                              (unsigned long)params->min_size);
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
index 77c7dd7f05e8..78fb8ccabddd 100644
--- a/net/sunrpc/xprtrdma/verbs.c
+++ b/net/sunrpc/xprtrdma/verbs.c
@@ -1015,7 +1015,7 @@ struct rpcrdma_req *rpcrdma_req_create(struct 
rpcrdma_xprt *r_xprt, size_t size,
        maxhdrsize = rpcrdma_fixed_maxsz + 3 +
                     r_xprt->rx_ia.ri_max_segs * rpcrdma_readchunk_maxsz;
        maxhdrsize *= sizeof(__be32);
-       rb = rpcrdma_regbuf_alloc(__roundup_pow_of_two(maxhdrsize),
+       rb = rpcrdma_regbuf_alloc(roundup_pow_of_two(maxhdrsize),
                                  DMA_TO_DEVICE, flags);
        if (!rb)
                goto out2;
-- 
2.24.0


_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to