X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Finclude%2Flibcfs%2Fuser-bitops.h;h=4ce7bdf702270120e725d226916af4a9804aecf9;hb=40e312a8275ed9240e63f0ac023d8b7a38136f42;hp=d2eea0edaf35b6b478cef7d6183a50ad4cb4155b;hpb=e1b3d71a27c166bebd26ab33f7299c41bd75dab5;p=fs%2Flustre-release.git diff --git a/libcfs/include/libcfs/user-bitops.h b/libcfs/include/libcfs/user-bitops.h index d2eea0e..4ce7bdf 100644 --- a/libcfs/include/libcfs/user-bitops.h +++ b/libcfs/include/libcfs/user-bitops.h @@ -1,35 +1,50 @@ /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * Copyright (C) 2004 Cluster File Systems, Inc. - * Author: Nikita Danilov + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. * - * This file is part of Lustre, http://www.lustre.org. + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). * - * Lustre is free software; you can redistribute it and/or modify it under the - * terms of version 2 of the GNU General Public License as published by the - * Free Software Foundation. + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * - * Lustre is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. * - * You should have received a copy of the GNU General Public License along - * with Lustre; if not, write to the Free Software Foundation, Inc., 675 Mass - * Ave, Cambridge, MA 02139, USA. + * GPL HEADER END + */ +/* + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. * - * Implementation of portable time API for user-level. + * libcfs/include/libcfs/user-bitops.h * + * Author: Nikita Danilov */ #ifndef __LIBCFS_USER_BITOPS_H__ #define __LIBCFS_USER_BITOPS_H__ /* test if bit nr is set in bitmap addr; returns previous value of bit nr */ -static __inline__ int set_bit(int nr, unsigned long * addr) +static __inline__ int cfs_test_and_set_bit(int nr, unsigned long *addr) { - long mask; + unsigned long mask; addr += nr / BITS_PER_LONG; mask = 1UL << (nr & (BITS_PER_LONG - 1)); @@ -38,10 +53,12 @@ static __inline__ int set_bit(int nr, unsigned long * addr) return nr; } +#define cfs_set_bit(n, a) cfs_test_and_set_bit(n, a) + /* clear bit nr in bitmap addr; returns previous value of bit nr*/ -static __inline__ int clear_bit(int nr, unsigned long * addr) +static __inline__ int cfs_test_and_clear_bit(int nr, unsigned long *addr) { - long mask; + unsigned long mask; addr += nr / BITS_PER_LONG; mask = 1UL << (nr & (BITS_PER_LONG - 1)); @@ -50,13 +67,55 @@ static __inline__ int clear_bit(int nr, unsigned long * addr) return nr; } -static __inline__ int test_bit(int nr, const unsigned long * addr) +#define cfs_clear_bit(n, a) cfs_test_and_clear_bit(n, a) + +static __inline__ int cfs_test_bit(int nr, const unsigned long *addr) { - return ((1UL << (nr & (BITS_PER_LONG - 1))) & ((addr)[nr / BITS_PER_LONG])) != 0; + return ((1UL << (nr & (BITS_PER_LONG - 1))) & + ((addr)[nr / BITS_PER_LONG])) != 0; } /* using binary seach */ -static __inline__ unsigned long __ffs(long data) +static __inline__ unsigned long __cfs_fls(long data) +{ + int pos = 32; + + if (!data) + return 0; + +#if BITS_PER_LONG == 64 + /* If any bit of the high 32 bits are set, shift the high + * 32 bits down and pretend like it is a 32-bit value. */ + if ((data & 0xFFFFFFFF00000000llu)) { + data >>= 32; + pos += 32; + } +#endif + + if (!(data & 0xFFFF0000u)) { + data <<= 16; + pos -= 16; + } + if (!(data & 0xFF000000u)) { + data <<= 8; + pos -= 8; + } + if (!(data & 0xF0000000u)) { + data <<= 4; + pos -= 4; + } + if (!(data & 0xC0000000u)) { + data <<= 2; + pos -= 2; + } + if (!(data & 0x80000000u)) { + data <<= 1; + pos -= 1; + } + return pos; +} + +static __inline__ unsigned long __cfs_ffs(long data) { int pos = 0; @@ -88,15 +147,17 @@ static __inline__ unsigned long __ffs(long data) return pos; } -#define __ffz(x) __ffs(~(x)) +#define __cfs_ffz(x) __cfs_ffs(~(x)) +#define __cfs_flz(x) __cfs_fls(~(x)) -unsigned long find_next_bit(unsigned long *addr, - unsigned long size, unsigned long offset); +unsigned long cfs_find_next_bit(unsigned long *addr, + unsigned long size, unsigned long offset); -unsigned long find_next_zero_bit(unsigned long *addr, - unsigned long size, unsigned long offset); +unsigned long cfs_find_next_zero_bit(unsigned long *addr, + unsigned long size, unsigned long offset); -#define find_first_bit(addr,size) (find_next_bit((addr),(size),0)) -#define find_first_zero_bit(addr,size) (find_next_zero_bit((addr),(size),0)) +#define cfs_find_first_bit(addr,size) (cfs_find_next_bit((addr),(size),0)) +#define cfs_find_first_zero_bit(addr,size) \ + (cfs_find_next_zero_bit((addr),(size),0)) #endif