*/
#ifdef LIBCFS_DEBUG
-# define libcfs_kmem_inc(ptr, size) \
-do { \
- cfs_atomic_add(size, &libcfs_kmemory); \
+# define libcfs_kmem_inc(ptr, size) \
+do { \
+ cfs_atomic_add(size, &libcfs_kmemory); \
} while (0)
-# define libcfs_kmem_dec(ptr, size) do { \
- cfs_atomic_sub(size, &libcfs_kmemory); \
+# define libcfs_kmem_dec(ptr, size) \
+do { \
+ cfs_atomic_sub(size, &libcfs_kmemory); \
} while (0)
+# define libcfs_kmem_read() \
+ cfs_atomic_read(&libcfs_kmemory)
+
#else
# define libcfs_kmem_inc(ptr, size) do {} while (0)
# define libcfs_kmem_dec(ptr, size) do {} while (0)
+# define libcfs_kmem_read() (0)
#endif /* LIBCFS_DEBUG */
#ifndef LIBCFS_VMALLOC_SIZE
#define LIBCFS_VMALLOC_SIZE (2 << CFS_PAGE_SHIFT) /* 2 pages */
#endif
-#define LIBCFS_ALLOC_GFP(ptr, size, mask) \
-do { \
- LASSERT(!cfs_in_interrupt() || \
- (size <= LIBCFS_VMALLOC_SIZE && mask == CFS_ALLOC_ATOMIC));\
- if (unlikely((size) > LIBCFS_VMALLOC_SIZE)) \
- (ptr) = cfs_alloc_large(size); \
- else \
- (ptr) = cfs_alloc((size), (mask)); \
- 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", \
- 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), cfs_atomic_read (&libcfs_kmemory)); \
+#define LIBCFS_ALLOC_PRE(size, mask) \
+do { \
+ LASSERT(!cfs_in_interrupt() || \
+ ((size) <= LIBCFS_VMALLOC_SIZE && \
+ ((mask) & CFS_ALLOC_ATOMIC)) != 0); \
+} while (0)
+
+#define LIBCFS_ALLOC_POST(ptr, size) \
+do { \
+ 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", \
+ 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()); \
+ } \
} while (0)
+/**
+ * allocate memory with GFP flags @mask
+ */
+#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); \
+ LIBCFS_ALLOC_POST((ptr), (size)); \
+} while (0)
+
+/**
+ * default allocator
+ */
#define LIBCFS_ALLOC(ptr, size) \
LIBCFS_ALLOC_GFP(ptr, size, CFS_ALLOC_IO)
+/**
+ * non-sleeping allocator
+ */
#define LIBCFS_ALLOC_ATOMIC(ptr, size) \
LIBCFS_ALLOC_GFP(ptr, size, CFS_ALLOC_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
+ */
+#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)); \
+ 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)
+
#define LIBCFS_FREE(ptr, size) \
do { \
int s = (size); \
} \
libcfs_kmem_dec((ptr), s); \
CDEBUG(D_MALLOC, "kfreed '" #ptr "': %d at %p (tot %d).\n", \
- s, (ptr), cfs_atomic_read(&libcfs_kmemory)); \
+ s, (ptr), libcfs_kmem_read()); \
if (unlikely(s > LIBCFS_VMALLOC_SIZE)) \
cfs_free_large(ptr); \
else \
# define KLASSERT(e) ((void)0)
# define printk printf
# ifdef CRAY_XT3 /* buggy calloc! */
-# define LIBCFS_ALLOC(ptr, size) \
- do { \
- (ptr) = malloc(size); \
- memset(ptr, 0, size); \
+# define LIBCFS_ALLOC_GFP(ptr, size, mask) \
+ do { \
+ (ptr) = malloc(size); \
+ memset(ptr, 0, size); \
} while (0)
# else
-# define LIBCFS_ALLOC(ptr, size) do { (ptr) = calloc(1,size); } while (0)
+# define LIBCFS_ALLOC_GFP(ptr, size, mask) \
+ do { \
+ (ptr) = calloc(1, size); \
+ } while (0)
# endif
# define LIBCFS_FREE(ptr, size) do { free(ptr); } while((size) - (size))
+# define LIBCFS_ALLOC(ptr, size) \
+ LIBCFS_ALLOC_GFP(ptr, size, 0)
+# define LIBCFS_CPT_ALLOC_GFP(ptr, cptab, cpt, size, mask) \
+ LIBCFS_ALLOC(ptr, size)
+# define LIBCFS_CPT_ALLOC(ptr, cptab, cpt, size) \
+ LIBCFS_ALLOC(ptr, size)
void libcfs_debug_dumplog(void);
int libcfs_debug_init(unsigned long bufsize);
#define OBD_ALLOC_FAIL_MULT (OBD_ALLOC_FAIL_MASK / 100)
#if defined(LUSTRE_UTILS) /* this version is for utils only */
-#define OBD_ALLOC_GFP(ptr, size, gfp_mask) \
-do { \
- (ptr) = cfs_alloc(size, (gfp_mask)); \
- if (unlikely((ptr) == NULL)) { \
- CERROR("kmalloc of '" #ptr "' (%d bytes) failed at %s:%d\n", \
- (int)(size), __FILE__, __LINE__); \
- } else { \
- memset(ptr, 0, size); \
- CDEBUG(D_MALLOC, "kmalloced '" #ptr "': %d at %p\n", \
- (int)(size), ptr); \
- } \
+#define __OBD_MALLOC_VERBOSE(ptr, cptab, cpt, size, flags) \
+do { \
+ (ptr) = (cptab) == NULL ? \
+ cfs_alloc(size, flags) : \
+ cfs_cpt_malloc(cptab, cpt, size, flags); \
+ if (unlikely((ptr) == NULL)) { \
+ CERROR("kmalloc of '" #ptr "' (%d bytes) failed at %s:%d\n", \
+ (int)(size), __FILE__, __LINE__); \
+ } else { \
+ memset(ptr, 0, size); \
+ CDEBUG(D_MALLOC, "kmalloced '" #ptr "': %d at %p\n", \
+ (int)(size), ptr); \
+ } \
} while (0)
+
#else /* this version is for the kernel and liblustre */
#define OBD_FREE_RTN0(ptr) \
({ \
(ptr) = NULL; \
0; \
})
-#define OBD_ALLOC_GFP(ptr, size, gfp_mask) \
-do { \
- (ptr) = cfs_alloc(size, (gfp_mask)); \
+
+#define __OBD_MALLOC_VERBOSE(ptr, cptab, cpt, size, flags) \
+do { \
+ (ptr) = (cptab) == NULL ? \
+ cfs_alloc(size, flags) : \
+ cfs_cpt_malloc(cptab, cpt, size, flags); \
if (likely((ptr) != NULL && \
(!HAS_FAIL_ALLOC_FLAG || obd_alloc_fail_rate == 0 || \
!obd_alloc_fail(ptr, #ptr, "km", size, \
} while (0)
#endif
-#ifndef OBD_ALLOC_MASK
-# define OBD_ALLOC_MASK CFS_ALLOC_IO
-#endif
+#define OBD_ALLOC_GFP(ptr, size, gfp_mask) \
+ __OBD_MALLOC_VERBOSE(ptr, NULL, 0, size, gfp_mask)
-#define OBD_ALLOC(ptr, size) OBD_ALLOC_GFP(ptr, size, OBD_ALLOC_MASK)
+#define OBD_ALLOC(ptr, size) OBD_ALLOC_GFP(ptr, size, CFS_ALLOC_IO)
#define OBD_ALLOC_WAIT(ptr, size) OBD_ALLOC_GFP(ptr, size, CFS_ALLOC_STD)
#define OBD_ALLOC_PTR(ptr) OBD_ALLOC(ptr, sizeof *(ptr))
#define OBD_ALLOC_PTR_WAIT(ptr) OBD_ALLOC_WAIT(ptr, sizeof *(ptr))
+#define OBD_CPT_ALLOC_GFP(ptr, cptab, cpt, size, gfp_mask) \
+ __OBD_MALLOC_VERBOSE(ptr, cptab, cpt, size, gfp_mask)
+
+#define OBD_CPT_ALLOC(ptr, cptab, cpt, size) \
+ OBD_CPT_ALLOC_GFP(ptr, cptab, cpt, size, CFS_ALLOC_IO)
+
+#define OBD_CPT_ALLOC_PTR(ptr, cptab, cpt) \
+ OBD_CPT_ALLOC(ptr, cptab, cpt, sizeof *(ptr))
+
#ifdef __arch_um__
-# define OBD_VMALLOC(ptr, size) OBD_ALLOC(ptr, size)
-#else
-# define OBD_VMALLOC(ptr, size) \
-do { \
- (ptr) = cfs_alloc_large(size); \
+
+# define OBD_VMALLOC(ptr, size) \
+ OBD_ALLOC(ptr, size)
+# define OBD_CPT_VMALLOC(ptr, cptab, cpt, size) \
+ OBD_CPT_ALLOC(ptr, cptab, cpt, size)
+
+#else /* !__arch_um__ */
+
+# define __OBD_VMALLOC_VEROBSE(ptr, cptab, cpt, size) \
+do { \
+ (ptr) = cptab == NULL ? \
+ cfs_alloc_large(size) : \
+ cfs_cpt_vmalloc(cptab, cpt, size); \
if (unlikely((ptr) == NULL)) { \
CERROR("vmalloc of '" #ptr "' (%d bytes) failed\n", \
(int)(size)); \
CERROR(LPU64" total bytes allocated by Lustre, %d by LNET\n", \
obd_memory_sum(), cfs_atomic_read(&libcfs_kmemory)); \
} else { \
- memset(ptr, 0, size); \
+ memset(ptr, 0, size); \
OBD_ALLOC_POST(ptr, size, "vmalloced"); \
} \
} while(0)
+
+# define OBD_VMALLOC(ptr, size) \
+ __OBD_VMALLOC_VEROBSE(ptr, NULL, 0, size)
+# define OBD_CPT_VMALLOC(ptr, cptab, cpt, size) \
+ __OBD_VMALLOC_VEROBSE(ptr, cptab, cpt, size)
+
#endif
#ifdef __KERNEL__
OBD_ALLOC(ptr, size); \
} while (0)
+#define OBD_CPT_ALLOC_LARGE(ptr, cptab, cpt, size) \
+do { \
+ if (size > OBD_ALLOC_BIG) \
+ OBD_CPT_VMALLOC(ptr, cptab, cpt, size); \
+ else \
+ OBD_CPT_ALLOC(ptr, cptab, cpt, size); \
+} while (0)
+
#define OBD_FREE_LARGE(ptr, size) \
do { \
if (size > OBD_ALLOC_BIG) \
else \
OBD_FREE(ptr, size); \
} while (0)
-#else
-#define OBD_ALLOC_LARGE(ptr, size) OBD_ALLOC(ptr, size)
-#define OBD_FREE_LARGE(ptr, size) OBD_FREE(ptr,size)
-#endif
+
+#else /* !__KERNEL__ */
+
+#define OBD_ALLOC_LARGE(ptr, size) \
+ OBD_ALLOC(ptr, size)
+#define OBD_CPT_ALLOC_LARGE(ptr, cptab, cpt, size) \
+ OBD_ALLOC(ptr, size)
+#define OBD_FREE_LARGE(ptr, size) \
+ OBD_FREE(ptr, size)
+
+#endif /* __KERNEL__ */
#ifdef CONFIG_DEBUG_SLAB
#define POISON(ptr, c, s) do {} while (0)
(ptr) = NULL; \
0; \
})
-#define OBD_SLAB_ALLOC(ptr, slab, type, size) \
-do { \
+
+#define __OBD_SLAB_ALLOC_VERBOSE(ptr, slab, cptab, cpt, size, type) \
+do { \
LASSERT(ergo(type != CFS_ALLOC_ATOMIC, !cfs_in_interrupt())); \
- (ptr) = cfs_mem_cache_alloc(slab, (type)); \
+ (ptr) = (cptab) == NULL ? \
+ cfs_mem_cache_alloc(slab, type) : \
+ cfs_mem_cache_cpt_alloc(slab, cptab, cpt, type); \
if (likely((ptr) != NULL && \
(!HAS_FAIL_ALLOC_FLAG || obd_alloc_fail_rate == 0 || \
!obd_alloc_fail(ptr, #ptr, "slab-", size, \
} \
} while(0)
+#define OBD_SLAB_ALLOC_GFP(ptr, slab, size, flags) \
+ __OBD_SLAB_ALLOC_VERBOSE(ptr, slab, NULL, 0, size, flags)
+#define OBD_SLAB_CPT_ALLOC_GFP(ptr, slab, cptab, cpt, size, flags) \
+ __OBD_SLAB_ALLOC_VERBOSE(ptr, slab, cptab, cpt, size, flags)
+
#define OBD_FREE_PTR(ptr) OBD_FREE(ptr, sizeof *(ptr))
#define OBD_SLAB_FREE(ptr, slab, size) \
POISON_PTR(ptr); \
} while(0)
-#define OBD_SLAB_ALLOC_PTR(ptr, slab) \
- OBD_SLAB_ALLOC((ptr), (slab), CFS_ALLOC_STD, sizeof *(ptr))
-#define OBD_SLAB_FREE_PTR(ptr, slab) \
- OBD_SLAB_FREE((ptr), (slab), sizeof *(ptr))
-#define OBD_SLAB_ALLOC_PTR_GFP(ptr, slab, gfp) \
- OBD_SLAB_ALLOC((ptr), (slab), (gfp), sizeof *(ptr))
+#define OBD_SLAB_ALLOC(ptr, slab, size) \
+ OBD_SLAB_ALLOC_GFP(ptr, slab, size, CFS_ALLOC_IO)
+
+#define OBD_SLAB_CPT_ALLOC(ptr, slab, cptab, cpt, size) \
+ OBD_SLAB_CPT_ALLOC_GFP(ptr, slab, cptab, cpt, size, CFS_ALLOC_IO)
+
+#define OBD_SLAB_ALLOC_PTR(ptr, slab) \
+ OBD_SLAB_ALLOC(ptr, slab, sizeof *(ptr))
+
+#define OBD_SLAB_CPT_ALLOC_PTR(ptr, slab, cptab, cpt) \
+ OBD_SLAB_CPT_ALLOC(ptr, slab, cptab, cpt, sizeof *(ptr))
+
+#define OBD_SLAB_ALLOC_PTR_GFP(ptr, slab, flags) \
+ OBD_SLAB_ALLOC_GFP(ptr, slab, sizeof *(ptr), flags)
+
+#define OBD_SLAB_CPT_ALLOC_PTR_GFP(ptr, slab, ctab, cpt, flags) \
+ OBD_SLAB_CPT_ALLOC_GFP(ptr, slab, cptab, cpt, sizeof *(ptr), flags)
+
+#define OBD_SLAB_FREE_PTR(ptr, slab) \
+ OBD_SLAB_FREE((ptr), (slab), sizeof *(ptr))
#define KEY_IS(str) \
(keylen >= (sizeof(str)-1) && memcmp(key, str, (sizeof(str)-1)) == 0)
/* Wrapper for contiguous page frame allocation */
-#define OBD_PAGE_ALLOC(ptr, gfp_mask) \
-do { \
- (ptr) = cfs_alloc_page(gfp_mask); \
+#define __OBD_PAGE_ALLOC_VERBOSE(ptr, cptab, cpt, gfp_mask) \
+do { \
+ (ptr) = (cptab) == NULL ? \
+ cfs_alloc_page(gfp_mask) : \
+ cfs_page_cpt_alloc(cptab, cpt, gfp_mask); \
if (unlikely((ptr) == NULL)) { \
CERROR("alloc_pages of '" #ptr "' %d page(s) / "LPU64" bytes "\
"failed\n", (int)1, \
} \
} while (0)
+#define OBD_PAGE_ALLOC(ptr, gfp_mask) \
+ __OBD_PAGE_ALLOC_VERBOSE(ptr, NULL, 0, gfp_mask)
+#define OBD_PAGE_CPT_ALLOC(ptr, cptab, cpt, gfp_mask) \
+ __OBD_PAGE_ALLOC_VERBOSE(ptr, cptab, cpt, gfp_mask)
+
#define OBD_PAGE_FREE(ptr) \
do { \
LASSERT(ptr); \