#define PORTAL_DEBUG
#ifndef offsetof
-# define offsetof(typ,memb) ((int)((char *)&(((typ *)0)->memb)))
+# define offsetof(typ,memb) ((int)((char *)&(((typ *)0)->memb)))
#endif
-#define LOWEST_BIT_SET(x) ((x) & ~((x) - 1))
+#define LOWEST_BIT_SET(x) ((x) & ~((x) - 1))
/*
* Debugging
#define D_HA (1 << 19) /* recovery and failover */
#define D_RPCTRACE (1 << 20) /* for distributed debugging */
#define D_VFSTRACE (1 << 21)
+#define D_READA (1 << 22) /* read-ahead */
#ifdef __KERNEL__
# include <linux/sched.h> /* THREAD_SIZE */
-#else
+#else
# ifndef THREAD_SIZE /* x86_64 has THREAD_SIZE in userspace */
# define THREAD_SIZE 8192
# endif
#define CHECK_STACK(stack) \
do { \
if ((stack) > 3*THREAD_SIZE/4 && (stack) > portal_stack) { \
- portals_debug_msg(DEBUG_SUBSYSTEM, D_ERROR, \
+ portals_debug_msg(DEBUG_SUBSYSTEM, D_WARNING, \
__FILE__, __FUNCTION__, __LINE__, \
- (stack), \
- "maximum lustre stack %u\n", \
+ (stack),"maximum lustre stack %u\n",\
portal_stack = (stack)); \
/*panic("LBUG");*/ \
} \
if (portal_cerror == 0) \
break; \
CHECK_STACK(CDEBUG_STACK); \
- if (!(mask) || ((mask) & (D_ERROR | D_EMERG)) || \
+ if (((mask) & (D_ERROR | D_EMERG | D_WARNING)) || \
(portal_debug & (mask) && \
portal_subsystem_debug & DEBUG_SUBSYSTEM)) \
portals_debug_msg(DEBUG_SUBSYSTEM, mask, \
PREPARE_TQUEUE((wq), (cb), (cbdata)); \
} while (0)
-#define ll_invalidate_inode_pages invalidate_inode_pages
#define PageUptodate Page_Uptodate
#define our_recalc_sigpending(current) recalc_sigpending(current)
#define num_online_cpus() smp_num_cpus
if (current->need_resched)
schedule ();
}
-#define work_struct_t struct tq_struct
+#define work_struct_t struct tq_struct
#else
do { \
INIT_WORK((wq), (void *)(cb), (void *)(cbdata)); \
} while (0)
-#define ll_invalidate_inode_pages(inode) invalidate_inode_pages((inode)->i_mapping)
#define wait_on_page wait_on_page_locked
#define our_recalc_sigpending(current) recalc_sigpending()
#define strtok(a,b) strpbrk(a, b)
__FUNCTION__, __LINE__))
/* it would be great to dump_stack() here, but some kernels
* export it as show_stack() and I can't be bothered to
- * proprely engage in that dance right now */
+ * proprely engage in that dance right now */
#define LASSERTF(cond, fmt...) \
do { \
if (unlikely(!(cond))) { \
LBUG(); \
} \
} while (0)
-
+
#else
#define LASSERT(e)
#define LASSERTF(cond, fmt...) do { } while (0)
#define PORTAL_VMALLOC_SIZE 16384
-#ifndef GFP_MEMALLOC
-#define GFP_MEMALLOC 0
-#endif
-
-#define PORTAL_ALLOC(ptr, size) \
+#define PORTAL_ALLOC_GFP(ptr, size, mask) \
do { \
- LASSERT (!in_interrupt()); \
+ LASSERT(!in_interrupt() || \
+ (size <= PORTAL_VMALLOC_SIZE && mask == GFP_ATOMIC)); \
if ((size) > PORTAL_VMALLOC_SIZE) \
(ptr) = vmalloc(size); \
else \
- (ptr) = kmalloc((size), (GFP_KERNEL | GFP_MEMALLOC)); \
- if ((ptr) == NULL) \
+ (ptr) = kmalloc((size), (mask)); \
+ if ((ptr) == NULL) { \
CERROR("PORTALS: out of memory at %s:%d (tried to alloc '"\
#ptr "' = %d)\n", __FILE__, __LINE__, (int)(size));\
- else { \
+ CERROR("PORTALS: %d total bytes allocated by portals\n", \
+ atomic_read(&portal_kmemory)); \
+ } else { \
portal_kmem_inc((ptr), (size)); \
memset((ptr), 0, (size)); \
} \
(int)(size), (ptr), atomic_read (&portal_kmemory)); \
} while (0)
+#define PORTAL_ALLOC(ptr, size) \
+ PORTAL_ALLOC_GFP(ptr, size, GFP_NOFS)
+
+#define PORTAL_ALLOC_ATOMIC(ptr, size) \
+ PORTAL_ALLOC_GFP(ptr, size, GFP_ATOMIC)
+
#define PORTAL_FREE(ptr, size) \
do { \
int s = (size); \
s, (ptr), atomic_read(&portal_kmemory)); \
} while (0)
-#ifndef SLAB_MEMALLOC
-#define SLAB_MEMALLOC 0
-#endif
-
-#define PORTAL_SLAB_ALLOC(ptr, slab, size) \
-do { \
- LASSERT(!in_interrupt()); \
- (ptr) = kmem_cache_alloc((slab), (SLAB_KERNEL | SLAB_MEMALLOC)); \
- if ((ptr) == NULL) { \
- CERROR("PORTALS: out of memory at %s:%d (tried to alloc" \
- " '" #ptr "' from slab '" #slab "')\n", __FILE__, \
- __LINE__); \
- } else { \
- portal_kmem_inc((ptr), (size)); \
- memset((ptr), 0, (size)); \
- } \
- CDEBUG(D_MALLOC, "kmalloced '" #ptr "': %ld at %p (tot %d).\n", \
- (int)(size), (ptr), atomic_read(&portal_kmemory)); \
-} while (0)
-
-#define PORTAL_SLAB_FREE(ptr, slab, size) \
-do { \
- int s = (size); \
- if ((ptr) == NULL) { \
- CERROR("PORTALS: free NULL '" #ptr "' (%d bytes) at " \
- "%s:%d\n", s, __FILE__, __LINE__); \
- break; \
- } \
- memset((ptr), 0x5a, s); \
- kmem_cache_free((slab), ptr); \
- portal_kmem_dec((ptr), s); \
- CDEBUG(D_MALLOC, "kfreed '" #ptr "': %d at %p (tot %d).\n", \
- s, (ptr), atomic_read (&portal_kmemory)); \
-} while (0)
-
/* ------------------------------------------------------------------- */
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
ptl_nid_t *gateway,
ptl_nid_t *lo_nid, ptl_nid_t *hi_nid,
int *alive);
- int (*kprci_notify)(int gateway_nal, ptl_nid_t gateway_nid,
+ int (*kprci_notify)(int gateway_nal, ptl_nid_t gateway_nid,
int alive, time_t when);
} kpr_control_interface_t;
}
static inline void
-kpr_notify (kpr_router_t *router,
+kpr_notify (kpr_router_t *router,
ptl_nid_t peer, int alive, time_t when)
{
if (!kpr_routing (router))
return;
-
+
router->kpr_interface->kprri_notify(router->kpr_arg, peer, alive, when);
}
#endif
/******************************************************************************/
-/* Light-weight trace
+/* Light-weight trace
* Support for temporary event tracing with minimal Heisenberg effect. */
-#define LWT_SUPPORT 1
+#define LWT_SUPPORT 0
+
+#define LWT_MEMORY (64<<20)
+#define LWT_MAX_CPUS 4
typedef struct {
cycles_t lwte_when;
extern int lwt_lookup_string (int *size, char *knlptr,
char *usrptr, int usrsize);
extern int lwt_control (int enable, int clear);
-extern int lwt_snapshot (int *ncpu, int *total_size,
+extern int lwt_snapshot (cycles_t *now, int *ncpu, int *total_size,
void *user_ptr, int user_size);
/* Note that we _don't_ define LWT_EVENT at all if LWT_SUPPORT isn't set.
* This stuff is meant for finding specific problems; it never stays in
* production code... */
-#define LWTSTR(n) #n
+#define LWTSTR(n) #n
#define LWTWHERE(f,l) f ":" LWTSTR(l)
#define LWT_EVENT(p1, p2, p3, p4) \
#endif /* __KERNEL__ */
#endif /* LWT_SUPPORT */
+struct portals_device_userstate
+{
+ int pdu_memhog_pages;
+ struct page *pdu_memhog_root_page;
+};
#include <linux/portals_lib.h>
#define IOC_PORTAL_CLEAR_DEBUG _IOWR('e', 32, long)
#define IOC_PORTAL_MARK_DEBUG _IOWR('e', 33, long)
#define IOC_PORTAL_PANIC _IOWR('e', 34, long)
-#define IOC_PORTAL_NAL_CMD _IOWR('e', 35, long)
+#define IOC_PORTAL_NAL_CMD _IOWR('e', 35, long)
#define IOC_PORTAL_GET_NID _IOWR('e', 36, long)
#define IOC_PORTAL_FAIL_NID _IOWR('e', 37, long)
#define IOC_PORTAL_SET_DAEMON _IOWR('e', 38, long)
#define IOC_PORTAL_LWT_CONTROL _IOWR('e', 39, long)
#define IOC_PORTAL_LWT_SNAPSHOT _IOWR('e', 40, long)
#define IOC_PORTAL_LWT_LOOKUP_STRING _IOWR('e', 41, long)
-#define IOC_PORTAL_MAX_NR 41
+#define IOC_PORTAL_MEMHOG _IOWR('e', 42, long)
+#define IOC_PORTAL_MAX_NR 42
enum {
- QSWNAL = 1,
- SOCKNAL,
- GMNAL,
- TOENAL,
- TCPNAL,
- SCIMACNAL,
- ROUTER,
- IBNAL,
+ QSWNAL = 1,
+ SOCKNAL = 2,
+ GMNAL = 3,
+ /* 4 unused */
+ TCPNAL = 5,
+ SCIMACNAL = 6,
+ ROUTER = 7,
+ IBNAL = 8,
NAL_ENUM_END_MARKER
};
#ifdef __KERNEL__
extern ptl_handle_ni_t kqswnal_ni;
extern ptl_handle_ni_t ksocknal_ni;
-extern ptl_handle_ni_t ktoenal_ni;
extern ptl_handle_ni_t kgmnal_ni;
extern ptl_handle_ni_t kibnal_ni;
extern ptl_handle_ni_t kscimacnal_ni;