lkml.org 
[lkml]   [2012]   [Jun]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 01/10] string: introduce memweight
    Date
    memweight() is the function that counts the total number of bits set
    in memory area. Unlike bitmap_weight(), memweight() takes pointer
    and size in bytes to specify a memory area which does not need to be
    aligned to long-word boundary.

    Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
    Cc: Anders Larsen <al@alarsen.net>
    Cc: Alasdair Kergon <agk@redhat.com>
    Cc: dm-devel@redhat.com
    Cc: linux-fsdevel@vger.kernel.org
    Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
    Cc: linux-media@vger.kernel.org
    Cc: Mark Fasheh <mfasheh@suse.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: ocfs2-devel@oss.oracle.com
    Cc: Jan Kara <jack@suse.cz>
    Cc: linux-ext4@vger.kernel.org
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Andreas Dilger <adilger.kernel@dilger.ca>
    Cc: "Theodore Ts'o" <tytso@mit.edu>
    Cc: Matthew Wilcox <matthew@wil.cx>
    ---

    v2: simplify memweight(), adviced by Jan Kara

    include/linux/string.h | 3 +++
    lib/string.c | 32 ++++++++++++++++++++++++++++++++
    2 files changed, 35 insertions(+), 0 deletions(-)

    diff --git a/include/linux/string.h b/include/linux/string.h
    index e033564..ffe0442 100644
    --- a/include/linux/string.h
    +++ b/include/linux/string.h
    @@ -145,4 +145,7 @@ static inline bool strstarts(const char *str, const char *prefix)
    return strncmp(str, prefix, strlen(prefix)) == 0;
    }
    #endif
    +
    +extern size_t memweight(const void *ptr, size_t bytes);
    +
    #endif /* _LINUX_STRING_H_ */
    diff --git a/lib/string.c b/lib/string.c
    index e5878de..bf4d5a8 100644
    --- a/lib/string.c
    +++ b/lib/string.c
    @@ -26,6 +26,7 @@
    #include <linux/export.h>
    #include <linux/bug.h>
    #include <linux/errno.h>
    +#include <linux/bitmap.h>

    #ifndef __HAVE_ARCH_STRNICMP
    /**
    @@ -824,3 +825,34 @@ void *memchr_inv(const void *start, int c, size_t bytes)
    return check_bytes8(start, value, bytes % 8);
    }
    EXPORT_SYMBOL(memchr_inv);
    +
    +/**
    + * memweight - count the total number of bits set in memory area
    + * @ptr: pointer to the start of the area
    + * @bytes: the size of the area
    + */
    +size_t memweight(const void *ptr, size_t bytes)
    +{
    + size_t w = 0;
    + size_t longs;
    + const unsigned char *bitmap = ptr;
    +
    + for (; bytes > 0 && ((unsigned long)bitmap) % sizeof(long);
    + bytes--, bitmap++)
    + w += hweight8(*bitmap);
    +
    + longs = bytes / sizeof(long);
    + if (longs) {
    + BUG_ON(longs >= INT_MAX / BITS_PER_LONG);
    + w += bitmap_weight((unsigned long *)bitmap,
    + longs * BITS_PER_LONG);
    + bytes -= longs * sizeof(long);
    + bitmap += longs * sizeof(long);
    + }
    +
    + for (; bytes > 0; bytes--, bitmap++)
    + w += hweight8(*bitmap);
    +
    + return w;
    +}
    +EXPORT_SYMBOL(memweight);
    --
    1.7.7.6


    \
     
     \ /
      Last update: 2012-06-02 16:01    [W:0.033 / U:0.240 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site