X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fportals%2Finclude%2Flinux%2Flibcfs.h;h=d8f53496fcd36450a083059c05e5cfaac7ffddb5;hb=c2b7b642d3ddc10a109e00d04a5b0df3bf150efc;hp=dfea8100ab0d9516ef6c8dcf1637dba5a37b5dc7;hpb=b5b6224b227ca816fc40739741f0c37364db6677;p=fs%2Flustre-release.git diff --git a/lustre/portals/include/linux/libcfs.h b/lustre/portals/include/linux/libcfs.h index dfea810..d8f5349 100644 --- a/lustre/portals/include/linux/libcfs.h +++ b/lustre/portals/include/linux/libcfs.h @@ -2,51 +2,62 @@ * 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 -# if defined(__powerpc__) && !defined(__KERNEL__) -# define __KERNEL__ -# include -# undef __KERNEL__ -# else -# if defined(__KERNEL__) -# include -# else -# include -# 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 #else -# include -typedef u_int32_t __u32; -typedef u_int64_t __u64; +#include "types.h" #endif #ifdef __KERNEL__ # include +# include #else # include # 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 +# include +# 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 */ @@ -54,7 +65,23 @@ extern unsigned int portal_subsystem_debug; 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 @@ -67,25 +94,24 @@ extern unsigned int portal_cerror; #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 */ @@ -111,7 +137,12 @@ extern unsigned int portal_cerror; #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 /* THREAD_SIZE */ @@ -132,7 +163,7 @@ extern unsigned int portal_cerror; # define CDEBUG_STACK (THREAD_SIZE - \ ((unsigned long)__builtin_frame_address(0) & \ (THREAD_SIZE - 1))) -# endif +# endif /* __ia64__ */ #define CHECK_STACK(stack) \ do { \ @@ -144,7 +175,7 @@ extern unsigned int portal_cerror; /*panic("LBUG");*/ \ } \ } while (0) -#else /* __KERNEL__ */ +#else /* !__KERNEL__ */ #define CHECK_STACK(stack) do { } while(0) #define CDEBUG_STACK (0L) #endif /* __KERNEL__ */ @@ -152,8 +183,6 @@ extern unsigned int portal_cerror; #if 1 #define CDEBUG(mask, format, a...) \ do { \ - if (portal_cerror == 0) \ - break; \ CHECK_STACK(CDEBUG_STACK); \ if (((mask) & (D_ERROR | D_EMERG | D_WARNING)) || \ (portal_debug & (mask) && \ @@ -163,8 +192,41 @@ do { \ CDEBUG_STACK, format, ## a); \ } while (0) -#define CWARN(format, a...) CDEBUG(D_WARNING, format, ## a) -#define CERROR(format, a...) CDEBUG(D_ERROR, format, ## a) +#define CDEBUG_MAX_LIMIT 600 +#define CDEBUG_LIMIT(cdebug_mask, cdebug_format, a...) \ +do { \ + 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, cdebug_format, ## a); \ + cdebug_count++; \ + } \ +} 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) \ @@ -195,15 +257,33 @@ do { \ } while(0) #else #define CDEBUG(mask, format, a...) do { } while (0) -#define CWARN(format, a...) do { } while (0) -#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 { @@ -297,6 +377,34 @@ int libcfs_deregister_ioctl(struct libcfs_ioctl_handler *hand); #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 */