lkml.org 
[lkml]   [2017]   [Dec]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 10/33] lib/genalloc.c: make the avail variable an atomic_long_t
    Date
    From: Stephen Bates <sbates@raithlin.com>

    [ Upstream commit 36a3d1dd4e16bcd0d2ddfb4a2ec7092f0ae0d931 ]

    If the amount of resources allocated to a gen_pool exceeds 2^32 then the
    avail atomic overflows and this causes problems when clients try and
    borrow resources from the pool. This is only expected to be an issue on
    64 bit systems.

    Add the <linux/atomic.h> header to pull in atomic_long* operations. So
    that 32 bit systems continue to use atomic32_t but 64 bit systems can
    use atomic64_t.

    Link: http://lkml.kernel.org/r/1509033843-25667-1-git-send-email-sbates@raithlin.com
    Signed-off-by: Stephen Bates <sbates@raithlin.com>
    Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
    Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Reviewed-by: Daniel Mentz <danielmentz@google.com>
    Cc: Jonathan Corbet <corbet@lwn.net>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Will Deacon <will.deacon@arm.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    ---
    include/linux/genalloc.h | 3 ++-
    lib/genalloc.c | 10 +++++-----
    2 files changed, 7 insertions(+), 6 deletions(-)

    diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h
    index 29d4385903d4..206fe3bccccc 100644
    --- a/include/linux/genalloc.h
    +++ b/include/linux/genalloc.h
    @@ -32,6 +32,7 @@

    #include <linux/types.h>
    #include <linux/spinlock_types.h>
    +#include <linux/atomic.h>

    struct device;
    struct device_node;
    @@ -70,7 +71,7 @@ struct gen_pool {
    */
    struct gen_pool_chunk {
    struct list_head next_chunk; /* next chunk in pool */
    - atomic_t avail;
    + atomic_long_t avail;
    phys_addr_t phys_addr; /* physical starting address of memory chunk */
    unsigned long start_addr; /* start address of memory chunk */
    unsigned long end_addr; /* end address of memory chunk (inclusive) */
    diff --git a/lib/genalloc.c b/lib/genalloc.c
    index 144fe6b1a03e..ca06adc4f445 100644
    --- a/lib/genalloc.c
    +++ b/lib/genalloc.c
    @@ -194,7 +194,7 @@ int gen_pool_add_virt(struct gen_pool *pool, unsigned long virt, phys_addr_t phy
    chunk->phys_addr = phys;
    chunk->start_addr = virt;
    chunk->end_addr = virt + size - 1;
    - atomic_set(&chunk->avail, size);
    + atomic_long_set(&chunk->avail, size);

    spin_lock(&pool->lock);
    list_add_rcu(&chunk->next_chunk, &pool->chunks);
    @@ -304,7 +304,7 @@ unsigned long gen_pool_alloc_algo(struct gen_pool *pool, size_t size,
    nbits = (size + (1UL << order) - 1) >> order;
    rcu_read_lock();
    list_for_each_entry_rcu(chunk, &pool->chunks, next_chunk) {
    - if (size > atomic_read(&chunk->avail))
    + if (size > atomic_long_read(&chunk->avail))
    continue;

    start_bit = 0;
    @@ -324,7 +324,7 @@ retry:

    addr = chunk->start_addr + ((unsigned long)start_bit << order);
    size = nbits << order;
    - atomic_sub(size, &chunk->avail);
    + atomic_long_sub(size, &chunk->avail);
    break;
    }
    rcu_read_unlock();
    @@ -390,7 +390,7 @@ void gen_pool_free(struct gen_pool *pool, unsigned long addr, size_t size)
    remain = bitmap_clear_ll(chunk->bits, start_bit, nbits);
    BUG_ON(remain);
    size = nbits << order;
    - atomic_add(size, &chunk->avail);
    + atomic_long_add(size, &chunk->avail);
    rcu_read_unlock();
    return;
    }
    @@ -464,7 +464,7 @@ size_t gen_pool_avail(struct gen_pool *pool)

    rcu_read_lock();
    list_for_each_entry_rcu(chunk, &pool->chunks, next_chunk)
    - avail += atomic_read(&chunk->avail);
    + avail += atomic_long_read(&chunk->avail);
    rcu_read_unlock();
    return avail;
    }
    --
    2.11.0
    \
     
     \ /
      Last update: 2017-12-02 17:10    [W:4.131 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site