From dd29f49a6c4e241b055175f29e17ee2fe8457fcd Mon Sep 17 00:00:00 2001 From: Jeff Mahoney Date: Mon, 26 Aug 2013 12:20:59 -0400 Subject: [PATCH] sparse: move bitops functions to include/misc.h The bitops functions were declared as 'extern inline' in include/misc.h but weren't actually defined there. They were also defined as inline in lib/misc.c, which can't actually happen if they're used elsewhere. Signed-off-by: Jeff Mahoney --- include/misc.h | 144 ++++++++++++++++++++++++++++++++++++++++++++----- lib/misc.c | 135 ---------------------------------------------- 2 files changed, 132 insertions(+), 147 deletions(-) diff --git a/include/misc.h b/include/misc.h index 93d9f8f..49e7b2b 100644 --- a/include/misc.h +++ b/include/misc.h @@ -83,24 +83,144 @@ __u32 get_random(void); int user_confirmed(FILE * fp, char *q, char *yes); -extern inline int misc_set_bit(unsigned long long nr, void *addr); -extern inline int misc_clear_bit(unsigned long long nr, void *addr); -extern inline int misc_test_bit(unsigned long long nr, const void *addr); -extern inline unsigned long long misc_find_first_zero_bit(const void *vaddr, +/* Only le bitops operations are used. */ +static inline int misc_set_bit(unsigned long long nr, void *addr) +{ + __u8 *p, mask; + int retval; + + p = (__u8 *) addr; + p += nr >> 3; + mask = 1 << (nr & 0x7); + /*cli(); */ + retval = (mask & *p) != 0; + *p |= mask; + /*sti(); */ + return retval; +} + +static inline int misc_clear_bit(unsigned long long nr, void *addr) +{ + __u8 *p, mask; + int retval; + + p = (__u8 *) addr; + p += nr >> 3; + mask = 1 << (nr & 0x7); + /*cli(); */ + retval = (mask & *p) != 0; + *p &= ~mask; + /*sti(); */ + return retval; +} + +static inline int misc_test_bit(unsigned long long nr, const void *addr) +{ + __u8 *p, mask; + + p = (__u8 *) addr; + p += nr >> 3; + mask = 1 << (nr & 0x7); + return ((mask & *p) != 0); +} + +static inline unsigned long long misc_find_first_zero_bit(const void *vaddr, unsigned long long - size); -extern inline unsigned long long misc_find_next_zero_bit(const void *vaddr, + size) +{ + const __u8 *p = vaddr, *addr = vaddr; + unsigned long long res; + + if (!size) + return 0; + + size = (size >> 3) + ((size & 0x7) > 0); + while (*p++ == 255) { + if (--size == 0) + return (unsigned long long)(p - addr) << 3; + } + + --p; + for (res = 0; res < 8; res++) + if (!misc_test_bit(res, p)) + break; + return res + (p - addr) * 8; +} + +static inline unsigned long long misc_find_next_zero_bit(const void *vaddr, unsigned long long size, unsigned long long - offset); -extern inline unsigned long long misc_find_next_set_bit(const void *vaddr, + offset) +{ + const __u8 *addr = vaddr; + const __u8 *p = addr + (offset >> 3); + int bit = offset & 7; + unsigned long long res; + + if (offset >= size) + return size; + + if (bit) { + /* Look for zero in first char */ + for (res = bit; res < 8; res++) + if (!misc_test_bit(res, p)) + return res + (p - addr) * 8; + p++; + } + /* No zero yet, search remaining full bytes for a zero */ + res = misc_find_first_zero_bit(p, size - 8 * (p - addr)); + return res + (p - addr) * 8; +} + +static inline unsigned long long misc_find_first_set_bit(const void *vaddr, + unsigned long long + size) +{ + const __u8 *p = vaddr, *addr = vaddr; + unsigned long long res; + + if (!size) + return 0; + + size = (size >> 3) + ((size & 0x7) > 0); + while (*p++ == 0) { + if (--size == 0) + return (unsigned long long)(p - addr) << 3; + } + + --p; + for (res = 0; res < 8; res++) + if (misc_test_bit(res, p)) + break; + + return res + (p - addr) * 8; +} + +static inline unsigned long long misc_find_next_set_bit(const void *vaddr, unsigned long long size, unsigned long long - offset); -extern inline unsigned long long misc_find_first_set_bit(const void *vaddr, - unsigned long long - size); + offset) +{ + const __u8 *addr = vaddr; + const __u8 *p = addr + (offset >> 3); + int bit = offset & 7; + unsigned long long res; + + if (offset >= size) + return size; + + if (bit) { + /* Look for zero in first char */ + for (res = bit; res < 8; res++) + if (misc_test_bit(res, p)) + return res + (p - addr) * 8; + p++; + } + /* No set bit yet, search remaining full bytes for a 1 */ + res = misc_find_first_set_bit(p, size - 8 * (p - addr)); + return res + (p - addr) * 8; +} #define STAT_FIELD_H(Field, Type) \ inline Type misc_device_##Field(char *device); diff --git a/lib/misc.c b/lib/misc.c index d60d56d..409a219 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -813,141 +813,6 @@ void clean_after_dma_check(int fd, dma_info_t *dma_info) close(dma_info->fd); } -/* Only le bitops operations are used. */ - -inline int misc_set_bit(unsigned long long nr, void *addr) -{ - __u8 *p, mask; - int retval; - - p = (__u8 *) addr; - p += nr >> 3; - mask = 1 << (nr & 0x7); - /*cli(); */ - retval = (mask & *p) != 0; - *p |= mask; - /*sti(); */ - return retval; -} - -inline int misc_clear_bit(unsigned long long nr, void *addr) -{ - __u8 *p, mask; - int retval; - - p = (__u8 *) addr; - p += nr >> 3; - mask = 1 << (nr & 0x7); - /*cli(); */ - retval = (mask & *p) != 0; - *p &= ~mask; - /*sti(); */ - return retval; -} - -inline int misc_test_bit(unsigned long long nr, const void *addr) -{ - __u8 *p, mask; - - p = (__u8 *) addr; - p += nr >> 3; - mask = 1 << (nr & 0x7); - return ((mask & *p) != 0); -} - -inline unsigned long long misc_find_first_zero_bit(const void *vaddr, - unsigned long long size) -{ - const __u8 *p = vaddr, *addr = vaddr; - unsigned long long res; - - if (!size) - return 0; - - size = (size >> 3) + ((size & 0x7) > 0); - while (*p++ == 255) { - if (--size == 0) - return (unsigned long long)(p - addr) << 3; - } - - --p; - for (res = 0; res < 8; res++) - if (!misc_test_bit(res, p)) - break; - return res + (p - addr) * 8; -} - -inline unsigned long long misc_find_next_zero_bit(const void *vaddr, - unsigned long long size, - unsigned long long offset) -{ - const __u8 *addr = vaddr; - const __u8 *p = addr + (offset >> 3); - int bit = offset & 7; - unsigned long long res; - - if (offset >= size) - return size; - - if (bit) { - /* Look for zero in first char */ - for (res = bit; res < 8; res++) - if (!misc_test_bit(res, p)) - return res + (p - addr) * 8; - p++; - } - /* No zero yet, search remaining full bytes for a zero */ - res = misc_find_first_zero_bit(p, size - 8 * (p - addr)); - return res + (p - addr) * 8; -} - -inline unsigned long long misc_find_first_set_bit(const void *vaddr, - unsigned long long size) -{ - const __u8 *p = vaddr, *addr = vaddr; - unsigned long long res; - - if (!size) - return 0; - - size = (size >> 3) + ((size & 0x7) > 0); - while (*p++ == 0) { - if (--size == 0) - return (unsigned long long)(p - addr) << 3; - } - - --p; - for (res = 0; res < 8; res++) - if (misc_test_bit(res, p)) - break; - - return res + (p - addr) * 8; -} - -inline unsigned long long misc_find_next_set_bit(const void *vaddr, - unsigned long long size, - unsigned long long offset) -{ - const __u8 *addr = vaddr; - const __u8 *p = addr + (offset >> 3); - int bit = offset & 7; - unsigned long long res; - - if (offset >= size) - return size; - - if (bit) { - /* Look for zero in first char */ - for (res = bit; res < 8; res++) - if (misc_test_bit(res, p)) - return res + (p - addr) * 8; - p++; - } - /* No set bit yet, search remaining full bytes for a 1 */ - res = misc_find_first_set_bit(p, size - 8 * (p - addr)); - return res + (p - addr) * 8; -} - int user_confirmed(FILE * fp, char *q, char *yes) { char *answer = 0;