X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=libcfs%2Finclude%2Flibcfs%2Flibcfs_private.h;h=b7ba6e6aa8ca3f13b19780b9c8af8c3c7fff6065;hp=336fef753b96b64b2b9942ec6ae2913d980a13db;hb=a5b81807c5d6d2cb3b2ef1a0a7e150ee6002f7f7;hpb=118bb27a7b2acce63cd0cf52af10f53b95f2a732 diff --git a/libcfs/include/libcfs/libcfs_private.h b/libcfs/include/libcfs/libcfs_private.h index 336fef7..b7ba6e6 100644 --- a/libcfs/include/libcfs/libcfs_private.h +++ b/libcfs/include/libcfs/libcfs_private.h @@ -26,7 +26,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -138,7 +138,7 @@ void lbug_with_loc(const char *file, const char *func, const int line) #define LBUG() lbug_with_loc(__FILE__, __FUNCTION__, __LINE__) -extern atomic_t libcfs_kmemory; +extern cfs_atomic_t libcfs_kmemory; /* * Memory */ @@ -146,11 +146,11 @@ extern atomic_t libcfs_kmemory; # define libcfs_kmem_inc(ptr, size) \ do { \ - atomic_add(size, &libcfs_kmemory); \ + cfs_atomic_add(size, &libcfs_kmemory); \ } while (0) # define libcfs_kmem_dec(ptr, size) do { \ - atomic_sub(size, &libcfs_kmemory); \ + cfs_atomic_sub(size, &libcfs_kmemory); \ } while (0) #else @@ -158,11 +158,13 @@ do { \ # define libcfs_kmem_dec(ptr, size) do {} while (0) #endif /* LIBCFS_DEBUG */ -#define LIBCFS_VMALLOC_SIZE 16384 +#ifndef LIBCFS_VMALLOC_SIZE +#define LIBCFS_VMALLOC_SIZE (2 << CFS_PAGE_SHIFT) /* 2 pages */ +#endif #define LIBCFS_ALLOC_GFP(ptr, size, mask) \ do { \ - LASSERT(!in_interrupt() || \ + LASSERT(!cfs_in_interrupt() || \ (size <= LIBCFS_VMALLOC_SIZE && mask == CFS_ALLOC_ATOMIC));\ if (unlikely((size) > LIBCFS_VMALLOC_SIZE)) \ (ptr) = cfs_alloc_large(size); \ @@ -172,14 +174,13 @@ do { \ CERROR("LNET: out of memory at %s:%d (tried to alloc '" \ #ptr "' = %d)\n", __FILE__, __LINE__, (int)(size));\ CERROR("LNET: %d total bytes allocated by lnet\n", \ - atomic_read(&libcfs_kmemory)); \ + cfs_atomic_read(&libcfs_kmemory)); \ break; \ } \ libcfs_kmem_inc((ptr), (size)); \ - if (!((mask) & CFS_ALLOC_ZERO)) \ - memset((ptr), 0, (size)); \ + memset((ptr), 0, (size)); \ CDEBUG(D_MALLOC, "kmalloced '" #ptr "': %d at %p (tot %d).\n", \ - (int)(size), (ptr), atomic_read (&libcfs_kmemory)); \ + (int)(size), (ptr), cfs_atomic_read (&libcfs_kmemory)); \ } while (0) #define LIBCFS_ALLOC(ptr, size) \ @@ -198,7 +199,7 @@ do { \ } \ libcfs_kmem_dec((ptr), s); \ CDEBUG(D_MALLOC, "kfreed '" #ptr "': %d at %p (tot %d).\n", \ - s, (ptr), atomic_read(&libcfs_kmemory)); \ + s, (ptr), cfs_atomic_read(&libcfs_kmemory)); \ if (unlikely(s > LIBCFS_VMALLOC_SIZE)) \ cfs_free_large(ptr); \ else \ @@ -264,7 +265,7 @@ do { \ # else # define LIBCFS_ALLOC(ptr, size) do { (ptr) = calloc(1,size); } while (0) # endif -# define LIBCFS_FREE(a, b) do { free(a); } while (0) +# define LIBCFS_FREE(ptr, size) do { free(ptr); } while((size) - (size)) void libcfs_debug_dumplog(void); int libcfs_debug_init(unsigned long bufsize); @@ -287,14 +288,109 @@ int libcfs_debug_cleanup(void); /* !__KERNEL__ */ #endif -/* - * compile-time assertions. @cond has to be constant expression. - * ISO C Standard: - * - * 6.8.4.2 The switch statement +#define LASSERT_ATOMIC_ENABLED (1) + +#if LASSERT_ATOMIC_ENABLED + +/** assert value of @a is equal to @v */ +#define LASSERT_ATOMIC_EQ(a, v) \ +do { \ + LASSERTF(cfs_atomic_read(a) == v, \ + "value: %d\n", cfs_atomic_read((a))); \ +} while (0) + +/** assert value of @a is unequal to @v */ +#define LASSERT_ATOMIC_NE(a, v) \ +do { \ + LASSERTF(cfs_atomic_read(a) != v, \ + "value: %d\n", cfs_atomic_read((a))); \ +} while (0) + +/** assert value of @a is little than @v */ +#define LASSERT_ATOMIC_LT(a, v) \ +do { \ + LASSERTF(cfs_atomic_read(a) < v, \ + "value: %d\n", cfs_atomic_read((a))); \ +} while (0) + +/** assert value of @a is little/equal to @v */ +#define LASSERT_ATOMIC_LE(a, v) \ +do { \ + LASSERTF(cfs_atomic_read(a) <= v, \ + "value: %d\n", cfs_atomic_read((a))); \ +} while (0) + +/** assert value of @a is great than @v */ +#define LASSERT_ATOMIC_GT(a, v) \ +do { \ + LASSERTF(cfs_atomic_read(a) > v, \ + "value: %d\n", cfs_atomic_read((a))); \ +} while (0) + +/** assert value of @a is great/equal to @v */ +#define LASSERT_ATOMIC_GE(a, v) \ +do { \ + LASSERTF(cfs_atomic_read(a) >= v, \ + "value: %d\n", cfs_atomic_read((a))); \ +} while (0) + +/** assert value of @a is great than @v1 and little than @v2 */ +#define LASSERT_ATOMIC_GT_LT(a, v1, v2) \ +do { \ + int __v = cfs_atomic_read(a); \ + LASSERTF(__v > v1 && __v < v2, "value: %d\n", __v); \ +} while (0) + +/** assert value of @a is great than @v1 and little/equal to @v2 */ +#define LASSERT_ATOMIC_GT_LE(a, v1, v2) \ +do { \ + int __v = cfs_atomic_read(a); \ + LASSERTF(__v > v1 && __v <= v2, "value: %d\n", __v); \ +} while (0) + +/** assert value of @a is great/equal to @v1 and little than @v2 */ +#define LASSERT_ATOMIC_GE_LT(a, v1, v2) \ +do { \ + int __v = cfs_atomic_read(a); \ + LASSERTF(__v >= v1 && __v < v2, "value: %d\n", __v); \ +} while (0) + +/** assert value of @a is great/equal to @v1 and little/equal to @v2 */ +#define LASSERT_ATOMIC_GE_LE(a, v1, v2) \ +do { \ + int __v = cfs_atomic_read(a); \ + LASSERTF(__v >= v1 && __v <= v2, "value: %d\n", __v); \ +} while (0) + +#else /* !LASSERT_ATOMIC_ENABLED */ + +#define LASSERT_ATOMIC_EQ(a, v) do {} while (0) +#define LASSERT_ATOMIC_NE(a, v) do {} while (0) +#define LASSERT_ATOMIC_LT(a, v) do {} while (0) +#define LASSERT_ATOMIC_LE(a, v) do {} while (0) +#define LASSERT_ATOMIC_GT(a, v) do {} while (0) +#define LASSERT_ATOMIC_GE(a, v) do {} while (0) +#define LASSERT_ATOMIC_GT_LT(a, v1, v2) do {} while (0) +#define LASSERT_ATOMIC_GT_LE(a, v1, v2) do {} while (0) +#define LASSERT_ATOMIC_GE_LT(a, v1, v2) do {} while (0) +#define LASSERT_ATOMIC_GE_LE(a, v1, v2) do {} while (0) + +#endif /* LASSERT_ATOMIC_ENABLED */ + +#define LASSERT_ATOMIC_ZERO(a) LASSERT_ATOMIC_EQ(a, 0) +#define LASSERT_ATOMIC_POS(a) LASSERT_ATOMIC_GT(a, 0) + +#define CFS_ALLOC_PTR(ptr) LIBCFS_ALLOC(ptr, sizeof (*(ptr))); +#define CFS_FREE_PTR(ptr) LIBCFS_FREE(ptr, sizeof (*(ptr))); + +/** Compile-time assertion. + + * Check an invariant described by a constant expression at compile time by + * forcing a compiler error if it does not hold. \a cond must be a constant + * expression as defined by the ISO C Standard: * + * 6.8.4.2 The switch statement * .... - * * [#3] The expression of each case label shall be an integer * constant expression and no two of the case constant * expressions in the same switch statement shall have the same @@ -315,18 +411,24 @@ lnet_nid_t libcfs_str2nid(const char *str); int libcfs_str2anynid(lnet_nid_t *nid, const char *str); char *libcfs_id2str(lnet_process_id_t id); int cfs_iswhite(char c); -void cfs_free_nidlist(struct list_head *list); -int cfs_parse_nidlist(char *str, int len, struct list_head *list); -int cfs_match_nid(lnet_nid_t nid, struct list_head *list); +void cfs_free_nidlist(cfs_list_t *list); +int cfs_parse_nidlist(char *str, int len, cfs_list_t *list); +int cfs_match_nid(lnet_nid_t nid, cfs_list_t *list); +/** \addtogroup lnet_addr + * @{ */ /* how an LNET NID encodes net:address */ +/** extract the address part of an lnet_nid_t */ #define LNET_NIDADDR(nid) ((__u32)((nid) & 0xffffffff)) +/** extract the network part of an lnet_nid_t */ #define LNET_NIDNET(nid) ((__u32)(((nid) >> 32)) & 0xffffffff) +/** make an lnet_nid_t from a network part and an address part */ #define LNET_MKNID(net,addr) ((((__u64)(net))<<32)|((__u64)(addr))) /* how net encodes type:number */ #define LNET_NETNUM(net) ((net) & 0xffff) #define LNET_NETTYP(net) (((net) >> 16) & 0xffff) #define LNET_MKNET(typ,num) ((((__u32)(typ))<<16)|((__u32)(num))) +/** @} lnet_addr */ /* max value for numeric network address */ #define MAX_NUMERIC_VALUE 0xffffffff @@ -336,8 +438,8 @@ int cfs_match_nid(lnet_nid_t nid, struct list_head *list); /* logical equivalence */ #define equi(a, b) (!!(a) == !!(b)) -#ifndef CURRENT_TIME -# define CURRENT_TIME time(0) +#ifndef CFS_CURRENT_TIME +# define CFS_CURRENT_TIME time(0) #endif /* -------------------------------------------------------------------- @@ -362,50 +464,53 @@ struct libcfs_device_userstate #define MKSTR(ptr) ((ptr))? (ptr) : "" -static inline int size_round4 (int val) +static inline int cfs_size_round4 (int val) { return (val + 3) & (~0x3); } -static inline int size_round (int val) +#ifndef HAVE_CFS_SIZE_ROUND +static inline int cfs_size_round (int val) { return (val + 7) & (~0x7); } +#define HAVE_CFS_SIZE_ROUND +#endif -static inline int size_round16(int val) +static inline int cfs_size_round16(int val) { return (val + 0xf) & (~0xf); } -static inline int size_round32(int val) +static inline int cfs_size_round32(int val) { return (val + 0x1f) & (~0x1f); } -static inline int size_round0(int val) +static inline int cfs_size_round0(int val) { if (!val) return 0; return (val + 1 + 7) & (~0x7); } -static inline size_t round_strlen(char *fset) +static inline size_t cfs_round_strlen(char *fset) { - return (size_t)size_round((int)strlen(fset) + 1); + return (size_t)cfs_size_round((int)strlen(fset) + 1); } #define LOGL(var,len,ptr) \ do { \ if (var) \ memcpy((char *)ptr, (const char *)var, len); \ - ptr += size_round(len); \ + ptr += cfs_size_round(len); \ } while (0) #define LOGU(var,len,ptr) \ do { \ if (var) \ memcpy((char *)var, (const char *)ptr, len); \ - ptr += size_round(len); \ + ptr += cfs_size_round(len); \ } while (0) #define LOGL0(var,len,ptr) \ @@ -414,7 +519,7 @@ do { \ break; \ memcpy((char *)ptr, (const char *)var, len); \ *((char *)(ptr) + len) = 0; \ - ptr += size_round(len + 1); \ + ptr += cfs_size_round(len + 1); \ } while (0) /** @@ -425,7 +530,7 @@ enum { * network addresses depend on them... */ QSWLND = 1, SOCKLND = 2, - GMLND = 3, + GMLND = 3, /* obsolete, keep it so that libcfs_nid2str works */ PTLLND = 4, O2IBLND = 5, CIBLND = 6, @@ -435,6 +540,7 @@ enum { RALND = 10, VIBLND = 11, MXLND = 12, + GNILND = 13, }; #endif