#include <asm/uaccess.h>
#include <asm/segment.h>
#include <linux/miscdevice.h>
+#include <linux/version.h>
# define DEBUG_SUBSYSTEM S_PORTALS
#include <linux/kp30.h>
#include <linux/portals_compat25.h>
+#include <linux/libcfs.h>
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+#include <linux/kallsyms.h>
+#endif
+
+unsigned int portal_subsystem_debug = ~0 - (S_PORTALS | S_QSWNAL | S_SOCKNAL |
+ S_GMNAL | S_IBNAL);
+EXPORT_SYMBOL(portal_subsystem_debug);
+
+unsigned int portal_debug = (D_WARNING | D_DLMTRACE | D_ERROR | D_EMERG | D_HA |
+ D_RPCTRACE | D_VFSTRACE | 0xffffffff);
+EXPORT_SYMBOL(portal_debug);
+
+unsigned int portal_cerror = 1;
+EXPORT_SYMBOL(portal_cerror);
+
+unsigned int portal_printk;
+EXPORT_SYMBOL(portal_printk);
+
+unsigned int portal_stack;
+EXPORT_SYMBOL(portal_stack);
+
+#ifdef __KERNEL__
+atomic_t portal_kmemory = ATOMIC_INIT(0);
+EXPORT_SYMBOL(portal_kmemory);
+#endif
#define DEBUG_OVERFLOW 1024
static char *debug_buf = NULL;
static unsigned long debug_size = 0;
static atomic_t debug_off_a = ATOMIC_INIT(0);
static int debug_wrapped;
-wait_queue_head_t debug_ctlwq;
+static DECLARE_WAIT_QUEUE_HEAD(debug_ctlwq);
#define DAEMON_SND_SIZE (64 << 10)
/*
PTR_ERR(file));
GOTO(out, PTR_ERR(file));
} else {
- printk(KERN_ALERT "LustreError: dumping log to %s ... writing ...\n",
+ printk(KERN_ALERT "LustreError: dumping log to %s ...\n",
debug_file_name);
}
void portals_debug_dumplog(void)
{
int rc;
+ DECLARE_WAITQUEUE(wait, current);
ENTRY;
- init_waitqueue_head(&debug_ctlwq);
+ /* we're being careful to ensure that the kernel thread is
+ * able to set our state to running as it exits before we
+ * get to schedule() */
+ set_current_state(TASK_INTERRUPTIBLE);
+ add_wait_queue(&debug_ctlwq, &wait);
rc = kernel_thread(portals_do_debug_dumplog,
NULL, CLONE_VM | CLONE_FS | CLONE_FILES);
- if (rc < 0) {
+ if (rc < 0)
printk(KERN_ERR "LustreError: cannot start log dump thread: "
"%d\n", rc);
- return;
- }
- sleep_on(&debug_ctlwq);
+ else
+ schedule();
+
+ /* be sure to teardown if kernel_thread() failed */
+ remove_wait_queue(&debug_ctlwq, &wait);
+ set_current_state(TASK_RUNNING);
}
int portals_debug_daemon_start(char *file, unsigned int size)
debug_buf = vmalloc(bufsize + DEBUG_OVERFLOW);
if (debug_buf == NULL)
return -ENOMEM;
- memset(debug_buf, 0, debug_size);
+ memset(debug_buf, 0, bufsize + DEBUG_OVERFLOW);
debug_wrapped = 0;
//printk(KERN_INFO "Portals: allocated %lu byte debug buffer at %p.\n",
if (debug_buf == NULL)
return -EINVAL;
- CDEBUG(0, "********************************************************\n");
+ CDEBUG(D_TRACE,"***************************************************\n");
CWARN("DEBUG MARKER: %s\n", text);
- CDEBUG(0, "********************************************************\n");
+ CDEBUG(D_TRACE,"***************************************************\n");
return 0;
}
rc = -ENOMEM;
goto cleanup;
}
- list_add(&page->list, &my_pages);
+ list_add(&PAGE_LIST(page), &my_pages);
}
spin_lock_irqsave(&portals_debug_lock, flags);
copied = 0;
list_for_each(pos, &my_pages) {
unsigned long to_copy;
- page = list_entry(pos, struct page, list);
void *addr;
+ page = list_entry(pos, struct page, PAGE_LIST_ENTRY);
to_copy = min(total - off, PAGE_SIZE);
if (to_copy == 0) {
off = 0;
off = 0;
list_for_each(pos, &my_pages) {
unsigned long to_copy;
- page = list_entry(pos, struct page, list);
+ page = list_entry(pos, struct page, PAGE_LIST_ENTRY);
to_copy = min(copied - off, PAGE_SIZE);
rc = copy_to_user(buf + off, kmap(page), to_copy);
cleanup:
list_for_each_safe(pos, n, &my_pages) {
- page = list_entry(pos, struct page, list);
- list_del(&page->list);
+ page = list_entry(pos, struct page, PAGE_LIST_ENTRY);
+ list_del(&PAGE_LIST(page));
__free_page(page);
}
return rc;
subsys, mask, smp_processor_id(),
tv.tv_sec, tv.tv_usec, stack, current->pid);
max_nob -= prefix_nob;
+
if(*(format + strlen(format) - 1) != '\n')
- *(format + strlen(format)) = '\n';
+ printk(KERN_INFO "format at %s:%d:%s doesn't end in newline\n",
+ file, line, fn);
#if defined(__arch_um__) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20))
msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob,
char *portals_nid2str(int nal, ptl_nid_t nid, char *str)
{
switch(nal){
+/* XXX this could be a nal method of some sort, 'cept it's config
+ * dependent whether (say) socknal NIDs are actually IP addresses... */
+#ifndef CRAY_PORTALS
case TCPNAL:
/* userspace NAL */
case SOCKNAL:
- sprintf(str, "%u:%d.%d.%d.%d", (__u32)(nid >> 32),
- HIPQUAD(nid));
+ snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u.%u.%u.%u",
+ (__u32)(nid >> 32), HIPQUAD(nid));
break;
case QSWNAL:
case GMNAL:
case IBNAL:
- case SCIMACNAL:
- sprintf(str, "%u:%u", (__u32)(nid >> 32), (__u32)nid);
+ snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u",
+ (__u32)(nid >> 32), (__u32)nid);
break;
+#endif
default:
- return NULL;
+ snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx",
+ nal, (long long)nid);
+ break;
}
return str;
}
#ifdef __KERNEL__
-#include <linux/lustre_version.h>
-#if (LUSTRE_KERNEL_VERSION >= 30)
-#warning "FIXME: remove workaround when l30 is widely used"
char stack_backtrace[LUSTRE_TRACE_SIZE];
spinlock_t stack_backtrace_lock = SPIN_LOCK_UNLOCKED;
#if defined(__arch_um__)
-extern int is_kernel_text_address(unsigned long addr);
-
char *portals_debug_dumpstack(void)
{
asm("int $3");
- return "dump stack";
+ return "dump stack\n";
}
#elif defined(__i386__)
-extern int is_kernel_text_address(unsigned long addr);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
extern int lookup_symbol(unsigned long address, char *buf, int buflen);
+const char *kallsyms_lookup(unsigned long addr,
+ unsigned long *symbolsize,
+ unsigned long *offset,
+ char **modname, char *namebuf)
+{
+ int rc = lookup_symbol(addr, namebuf, 128);
+ if (rc == -ENOSYS)
+ return NULL;
+ return namebuf;
+}
+#endif
char *portals_debug_dumpstack(void)
{
- unsigned long esp = current->thread.esp;
+ unsigned long esp = current->thread.esp, addr;
unsigned long *stack = (unsigned long *)&esp;
+ char *buf = stack_backtrace, *pbuf = buf;
int size;
- unsigned long addr;
- char *buf = stack_backtrace;
- char *pbuf = buf;
- static char buffer[512];
- int rc = 0;
/* User space on another CPU? */
- if ((esp ^ (unsigned long)current) & (PAGE_MASK<<1)){
+ if ((esp ^ (unsigned long)current) & (PAGE_MASK << 1)){
buf[0] = '\0';
goto out;
}
size = sprintf(pbuf, " Call Trace: ");
pbuf += size;
- while (((long) stack & (THREAD_SIZE-1)) != 0) {
+ while (((long) stack & (THREAD_SIZE - 1)) != 0) {
addr = *stack++;
- if (is_kernel_text_address(addr)) {
- rc = lookup_symbol(addr, buffer, 512);
- if (rc == -ENOSYS) {
+ if (kernel_text_address(addr)) {
+ const char *sym_name;
+ char *modname, buffer[128];
+ unsigned long junk, offset;
+
+ sym_name = kallsyms_lookup(addr, &junk, &offset,
+ &modname, buffer);
+ if (sym_name == NULL) {
if (buf + LUSTRE_TRACE_SIZE <= pbuf + 12)
break;
size = sprintf(pbuf, "[<%08lx>] ", addr);
<= pbuf + strlen(buffer) + 28 + 1)
break;
size = sprintf(pbuf, "([<%08lx>] %s (0x%p)) ",
- addr, buffer, stack-1);
+ addr, buffer, stack - 1);
}
pbuf += size;
}
#endif /* __arch_um__ */
EXPORT_SYMBOL(stack_backtrace_lock);
EXPORT_SYMBOL(portals_debug_dumpstack);
-#endif /* LUSTRE_KERNEL_VERSION < 30 */
#endif /* __KERNEL__ */
EXPORT_SYMBOL(portals_debug_dumplog);