Use find_and_{set,clear}_bit() where appropriate and simplify the logic.

Signed-off-by: Yury Norov <yury.no...@gmail.com>
---
 arch/powerpc/mm/book3s32/mmu_context.c     | 10 ++---
 arch/powerpc/platforms/pasemi/dma_lib.c    | 45 +++++-----------------
 arch/powerpc/platforms/powernv/pci-sriov.c | 12 ++----
 3 files changed, 17 insertions(+), 50 deletions(-)

diff --git a/arch/powerpc/mm/book3s32/mmu_context.c 
b/arch/powerpc/mm/book3s32/mmu_context.c
index 1922f9a6b058..7db19f173c2e 100644
--- a/arch/powerpc/mm/book3s32/mmu_context.c
+++ b/arch/powerpc/mm/book3s32/mmu_context.c
@@ -50,13 +50,11 @@ static unsigned long context_map[LAST_CONTEXT / 
BITS_PER_LONG + 1];
 
 unsigned long __init_new_context(void)
 {
-       unsigned long ctx = next_mmu_context;
+       unsigned long ctx;
 
-       while (test_and_set_bit(ctx, context_map)) {
-               ctx = find_next_zero_bit(context_map, LAST_CONTEXT+1, ctx);
-               if (ctx > LAST_CONTEXT)
-                       ctx = 0;
-       }
+       ctx = find_and_set_next_bit(context_map, LAST_CONTEXT + 1, 
next_mmu_context);
+       if (ctx > LAST_CONTEXT)
+               ctx = 0;
        next_mmu_context = (ctx + 1) & LAST_CONTEXT;
 
        return ctx;
diff --git a/arch/powerpc/platforms/pasemi/dma_lib.c 
b/arch/powerpc/platforms/pasemi/dma_lib.c
index 1be1f18f6f09..906dabee0132 100644
--- a/arch/powerpc/platforms/pasemi/dma_lib.c
+++ b/arch/powerpc/platforms/pasemi/dma_lib.c
@@ -118,14 +118,9 @@ static int pasemi_alloc_tx_chan(enum pasemi_dmachan_type 
type)
                limit = MAX_TXCH;
                break;
        }
-retry:
-       bit = find_next_bit(txch_free, MAX_TXCH, start);
-       if (bit >= limit)
-               return -ENOSPC;
-       if (!test_and_clear_bit(bit, txch_free))
-               goto retry;
-
-       return bit;
+
+       bit = find_and_clear_next_bit(txch_free, MAX_TXCH, start);
+       return bit < limit ? bit : -ENOSPC;
 }
 
 static void pasemi_free_tx_chan(int chan)
@@ -136,15 +131,9 @@ static void pasemi_free_tx_chan(int chan)
 
 static int pasemi_alloc_rx_chan(void)
 {
-       int bit;
-retry:
-       bit = find_first_bit(rxch_free, MAX_RXCH);
-       if (bit >= MAX_TXCH)
-               return -ENOSPC;
-       if (!test_and_clear_bit(bit, rxch_free))
-               goto retry;
-
-       return bit;
+       int bit = find_and_clear_bit(rxch_free, MAX_RXCH);
+
+       return bit < MAX_TXCH ? bit : -ENOSPC;
 }
 
 static void pasemi_free_rx_chan(int chan)
@@ -374,16 +363,9 @@ EXPORT_SYMBOL(pasemi_dma_free_buf);
  */
 int pasemi_dma_alloc_flag(void)
 {
-       int bit;
+       int bit = find_and_clear_bit(flags_free, MAX_FLAGS);
 
-retry:
-       bit = find_first_bit(flags_free, MAX_FLAGS);
-       if (bit >= MAX_FLAGS)
-               return -ENOSPC;
-       if (!test_and_clear_bit(bit, flags_free))
-               goto retry;
-
-       return bit;
+       return bit < MAX_FLAGS ? bit : -ENOSPC;
 }
 EXPORT_SYMBOL(pasemi_dma_alloc_flag);
 
@@ -439,16 +421,9 @@ EXPORT_SYMBOL(pasemi_dma_clear_flag);
  */
 int pasemi_dma_alloc_fun(void)
 {
-       int bit;
-
-retry:
-       bit = find_first_bit(fun_free, MAX_FLAGS);
-       if (bit >= MAX_FLAGS)
-               return -ENOSPC;
-       if (!test_and_clear_bit(bit, fun_free))
-               goto retry;
+       int bit = find_and_clear_bit(fun_free, MAX_FLAGS);
 
-       return bit;
+       return bit < MAX_FLAGS ? bit : -ENOSPC;
 }
 EXPORT_SYMBOL(pasemi_dma_alloc_fun);
 
diff --git a/arch/powerpc/platforms/powernv/pci-sriov.c 
b/arch/powerpc/platforms/powernv/pci-sriov.c
index 59882da3e742..640e387e6d83 100644
--- a/arch/powerpc/platforms/powernv/pci-sriov.c
+++ b/arch/powerpc/platforms/powernv/pci-sriov.c
@@ -397,18 +397,12 @@ static int64_t pnv_ioda_map_m64_single(struct pnv_phb 
*phb,
 
 static int pnv_pci_alloc_m64_bar(struct pnv_phb *phb, struct pnv_iov_data *iov)
 {
-       int win;
+       int win = find_and_set_bit(&phb->ioda.m64_bar_alloc, 
phb->ioda.m64_bar_idx + 1);
 
-       do {
-               win = find_next_zero_bit(&phb->ioda.m64_bar_alloc,
-                               phb->ioda.m64_bar_idx + 1, 0);
-
-               if (win >= phb->ioda.m64_bar_idx + 1)
-                       return -1;
-       } while (test_and_set_bit(win, &phb->ioda.m64_bar_alloc));
+       if (win >= phb->ioda.m64_bar_idx + 1)
+               return -1;
 
        set_bit(win, iov->used_m64_bar_mask);
-
        return win;
 }
 
-- 
2.40.1

Reply via email to