extern unsigned int portal_stack;
extern unsigned int portal_debug;
extern unsigned int portal_printk;
+extern unsigned int portal_cerror;
/* Debugging subsystems (32 bits, non-overlapping) */
#define S_UNDEFINED (1 << 0)
#define S_MDC (1 << 1)
#define S_GMNAL (1 << 19)
#define S_PTLROUTER (1 << 20)
#define S_COBD (1 << 21)
+#define S_IBNAL (1 << 22)
/* If you change these values, please keep portals/utils/debug.c
* up to date! */
#define D_IOCTL (1 << 7) /* ioctl related information */
#define D_BLOCKS (1 << 8) /* ext2 block allocation */
#define D_NET (1 << 9) /* network communications */
-#define D_WARNING (1 << 10)
+#define D_WARNING (1 << 10) /* CWARN(...) == CDEBUG (D_WARNING, ...) */
#define D_BUFFS (1 << 11)
#define D_OTHER (1 << 12)
#define D_DENTRY (1 << 13)
#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
-# define THREAD_SIZE 8192
+#else
+# ifndef THREAD_SIZE /* x86_64 has THREAD_SIZE in userspace */
+# define THREAD_SIZE 8192
+# endif
#endif
+#define LUSTRE_TRACE_SIZE (THREAD_SIZE >> 5)
+
#ifdef __KERNEL__
# ifdef __ia64__
# define CDEBUG_STACK (THREAD_SIZE - \
#if 1
#define CDEBUG(mask, format, a...) \
do { \
+ if (portal_cerror == 0) \
+ break; \
CHECK_STACK(CDEBUG_STACK); \
- if (!(mask) || ((mask) & (D_ERROR | D_EMERG)) || \
+ if (!(mask) || ((mask) & (D_ERROR | D_EMERG | D_WARNING)) || \
(portal_debug & (mask) && \
portal_subsystem_debug & DEBUG_SUBSYSTEM)) \
portals_debug_msg(DEBUG_SUBSYSTEM, mask, \
if (current->need_resched)
schedule ();
}
+#define work_struct_t struct tq_struct
#else
{
cond_resched();
}
+#define work_struct_t struct work_struct
+
#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) */
#ifdef PORTAL_DEBUG
const int line);
#define LASSERT(e) ((e) ? 0 : kportal_assertion_failed( #e , __FILE__, \
__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 */
+#define LASSERTF(cond, fmt...) \
+ do { \
+ if (unlikely(!(cond))) { \
+ portals_debug_msg(0, D_EMERG, __FILE__, __FUNCTION__,\
+ __LINE__, CDEBUG_STACK, \
+ "ASSERTION(" #cond ") failed:" fmt);\
+ LBUG(); \
+ } \
+ } while (0)
+
#else
#define LASSERT(e)
+#define LASSERTF(cond, fmt...) do { } while (0)
#endif
#ifdef __arch_um__
#define PORTAL_VMALLOC_SIZE 16384
-#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_NOFS); \
- 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)
-#define PORTAL_SLAB_ALLOC(ptr, slab, size) \
-do { \
- LASSERT(!in_interrupt()); \
- (ptr) = kmem_cache_alloc((slab), SLAB_KERNEL); \
- 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))
#endif /* PORTALS_PROFILING */
/* debug.c */
+extern spinlock_t stack_backtrace_lock;
+
+char *portals_debug_dumpstack(void);
void portals_run_upcall(char **argv);
void portals_run_lbug_upcall(char * file, const char *fn, const int line);
void portals_debug_dumplog(void);
#endif
void portals_debug_msg(int subsys, int mask, char *file, const char *fn,
const int line, unsigned long stack,
- const char *format, ...)
+ char *format, ...)
__attribute__ ((format (printf, 7, 8)));
#else
void portals_debug_msg(int subsys, int mask, char *file, const char *fn,
# include <stdlib.h>
#ifndef __CYGWIN__
# include <stdint.h>
+#else
+# include <cygwin-ioctl.h>
#endif
# include <unistd.h>
# include <time.h>
# undef NDEBUG
# include <assert.h>
# define LASSERT(e) assert(e)
+# define LASSERTF(cond, args...) assert(cond)
# else
# define LASSERT(e)
+# define LASSERTF(cond, args...) do { } while (0)
# endif
# define printk(format, args...) printf (format, ## args)
# define PORTAL_ALLOC(ptr, size) do { (ptr) = malloc(size); } while (0);
getpid() , stack, ## a);
#endif
+/* support decl needed both by kernel and liblustre */
+char *portals_nid2str(int nal, ptl_nid_t nid, char *str);
+
#ifndef CURRENT_TIME
# define CURRENT_TIME time(0)
#endif
/******************************************************************************/
/* 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;
long lwte_p2;
long lwte_p3;
long lwte_p4;
+#if BITS_PER_LONG > 32
+ long lwte_pad;
+#endif
} lwt_event_t;
#if LWT_SUPPORT
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.
#endif /* __KERNEL__ */
#endif /* LWT_SUPPORT */
+struct portals_device_userstate
+{
+ int pdu_memhog_pages;
+ struct page *pdu_memhog_root_page;
+};
#include <linux/portals_lib.h>
* USER LEVEL STUFF BELOW
*/
+#define PORTALS_CFG_VERSION 0x00010001;
+
+struct portals_cfg {
+ __u32 pcfg_version;
+ __u32 pcfg_command;
+
+ __u32 pcfg_nal;
+ __u32 pcfg_flags;
+
+ __u32 pcfg_gw_nal;
+ __u64 pcfg_nid;
+ __u64 pcfg_nid2;
+ __u64 pcfg_nid3;
+ __u32 pcfg_id;
+ __u32 pcfg_misc;
+ __u32 pcfg_fd;
+ __u32 pcfg_count;
+ __u32 pcfg_size;
+ __u32 pcfg_wait;
+
+ __u32 pcfg_plen1; /* buffers in userspace */
+ char *pcfg_pbuf1;
+ __u32 pcfg_plen2; /* buffers in userspace */
+ char *pcfg_pbuf2;
+};
+
+#define PCFG_INIT(pcfg, cmd) \
+do { \
+ memset(&pcfg, 0, sizeof(pcfg)); \
+ pcfg.pcfg_version = PORTALS_CFG_VERSION; \
+ pcfg.pcfg_command = (cmd); \
+ \
+} while (0)
+
#define PORTAL_IOCTL_VERSION 0x00010007
#define PING_SYNC 0
#define PING_ASYNC 1
#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_ADD_ROUTE _IOWR('e', 35, long)
-#define IOC_PORTAL_DEL_ROUTE _IOWR('e', 36, long)
-#define IOC_PORTAL_GET_ROUTE _IOWR('e', 37, long)
-#define IOC_PORTAL_NAL_CMD _IOWR('e', 38, long)
-#define IOC_PORTAL_GET_NID _IOWR('e', 39, long)
-#define IOC_PORTAL_FAIL_NID _IOWR('e', 40, long)
-#define IOC_PORTAL_SET_DAEMON _IOWR('e', 41, long)
-#define IOC_PORTAL_NOTIFY_ROUTER _IOWR('e', 42, long)
-#define IOC_PORTAL_LWT_CONTROL _IOWR('e', 43, long)
-#define IOC_PORTAL_LWT_SNAPSHOT _IOWR('e', 44, long)
-#define IOC_PORTAL_LWT_LOOKUP_STRING _IOWR('e', 45, long)
-#define IOC_PORTAL_MAX_NR 45
+#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_MEMHOG _IOWR('e', 42, long)
+#define IOC_PORTAL_MAX_NR 42
enum {
- QSWNAL = 1,
- SOCKNAL,
- GMNAL,
- TOENAL,
- TCPNAL,
- SCIMACNAL,
+ 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;
#endif
+#define PTL_NALFMT_SIZE 16
+
#define NAL_MAX_NR (NAL_ENUM_END_MARKER - 1)
#define NAL_CMD_REGISTER_PEER_FD 100
#define NAL_CMD_ADD_AUTOCONN 106
#define NAL_CMD_GET_AUTOCONN 107
#define NAL_CMD_GET_TXDESC 108
+#define NAL_CMD_ADD_ROUTE 109
+#define NAL_CMD_DEL_ROUTE 110
+#define NAL_CMD_GET_ROUTE 111
+#define NAL_CMD_NOTIFY_ROUTER 112
enum {
DEBUG_DAEMON_START = 1,
ptl_handle_ni_t peer_ni;
};
+
/* module.c */
-typedef int (*nal_cmd_handler_t)(struct portal_ioctl_data *, void * private);
+typedef int (*nal_cmd_handler_t)(struct portals_cfg *, void * private);
int kportal_nal_register(int nal, nal_cmd_handler_t handler, void * private);
int kportal_nal_unregister(int nal);
+enum cfg_record_type {
+ PORTALS_CFG_TYPE = 1,
+ LUSTRE_CFG_TYPE = 123,
+};
+
+typedef int (*cfg_record_cb_t)(enum cfg_record_type, int len, void *data);
+int kportal_nal_cmd(struct portals_cfg *);
+
ptl_handle_ni_t *kportal_get_ni (int nal);
void kportal_put_ni (int nal);
# endif
#endif
-#if (BITS_PER_LONG == 32 || __WORDSIZE == 32)
+#if defined(__x86_64__)
+# define LPU64 "%Lu"
+# define LPD64 "%Ld"
+# define LPX64 "%#Lx"
+# define LPSZ "%lu"
+# define LPSSZ "%ld"
+#elif (BITS_PER_LONG == 32 || __WORDSIZE == 32)
# define LPU64 "%Lu"
# define LPD64 "%Ld"
# define LPX64 "%#Lx"
# define LPSZ "%u"
# define LPSSZ "%d"
-#endif
-#if (BITS_PER_LONG == 64 || __WORDSIZE == 64)
+#elif (BITS_PER_LONG == 64 || __WORDSIZE == 64)
# define LPU64 "%lu"
# define LPD64 "%ld"
# define LPX64 "%#lx"