* vim:expandtab:shiftwidth=8:tabstop=8:
*/
#ifndef _LIBCFS_H
+#define _LIBCFS_H
-
-#define PORTAL_DEBUG
-
-/* I think this beast is just trying to get cycles_t and get_cycles().
- * this should be in its own header. */
-#ifdef __linux__
-# include <asm/types.h>
-# if defined(__powerpc__) && !defined(__KERNEL__)
-# define __KERNEL__
-# include <asm/timex.h>
-# undef __KERNEL__
-# else
-# if defined(__KERNEL__)
-# include <asm/timex.h>
-# else
-# include <sys/time.h>
-# define cycles_t unsigned long
-static inline cycles_t get_cycles(void)
-{
- struct timeval tv;
- gettimeofday(&tv, NULL);
- return (tv.tv_sec * 100000) + tv.tv_usec;
-}
-# endif
-# endif
+#ifdef HAVE_ASM_TYPES_H
+#include <asm/types.h>
#else
-# include <sys/types.h>
-typedef u_int32_t __u32;
-typedef u_int64_t __u64;
+#include "types.h"
#endif
#ifdef __KERNEL__
# include <linux/time.h>
+# include <asm/timex.h>
#else
# include <sys/time.h>
# define do_gettimeofday(tv) gettimeofday(tv, NULL);
+typedef unsigned long long cycles_t;
#endif
+#define PORTAL_DEBUG
+
#ifndef offsetof
# define offsetof(typ,memb) ((unsigned long)((char *)&(((typ *)0)->memb)))
#endif
#define LOWEST_BIT_SET(x) ((x) & ~((x) - 1))
+#ifndef __KERNEL__
+/* Userpace byte flipping */
+# include <endian.h>
+# include <byteswap.h>
+# define __swab16(x) bswap_16(x)
+# define __swab32(x) bswap_32(x)
+# define __swab64(x) bswap_64(x)
+# define __swab16s(x) do {*(x) = bswap_16(*(x));} while (0)
+# define __swab32s(x) do {*(x) = bswap_32(*(x));} while (0)
+# define __swab64s(x) do {*(x) = bswap_64(*(x));} while (0)
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define le16_to_cpu(x) (x)
+# define cpu_to_le16(x) (x)
+# define le32_to_cpu(x) (x)
+# define cpu_to_le32(x) (x)
+# define le64_to_cpu(x) (x)
+# define cpu_to_le64(x) (x)
+# else
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define le16_to_cpu(x) bswap_16(x)
+# define cpu_to_le16(x) bswap_16(x)
+# define le32_to_cpu(x) bswap_32(x)
+# define cpu_to_le32(x) bswap_32(x)
+# define le64_to_cpu(x) bswap_64(x)
+# define cpu_to_le64(x) bswap_64(x)
+# else
+# error "Unknown byte order"
+# endif /* __BIG_ENDIAN */
+# endif /* __LITTLE_ENDIAN */
+#endif /* ! __KERNEL__ */
+
/*
* Debugging
*/
extern unsigned int portal_stack;
extern unsigned int portal_debug;
extern unsigned int portal_printk;
-extern unsigned int portal_cerror;
+
+struct ptldebug_header {
+ __u32 ph_len;
+ __u32 ph_flags;
+ __u32 ph_subsys;
+ __u32 ph_mask;
+ __u32 ph_cpu_id;
+ __u32 ph_sec;
+ __u64 ph_usec;
+ __u32 ph_stack;
+ __u32 ph_pid;
+ __u32 ph_extern_pid;
+ __u32 ph_line_num;
+} __attribute__((packed));
+
+#define PH_FLAG_FIRST_RECORD 1
+
/* Debugging subsystems (32 bits, non-overlapping) */
#define S_UNDEFINED 0x00000001
#define S_MDC 0x00000002
#define S_RPC 0x00000100
#define S_MGMT 0x00000200
#define S_PORTALS 0x00000400
-#define S_SOCKNAL 0x00000800
-#define S_QSWNAL 0x00001000
-#define S_PINGER 0x00002000
-#define S_FILTER 0x00004000
-#define S_PTLBD 0x00008000
-#define S_ECHO 0x00010000
-#define S_LDLM 0x00020000
-#define S_LOV 0x00040000
-#define S_GMNAL 0x00080000
-#define S_PTLROUTER 0x00100000
-#define S_COBD 0x00200000
-#define S_IBNAL 0x00400000
-#define S_SM 0x00800000
-#define S_ASOBD 0x01000000
-#define S_LMV 0x02000000
-#define S_CMOBD 0x04000000
-
-/* If you change these values, please keep portals/utils/debug.c
- * up to date! */
+#define S_NAL 0x00000800 /* ALL NALs */
+#define S_PINGER 0x00001000
+#define S_FILTER 0x00002000
+#define S_PTLBD 0x00004000
+#define S_ECHO 0x00008000
+#define S_LDLM 0x00010000
+#define S_LOV 0x00020000
+#define S_PTLROUTER 0x00040000
+#define S_COBD 0x00080000
+#define S_SM 0x00100000
+#define S_ASOBD 0x00200000
+#define S_CONFOBD 0x00400000
+#define S_LMV 0x00800000
+#define S_CMOBD 0x01000000
+/* If you change these values, please keep these files up to date...
+ * portals/utils/debug.c
+ * utils/lconf
+ */
/* Debugging masks (32 bits, non-overlapping) */
#define D_TRACE 0x00000001 /* ENTRY/EXIT markers */
#define D_RPCTRACE 0x00100000 /* for distributed debugging */
#define D_VFSTRACE 0x00200000
#define D_READA 0x00400000 /* read-ahead */
-#define D_CONFIG 0x00800000
+#define D_MMAP 0x00800000
+#define D_CONFIG 0x01000000
+/* If you change these values, please keep these files up to date...
+ * portals/utils/debug.c
+ * utils/lconf
+ */
#ifdef __KERNEL__
# include <linux/sched.h> /* THREAD_SIZE */
#define LUSTRE_TRACE_SIZE (THREAD_SIZE >> 5)
-//#ifdef __KERNEL__
-#if 0
+#ifdef __KERNEL__
# ifdef __ia64__
# define CDEBUG_STACK (THREAD_SIZE - \
((unsigned long)__builtin_dwarf_cfa() & \
# define CDEBUG_STACK (THREAD_SIZE - \
((unsigned long)__builtin_frame_address(0) & \
(THREAD_SIZE - 1)))
-# endif
+# endif /* __ia64__ */
#define CHECK_STACK(stack) \
do { \
/*panic("LBUG");*/ \
} \
} while (0)
-#else /* __KERNEL__ */
+#else /* !__KERNEL__ */
#define CHECK_STACK(stack) do { } while(0)
#define CDEBUG_STACK (0L)
#endif /* __KERNEL__ */
#if 1
#define CDEBUG(mask, format, a...) \
do { \
- if (likely(portal_debug == 0)) \
- break; \
+ CHECK_STACK(CDEBUG_STACK); \
if (((mask) & (D_ERROR | D_EMERG | D_WARNING)) || \
(portal_debug & (mask) && \
portal_subsystem_debug & DEBUG_SUBSYSTEM)) \
CDEBUG_STACK, format, ## a); \
} while (0)
-#define CWARN(format, a...) \
+#define CDEBUG_MAX_LIMIT 600
+#define CDEBUG_LIMIT(cdebug_mask, cdebug_format, a...) \
do { \
- portals_debug_msg(DEBUG_SUBSYSTEM, D_WARNING, \
- __FILE__, __FUNCTION__, __LINE__, \
- CDEBUG_STACK, format, ## a); \
-} while (0)
-
-#define CERROR(format, a...) \
-do { \
- portals_debug_msg(DEBUG_SUBSYSTEM, D_ERROR, \
+ static unsigned long cdebug_next = 0; \
+ static int cdebug_count = 0, cdebug_delay = 1; \
+ \
+ CHECK_STACK(CDEBUG_STACK); \
+ if (time_after(jiffies, cdebug_next)) { \
+ portals_debug_msg(DEBUG_SUBSYSTEM, cdebug_mask, __FILE__, \
+ __FUNCTION__, __LINE__, CDEBUG_STACK, \
+ cdebug_format, ## a); \
+ if (cdebug_count) { \
+ portals_debug_msg(DEBUG_SUBSYSTEM, cdebug_mask, \
+ __FILE__, __FUNCTION__, __LINE__, \
+ 0, "skipped %d similar messages\n", \
+ cdebug_count); \
+ cdebug_count = 0; \
+ } \
+ if (time_after(jiffies, cdebug_next+(CDEBUG_MAX_LIMIT+10)*HZ))\
+ cdebug_delay = cdebug_delay > 8 ? cdebug_delay/8 : 1; \
+ else \
+ cdebug_delay = cdebug_delay*2 >= CDEBUG_MAX_LIMIT*HZ ?\
+ CDEBUG_MAX_LIMIT*HZ : cdebug_delay*2; \
+ cdebug_next = jiffies + cdebug_delay; \
+ } else { \
+ portals_debug_msg(DEBUG_SUBSYSTEM, \
+ portal_debug & ~(D_EMERG|D_ERROR|D_WARNING),\
__FILE__, __FUNCTION__, __LINE__, \
- CDEBUG_STACK, format, ## a); \
+ CDEBUG_STACK, cdebug_format, ## a); \
+ cdebug_count++; \
+ } \
} while (0)
-#define CEMERG(format, a...) \
-do { \
- portals_debug_msg(DEBUG_SUBSYSTEM, D_EMERG, \
- __FILE__, __FUNCTION__, __LINE__, \
- CDEBUG_STACK, format, ## a); \
-} while (0)
+#define CWARN(format, a...) CDEBUG_LIMIT(D_WARNING, format, ## a)
+#define CERROR(format, a...) CDEBUG_LIMIT(D_ERROR, format, ## a)
+#define CEMERG(format, a...) CDEBUG(D_EMERG, format, ## a)
#define GOTO(label, rc) \
do { \
} while(0)
#else
#define CDEBUG(mask, format, a...) do { } while (0)
-#define CWARN(format, a...) printk("<4>" format, ## a)
-#define CERROR(format, a...) printk("<3>" format, ## a)
-#define CEMERG(format, a...) printk("<0>" format, ## a)
+#define CWARN(format, a...) printk(KERN_WARNING format, ## a)
+#define CERROR(format, a...) printk(KERN_ERR format, ## a)
+#define CEMERG(format, a...) printk(KERN_EMERG format, ## a)
#define GOTO(label, rc) do { (void)(rc); goto label; } while (0)
#define RETURN(rc) return (rc)
#define ENTRY do { } while (0)
#define EXIT do { } while (0)
#endif
+/* initial pid */
+# if CRAY_PORTALS
+/*
+ * 1) ptl_pid_t in cray portals is only 16 bits, not 32 bits, therefore this
+ * is too big.
+ *
+ * 2) the implementation of ernal in cray portals further restricts the pid
+ * space that may be used to 0 <= pid <= 255 (an 8 bit value). Returns
+ * an error at nal init time for any pid outside this range. Other nals
+ * in cray portals don't have this restriction.
+ * */
+#define LUSTRE_PTL_PID 9
+# else
+#define LUSTRE_PTL_PID 12345
+# endif
+
+#define LUSTRE_SRV_PTL_PID LUSTRE_PTL_PID
+
#define PORTALS_CFG_VERSION 0x00010001;
struct portals_cfg {
#endif
-#define _LIBCFS_H
+#ifdef __KERNEL__
+/* libcfs watchdogs */
+struct lc_watchdog;
+
+/* Just use the default handler (dumplog) */
+#define LC_WATCHDOG_DEFAULT_CB NULL
+
+/* Add a watchdog which fires after "time" milliseconds of delay. You have to
+ * touch it once to enable it. */
+struct lc_watchdog *lc_watchdog_add(int time,
+ void (*cb)(struct lc_watchdog *,
+ struct task_struct *,
+ void *),
+ void *data);
+
+/* Enables a watchdog and resets its timer. */
+void lc_watchdog_touch(struct lc_watchdog *lcw);
+
+/* Disable a watchdog; touch it to restart it. */
+void lc_watchdog_disable(struct lc_watchdog *lcw);
+
+/* Clean up the watchdog */
+void lc_watchdog_delete(struct lc_watchdog *lcw);
+
+/* Dump a debug log */
+void lc_watchdog_dumplog(struct lc_watchdog *lcw,
+ struct task_struct *tsk,
+ void *data);
+#endif /* !__KERNEL__ */
#endif /* _LIBCFS_H */