Version:  2.0.40 2.2.26 2.4.37 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10

Linux/lib/memweight.c

  1 #include <linux/export.h>
  2 #include <linux/bug.h>
  3 #include <linux/bitmap.h>
  4 
  5 /**
  6  * memweight - count the total number of bits set in memory area
  7  * @ptr: pointer to the start of the area
  8  * @bytes: the size of the area
  9  */
 10 size_t memweight(const void *ptr, size_t bytes)
 11 {
 12         size_t ret = 0;
 13         size_t longs;
 14         const unsigned char *bitmap = ptr;
 15 
 16         for (; bytes > 0 && ((unsigned long)bitmap) % sizeof(long);
 17                         bytes--, bitmap++)
 18                 ret += hweight8(*bitmap);
 19 
 20         longs = bytes / sizeof(long);
 21         if (longs) {
 22                 BUG_ON(longs >= INT_MAX / BITS_PER_LONG);
 23                 ret += bitmap_weight((unsigned long *)bitmap,
 24                                 longs * BITS_PER_LONG);
 25                 bytes -= longs * sizeof(long);
 26                 bitmap += longs * sizeof(long);
 27         }
 28         /*
 29          * The reason that this last loop is distinct from the preceding
 30          * bitmap_weight() call is to compute 1-bits in the last region smaller
 31          * than sizeof(long) properly on big-endian systems.
 32          */
 33         for (; bytes > 0; bytes--, bitmap++)
 34                 ret += hweight8(*bitmap);
 35 
 36         return ret;
 37 }
 38 EXPORT_SYMBOL(memweight);
 39 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us