#include <linux/export.h>#include <linux/bug.h>#include <linux/bitmap.h>/** * 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_tmemweight(constvoid*ptr,size_tbytes){size_tret=0;size_tlongs;constunsignedchar*bitmap=ptr;for(;bytes>0&&((unsignedlong)bitmap)%sizeof(long);bytes--,bitmap++)ret+=hweight8(*bitmap);longs=bytes/sizeof(long);if(longs){BUG_ON(longs>=INT_MAX/BITS_PER_LONG);ret+=bitmap_weight((unsignedlong*)bitmap,longs*BITS_PER_LONG);bytes-=longs*sizeof(long);bitmap+=longs*sizeof(long);}/* * The reason that this last loop is distinct from the preceding * bitmap_weight() call is to compute 1-bits in the last region smaller * than sizeof(long) properly on big-endian systems. */for(;bytes>0;bytes--,bitmap++)ret+=hweight8(*bitmap);returnret;}EXPORT_SYMBOL(memweight);