X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=libcfs%2Finclude%2Flibcfs%2Flibcfs_private.h;h=47197b3741ae61684677b82cd3f177d8934c8caf;hp=4488cd68c7727f9d20f20777d5096250c5205957;hb=b8bddf048483d3ed95201de06f2da0925c82cd54;hpb=2668b5ab52f1a004c4d4383c648d0184467b8a2f diff --git a/libcfs/include/libcfs/libcfs_private.h b/libcfs/include/libcfs/libcfs_private.h index 4488cd6..47197b3 100644 --- a/libcfs/include/libcfs/libcfs_private.h +++ b/libcfs/include/libcfs/libcfs_private.h @@ -27,7 +27,7 @@ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, Whamcloud, Inc. + * Copyright (c) 2011, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -42,9 +42,6 @@ #ifndef __LIBCFS_PRIVATE_H__ #define __LIBCFS_PRIVATE_H__ -/* XXX this layering violation is for nidstrings */ -#include - #ifndef DEBUG_SUBSYSTEM # define DEBUG_SUBSYSTEM S_UNDEFINED #endif @@ -107,7 +104,7 @@ do { \ # define LASSERTF(cond, ...) ((void)sizeof!!(cond)) #endif /* !LIBCFS_DEBUG */ -#ifdef INVARIANT_CHECK +#ifdef CONFIG_LUSTRE_DEBUG_EXPENSIVE_CHECK /** * This is for more expensive checks that one doesn't want to be enabled all * the time. LINVRNT() has to be explicitly enabled by --enable-invariants @@ -128,7 +125,7 @@ do { \ lbug_with_loc(&msgdata); \ } while(0) -extern cfs_atomic_t libcfs_kmemory; +extern atomic_t libcfs_kmemory; /* * Memory */ @@ -136,16 +133,16 @@ extern cfs_atomic_t libcfs_kmemory; # define libcfs_kmem_inc(ptr, size) \ do { \ - cfs_atomic_add(size, &libcfs_kmemory); \ + atomic_add(size, &libcfs_kmemory); \ } while (0) # define libcfs_kmem_dec(ptr, size) \ do { \ - cfs_atomic_sub(size, &libcfs_kmemory); \ + atomic_sub(size, &libcfs_kmemory); \ } while (0) # define libcfs_kmem_read() \ - cfs_atomic_read(&libcfs_kmemory) + atomic_read(&libcfs_kmemory) #else # define libcfs_kmem_inc(ptr, size) do {} while (0) @@ -154,14 +151,14 @@ do { \ #endif /* LIBCFS_DEBUG */ #ifndef LIBCFS_VMALLOC_SIZE -#define LIBCFS_VMALLOC_SIZE (2 << CFS_PAGE_SHIFT) /* 2 pages */ +#define LIBCFS_VMALLOC_SIZE (2 << PAGE_CACHE_SHIFT) /* 2 pages */ #endif #define LIBCFS_ALLOC_PRE(size, mask) \ do { \ - LASSERT(!cfs_in_interrupt() || \ + LASSERT(!in_interrupt() || \ ((size) <= LIBCFS_VMALLOC_SIZE && \ - ((mask) & CFS_ALLOC_ATOMIC)) != 0); \ + ((mask) & GFP_ATOMIC)) != 0); \ } while (0) #define LIBCFS_ALLOC_POST(ptr, size) \ @@ -172,7 +169,6 @@ do { \ CERROR("LNET: %d total bytes allocated by lnet\n", \ libcfs_kmem_read()); \ } else { \ - memset((ptr), 0, (size)); \ libcfs_kmem_inc((ptr), (size)); \ CDEBUG(D_MALLOC, "alloc '" #ptr "': %d at %p (tot %d).\n", \ (int)(size), (ptr), libcfs_kmem_read()); \ @@ -181,12 +177,13 @@ do { \ /** * allocate memory with GFP flags @mask + * The allocated memory is zeroed-out. */ #define LIBCFS_ALLOC_GFP(ptr, size, mask) \ do { \ LIBCFS_ALLOC_PRE((size), (mask)); \ (ptr) = (size) <= LIBCFS_VMALLOC_SIZE ? \ - cfs_alloc((size), (mask)) : cfs_alloc_large(size); \ + kzalloc((size), (mask)) : vzalloc(size); \ LIBCFS_ALLOC_POST((ptr), (size)); \ } while (0) @@ -194,47 +191,48 @@ do { \ * default allocator */ #define LIBCFS_ALLOC(ptr, size) \ - LIBCFS_ALLOC_GFP(ptr, size, CFS_ALLOC_IO) + LIBCFS_ALLOC_GFP(ptr, size, GFP_NOFS) /** * non-sleeping allocator */ #define LIBCFS_ALLOC_ATOMIC(ptr, size) \ - LIBCFS_ALLOC_GFP(ptr, size, CFS_ALLOC_ATOMIC) + LIBCFS_ALLOC_GFP(ptr, size, GFP_ATOMIC) /** * allocate memory for specified CPU partition * \a cptab != NULL, \a cpt is CPU partition id of \a cptab * \a cptab == NULL, \a cpt is HW NUMA node id + * The allocated memory is zeroed-out. */ #define LIBCFS_CPT_ALLOC_GFP(ptr, cptab, cpt, size, mask) \ do { \ LIBCFS_ALLOC_PRE((size), (mask)); \ (ptr) = (size) <= LIBCFS_VMALLOC_SIZE ? \ - cfs_cpt_malloc((cptab), (cpt), (size), (mask)) : \ - cfs_cpt_vmalloc((cptab), (cpt), (size)); \ + cfs_cpt_malloc((cptab), (cpt), (size), (mask) | __GFP_ZERO) : \ + cfs_cpt_vzalloc((cptab), (cpt), (size)); \ LIBCFS_ALLOC_POST((ptr), (size)); \ } while (0) /** default numa allocator */ #define LIBCFS_CPT_ALLOC(ptr, cptab, cpt, size) \ - LIBCFS_CPT_ALLOC_GFP(ptr, cptab, cpt, size, CFS_ALLOC_IO) + LIBCFS_CPT_ALLOC_GFP(ptr, cptab, cpt, size, GFP_NOFS) -#define LIBCFS_FREE(ptr, size) \ -do { \ - int s = (size); \ - if (unlikely((ptr) == NULL)) { \ - CERROR("LIBCFS: free NULL '" #ptr "' (%d bytes) at " \ - "%s:%d\n", s, __FILE__, __LINE__); \ - break; \ - } \ - libcfs_kmem_dec((ptr), s); \ - CDEBUG(D_MALLOC, "kfreed '" #ptr "': %d at %p (tot %d).\n", \ +#define LIBCFS_FREE(ptr, size) \ +do { \ + int s = (size); \ + if (unlikely((ptr) == NULL)) { \ + CERROR("LIBCFS: free NULL '" #ptr "' (%d bytes) at " \ + "%s:%d\n", s, __FILE__, __LINE__); \ + break; \ + } \ + libcfs_kmem_dec((ptr), s); \ + CDEBUG(D_MALLOC, "kfreed '" #ptr "': %d at %p (tot %d).\n", \ s, (ptr), libcfs_kmem_read()); \ - if (unlikely(s > LIBCFS_VMALLOC_SIZE)) \ - cfs_free_large(ptr); \ - else \ - cfs_free(ptr); \ + if (unlikely(s > LIBCFS_VMALLOC_SIZE)) \ + vfree(ptr); \ + else \ + kfree(ptr); \ } while (0) /******************************************************************************/ @@ -251,7 +249,7 @@ do { \ #define ntohs(x) ___ntohs(x) #endif -void libcfs_debug_dumpstack(cfs_task_t *tsk); +void libcfs_debug_dumpstack(struct task_struct *tsk); void libcfs_run_upcall(char **argv); void libcfs_run_lbug_upcall(struct libcfs_debug_msg_data *); void libcfs_debug_dumplog(void); @@ -260,8 +258,6 @@ int libcfs_debug_cleanup(void); int libcfs_debug_clear_buffer(void); int libcfs_debug_mark_buffer(const char *text); -void libcfs_debug_set_level(unsigned int debug_level); - #else /* !__KERNEL__ */ # ifdef LIBCFS_DEBUG # undef NDEBUG @@ -274,7 +270,7 @@ do { \ assert(cond); \ } while (0) # define LBUG() assert(0) -# ifdef INVARIANT_CHECK +# ifdef CONFIG_LUSTRE_DEBUG_EXPENSIVE_CHECK # define LINVRNT(exp) LASSERT(exp) # else # define LINVRNT(exp) ((void)sizeof!!(exp)) @@ -310,36 +306,12 @@ int libcfs_debug_cleanup(void); * 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 /* - * allocate per-cpu-partition data, returned value is an array of pointers, - * variable can be indexed by CPU ID. - * cptable != NULL: size of array is number of CPU partitions - * cptable == NULL: size of array is number of HW cores - */ -void *cfs_percpt_alloc(struct cfs_cpt_table *cptab, unsigned int size); -/* - * destory per-cpu-partition variable - */ -void cfs_percpt_free(void *vars); -int cfs_percpt_number(void *vars); -void *cfs_percpt_current(void *vars); -void *cfs_percpt_index(void *vars, int idx); - -#define cfs_percpt_for_each(var, i, vars) \ - for (i = 0; i < cfs_percpt_number(vars) && \ - ((var) = (vars)[i]) != NULL; i++) - -/* * allocate a variable array, returned value is an array of pointers. * Caller can specify length of array by count. */ @@ -353,71 +325,71 @@ void cfs_array_free(void *vars); /** 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))); \ + LASSERTF(atomic_read(a) == v, \ + "value: %d\n", 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))); \ + LASSERTF(atomic_read(a) != v, \ + "value: %d\n", 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))); \ + LASSERTF(atomic_read(a) < v, \ + "value: %d\n", 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))); \ + LASSERTF(atomic_read(a) <= v, \ + "value: %d\n", 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))); \ + LASSERTF(atomic_read(a) > v, \ + "value: %d\n", 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))); \ + LASSERTF(atomic_read(a) >= v, \ + "value: %d\n", 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); \ + int __v = 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); \ + int __v = 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); \ + int __v = 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); \ + int __v = atomic_read(a); \ + LASSERTF(__v >= v1 && __v <= v2, "value: %d\n", __v); \ } while (0) #else /* !LASSERT_ATOMIC_ENABLED */ @@ -441,85 +413,6 @@ do { \ #define CFS_ALLOC_PTR(ptr) LIBCFS_ALLOC(ptr, sizeof (*(ptr))); #define CFS_FREE_PTR(ptr) LIBCFS_FREE(ptr, sizeof (*(ptr))); -/* - * percpu partition lock - * - * There are some use-cases like this in Lustre: - * . each CPU partition has it's own private data which is frequently changed, - * and mostly by the local CPU partition. - * . all CPU partitions share some global data, these data are rarely changed. - * - * LNet is typical example. - * CPU partition lock is designed for this kind of use-cases: - * . each CPU partition has it's own private lock - * . change on private data just needs to take the private lock - * . read on shared data just needs to take _any_ of private locks - * . change on shared data needs to take _all_ private locks, - * which is slow and should be really rare. - */ - -enum { - CFS_PERCPT_LOCK_EX = -1, /* negative */ -}; - -#ifdef __KERNEL__ - -struct cfs_percpt_lock { - /* cpu-partition-table for this lock */ - struct cfs_cpt_table *pcl_cptab; - /* exclusively locked */ - unsigned int pcl_locked; - /* private lock table */ - spinlock_t **pcl_locks; -}; - -/* return number of private locks */ -static inline int -cfs_percpt_lock_num(struct cfs_percpt_lock *pcl) -{ - return cfs_cpt_number(pcl->pcl_cptab); -} - -#else /* !__KERNEL__ */ - -# ifdef HAVE_LIBPTHREAD - -struct cfs_percpt_lock { - pthread_mutex_t pcl_mutex; -}; - -# else /* !HAVE_LIBPTHREAD */ - -struct cfs_percpt_lock { - int pcl_lock; -}; - -static const struct cfs_percpt_lock CFS_PERCPT_LOCK_MAGIC; - -# endif /* HAVE_LIBPTHREAD */ -# define cfs_percpt_lock_num(pcl) 1 -#endif /* __KERNEL__ */ - -/* - * create a cpu-partition lock based on CPU partition table \a cptab, - * each private lock has extra \a psize bytes padding data - */ -struct cfs_percpt_lock *cfs_percpt_lock_alloc(struct cfs_cpt_table *cptab); -/* destroy a cpu-partition lock */ -void cfs_percpt_lock_free(struct cfs_percpt_lock *pcl); - -/* lock private lock \a index of \a pcl */ -void cfs_percpt_lock(struct cfs_percpt_lock *pcl, int index); -/* unlock private lock \a index of \a pcl */ -void cfs_percpt_unlock(struct cfs_percpt_lock *pcl, int index); -/* create percpt (atomic) refcount based on @cptab */ -cfs_atomic_t **cfs_percpt_atomic_alloc(struct cfs_cpt_table *cptab, int val); -/* destroy percpt refcount */ -void cfs_percpt_atomic_free(cfs_atomic_t **refs); -/* return sum of all percpu refs */ -int cfs_percpt_atomic_summary(cfs_atomic_t **refs); - - /** Compile-time assertion. * Check an invariant described by a constant expression at compile time by @@ -534,62 +427,13 @@ int cfs_percpt_atomic_summary(cfs_atomic_t **refs); * value after conversion... * */ -#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); -char *libcfs_lnd2modname(int type); -char *libcfs_lnd2str(int type); -int libcfs_str2lnd(const char *str); -char *libcfs_net2str(__u32 net); -char *libcfs_nid2str(lnet_nid_t nid); -__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); -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 +#define CLASSERT(cond) do {switch (1) {case (cond): case 0: break; } } while (0) /* implication */ #define ergo(a, b) (!(a) || (b)) /* logical equivalence */ #define equi(a, b) (!!(a) == !!(b)) -#ifndef CFS_CURRENT_TIME -# define CFS_CURRENT_TIME time(0) -#endif - -/* -------------------------------------------------------------------- - * Light-weight trace - * Support for temporary event tracing with minimal Heisenberg effect. - * All stuff about lwt are put in arch/kp30.h - * -------------------------------------------------------------------- */ - -struct libcfs_device_userstate -{ - int ldu_memhog_pages; - cfs_page_t *ldu_memhog_root_page; -}; - /* what used to be in portals_lib.h */ #ifndef MIN # define MIN(a,b) (((a)<(b)) ? (a): (b)) @@ -600,30 +444,30 @@ struct libcfs_device_userstate #define MKSTR(ptr) ((ptr))? (ptr) : "" -static inline int cfs_size_round4 (int val) +static inline size_t cfs_size_round4(size_t val) { return (val + 3) & (~0x3); } #ifndef HAVE_CFS_SIZE_ROUND -static inline int cfs_size_round (int val) +static inline size_t cfs_size_round(size_t val) { return (val + 7) & (~0x7); } #define HAVE_CFS_SIZE_ROUND #endif -static inline int cfs_size_round16(int val) +static inline size_t cfs_size_round16(size_t val) { return (val + 0xf) & (~0xf); } -static inline int cfs_size_round32(int val) +static inline size_t cfs_size_round32(size_t val) { return (val + 0x1f) & (~0x1f); } -static inline int cfs_size_round0(int val) +static inline size_t cfs_size_round0(size_t val) { if (!val) return 0; @@ -632,20 +476,7 @@ static inline int cfs_size_round0(int val) static inline size_t cfs_round_strlen(char *fset) { - return (size_t)cfs_size_round((int)strlen(fset) + 1); -} - -/* roundup \a val to power2 */ -static inline unsigned int cfs_power2_roundup(unsigned int val) -{ - if (val != LOWEST_BIT_SET(val)) { /* not a power of 2 already */ - do { - val &= ~LOWEST_BIT_SET(val); - } while (val != LOWEST_BIT_SET(val)); - /* ...and round up */ - val <<= 1; - } - return val; + return cfs_size_round(strlen(fset) + 1); } #define LOGL(var,len,ptr) \ @@ -662,34 +493,8 @@ do { \ ptr += cfs_size_round(len); \ } while (0) -#define LOGL0(var,len,ptr) \ -do { \ - if (!len) \ - break; \ - memcpy((char *)ptr, (const char *)var, len); \ - *((char *)(ptr) + len) = 0; \ - ptr += cfs_size_round(len + 1); \ -} while (0) - -/** - * Lustre Network Driver types. - */ -enum { - /* Only add to these values (i.e. don't ever change or redefine them): - * network addresses depend on them... */ - QSWLND = 1, - SOCKLND = 2, - GMLND = 3, /* obsolete, keep it so that libcfs_nid2str works */ - PTLLND = 4, - O2IBLND = 5, - CIBLND = 6, - OPENIBLND = 7, - IIBLND = 8, - LOLND = 9, - RALND = 10, - VIBLND = 11, - MXLND = 12, - GNILND = 13, -}; +extern struct cfs_psdev_ops libcfs_psdev_ops; +extern struct miscdevice libcfs_dev; +extern struct cfs_wi_sched *cfs_sched_rehash; #endif