X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Finclude%2Flibcfs%2Flibcfs_private.h;h=0b0bf7d2c7c890e1b19c5c8afc70fa68dfaaeec7;hb=e3a7c58aebafce40323db54bf6056029e5af4a70;hp=dd046021cd9a1ea31a436d28eadebd173d9c8abf;hpb=766086478e0758b2ea8bd7ac25fbce037c313288;p=fs%2Flustre-release.git diff --git a/libcfs/include/libcfs/libcfs_private.h b/libcfs/include/libcfs/libcfs_private.h index dd04602..0b0bf7d 100644 --- a/libcfs/include/libcfs/libcfs_private.h +++ b/libcfs/include/libcfs/libcfs_private.h @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -26,8 +24,10 @@ * 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. + * + * Copyright (c) 2011, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -71,55 +71,40 @@ * * requires -Wall. Unfortunately this rules out use of likely/unlikely. */ -#define LASSERT(cond) \ -({ \ - if (cond) \ - ; \ - else \ - libcfs_assertion_failed( #cond , __FILE__, \ - __FUNCTION__, __LINE__); \ -}) - -#define LASSERTF(cond, fmt, a...) \ -({ \ - if (cond) \ - ; \ - else { \ - libcfs_debug_msg(NULL, DEBUG_SUBSYSTEM, D_EMERG, \ - __FILE__, __FUNCTION__,__LINE__, \ - "ASSERTION(" #cond ") failed: " fmt, \ - ## a); \ - LBUG(); \ - } \ -}) +#define LASSERTF(cond, fmt, ...) \ +do { \ + if (cond) \ + ; \ + else { \ + LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, D_EMERG, NULL); \ + libcfs_debug_msg(&msgdata, \ + "ASSERTION( %s ) failed: " fmt, #cond, \ + ## __VA_ARGS__); \ + LBUG(); \ + } \ +} while(0) +#define LASSERT(cond) LASSERTF(cond, "\n") #else /* !LASSERT_CHECKED */ -#define LASSERT(cond) \ -({ \ - if (unlikely(!(cond))) \ - libcfs_assertion_failed(#cond , __FILE__, \ - __FUNCTION__, __LINE__); \ -}) - -#define LASSERTF(cond, fmt, a...) \ -({ \ +#define LASSERTF(cond, fmt, ...) \ +do { \ if (unlikely(!(cond))) { \ - libcfs_debug_msg(NULL, DEBUG_SUBSYSTEM, D_EMERG, \ - __FILE__, __FUNCTION__,__LINE__, \ - "ASSERTION(" #cond ") failed: " fmt, \ - ## a); \ + LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, D_EMERG, NULL); \ + libcfs_debug_msg(&msgdata, \ + "ASSERTION( %s ) failed: " fmt, #cond, \ + ## __VA_ARGS__ ); \ LBUG(); \ } \ -}) - +} while(0) +#define LASSERT(cond) LASSERTF(cond, "\n") #endif /* !LASSERT_CHECKED */ #else /* !LIBCFS_DEBUG */ /* sizeof is to use expression without evaluating it. */ # define LASSERT(e) ((void)sizeof!!(e)) -# define LASSERTF(cond, fmt...) ((void)sizeof!!(cond)) +# define LASSERTF(cond, ...) ((void)sizeof!!(cond)) #endif /* !LIBCFS_DEBUG */ #ifdef INVARIANT_CHECK @@ -135,12 +120,15 @@ #define KLASSERT(e) LASSERT(e) -void lbug_with_loc(const char *file, const char *func, const int line) - __attribute__((noreturn)); +void lbug_with_loc(struct libcfs_debug_msg_data *) __attribute__((noreturn)); -#define LBUG() lbug_with_loc(__FILE__, __FUNCTION__, __LINE__) +#define LBUG() \ +do { \ + LIBCFS_DEBUG_MSG_DATA_DECL(msgdata, D_EMERG, NULL); \ + lbug_with_loc(&msgdata); \ +} while(0) -extern atomic_t libcfs_kmemory; +extern cfs_atomic_t libcfs_kmemory; /* * Memory */ @@ -148,11 +136,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 @@ -160,28 +148,29 @@ 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)) \ + if (unlikely((size) > LIBCFS_VMALLOC_SIZE)) \ (ptr) = cfs_alloc_large(size); \ else \ (ptr) = cfs_alloc((size), (mask)); \ - if (unlikely((ptr) == NULL)) { \ + if (unlikely((ptr) == NULL)) { \ 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)); \ - } else { \ - libcfs_kmem_inc((ptr), (size)); \ - if (!((mask) & CFS_ALLOC_ZERO)) \ - memset((ptr), 0, (size)); \ + cfs_atomic_read(&libcfs_kmemory)); \ + break; \ } \ + libcfs_kmem_inc((ptr), (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) \ @@ -200,7 +189,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 \ @@ -223,7 +212,7 @@ do { \ void libcfs_debug_dumpstack(cfs_task_t *tsk); void libcfs_run_upcall(char **argv); -void libcfs_run_lbug_upcall(const char * file, const char *fn, const int line); +void libcfs_run_lbug_upcall(struct libcfs_debug_msg_data *); void libcfs_debug_dumplog(void); int libcfs_debug_init(unsigned long bufsize); int libcfs_debug_cleanup(void); @@ -237,10 +226,10 @@ void libcfs_debug_set_level(unsigned int debug_level); # undef NDEBUG # include # define LASSERT(e) assert(e) -# define LASSERTF(cond, args...) \ +# define LASSERTF(cond, ...) \ do { \ if (!(cond)) \ - CERROR(args); \ + CERROR(__VA_ARGS__); \ assert(cond); \ } while (0) # define LBUG() assert(0) @@ -251,12 +240,12 @@ do { \ # endif # else # define LASSERT(e) ((void)sizeof!!(e)) -# define LASSERTF(cond, args...) ((void)sizeof!!(cond)) +# define LASSERTF(cond, ...) ((void)sizeof!!(cond)) # define LBUG() ((void)(0)) # define LINVRNT(exp) ((void)sizeof!!(exp)) # endif /* LIBCFS_DEBUG */ # define KLASSERT(e) ((void)0) -# define printk(format, args...) printf (format, ## args) +# define printk printf # ifdef CRAY_XT3 /* buggy calloc! */ # define LIBCFS_ALLOC(ptr, size) \ do { \ @@ -266,39 +255,139 @@ 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); int libcfs_debug_cleanup(void); +#define libcfs_debug_dumpstack(tsk) ((void)0) + /* * Generic compiler-dependent macros required for kernel * build go below this comment. Actual compiler/compiler version * specific implementations come from the above header files */ - +#ifdef __GNUC__ #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) - +#else +#define likely(x) (!!(x)) +#define unlikely(x) (!!(x)) +#endif /* !__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 * value after conversion... * */ -#define CLASSERT(cond) ({ switch(42) { case (cond): case 0: break; } }) +#define CLASSERT(cond) do {switch(42) {case (cond): case 0: break;}} while (0) /* support decl needed both by kernel and liblustre */ int libcfs_isknown_lnd(int type); @@ -311,23 +400,36 @@ __u32 libcfs_str2net(const char *str); 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(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 /* implication */ #define ergo(a, b) (!(a) || (b)) /* 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 /* -------------------------------------------------------------------- @@ -352,50 +454,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) \ @@ -404,7 +509,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) /** @@ -415,7 +520,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, @@ -425,6 +530,7 @@ enum { RALND = 10, VIBLND = 11, MXLND = 12, + GNILND = 13, }; #endif