-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
* GPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#include <libcfs/libcfs.h>
#include "tracefile.h"
-#ifndef get_cpu
-#define get_cpu() smp_processor_id()
-#define put_cpu() do { } while (0)
-#endif
-
-/* only define one trace_data type for windows */
-enum {
- TCD_TYPE_PASSIVE = 0,
- TCD_TYPE_DISPATCH,
- TCD_TYPE_MAX
-};
-
/* percents to share the total debug memory for each type */
-static unsigned int pages_factor[TCD_TYPE_MAX] = {
- 90, /* 90% pages for TCD_TYPE_PASSIVE */
- 10 /* 10% pages for TCD_TYPE_DISPATCH */
+static unsigned int pages_factor[CFS_TCD_TYPE_MAX] = {
+ 90, /* 90% pages for CFS_TCD_TYPE_PASSIVE */
+ 10 /* 10% pages for CFS_TCD_TYPE_DISPATCH */
};
-char *trace_console_buffers[NR_CPUS][TCD_TYPE_MAX];
+char *cfs_trace_console_buffers[NR_CPUS][CFS_TCD_TYPE_MAX];
-struct rw_semaphore tracefile_sem;
+struct rw_semaphore cfs_tracefile_sem;
-int tracefile_init_arch()
+int cfs_tracefile_init_arch()
{
int i;
int j;
- struct trace_cpu_data *tcd;
+ struct cfs_trace_cpu_data *tcd;
- init_rwsem(&tracefile_sem);
+ init_rwsem(&cfs_tracefile_sem);
/* initialize trace_data */
- memset(trace_data, 0, sizeof(trace_data));
- for (i = 0; i < TCD_TYPE_MAX; i++) {
- trace_data[i]=cfs_alloc(sizeof(union trace_data_union)*NR_CPUS,
- GFP_KERNEL);
- if (trace_data[i] == NULL)
+ memset(cfs_trace_data, 0, sizeof(cfs_trace_data));
+ for (i = 0; i < CFS_TCD_TYPE_MAX; i++) {
+ cfs_trace_data[i] =
+ kmalloc(sizeof(union cfs_trace_data_union) * \
+ NR_CPUS, GFP_KERNEL);
+ if (cfs_trace_data[i] == NULL)
goto out;
}
/* arch related info initialized */
- tcd_for_each(tcd, i, j) {
+ cfs_tcd_for_each(tcd, i, j) {
tcd->tcd_pages_factor = (USHORT) pages_factor[i];
tcd->tcd_type = (USHORT) i;
tcd->tcd_cpu = (USHORT)j;
}
for (i = 0; i < num_possible_cpus(); i++)
- for (j = 0; j < TCD_TYPE_MAX; j++) {
- trace_console_buffers[i][j] =
- cfs_alloc(TRACE_CONSOLE_BUFFER_SIZE,
- GFP_KERNEL);
+ for (j = 0; j < CFS_TCD_TYPE_MAX; j++) {
+ cfs_trace_console_buffers[i][j] =
+ kmalloc(CFS_TRACE_CONSOLE_BUFFER_SIZE,
+ GFP_KERNEL);
- if (trace_console_buffers[i][j] == NULL)
+ if (cfs_trace_console_buffers[i][j] == NULL)
goto out;
}
return 0;
out:
- tracefile_fini_arch();
- printk(KERN_ERR "lnet: No enough memory\n");
+ cfs_tracefile_fini_arch();
+ printk(KERN_ERR "lnet: Not enough memory\n");
return -ENOMEM;
}
-void tracefile_fini_arch()
+void cfs_tracefile_fini_arch()
{
int i;
int j;
for (i = 0; i < num_possible_cpus(); i++) {
- for (j = 0; j < TCD_TYPE_MAX; j++) {
- if (trace_console_buffers[i][j] != NULL) {
- cfs_free(trace_console_buffers[i][j]);
- trace_console_buffers[i][j] = NULL;
+ for (j = 0; j < CFS_TCD_TYPE_MAX; j++) {
+ if (cfs_trace_console_buffers[i][j] != NULL) {
+ kfree(cfs_trace_console_buffers[i][j]);
+ cfs_trace_console_buffers[i][j] = NULL;
}
}
}
- for (i = 0; trace_data[i] != NULL; i++) {
- cfs_free(trace_data[i]);
- trace_data[i] = NULL;
+ for (i = 0; cfs_trace_data[i] != NULL; i++) {
+ kfree(cfs_trace_data[i]);
+ cfs_trace_data[i] = NULL;
}
- fini_rwsem(&tracefile_sem);
-}
-
-void tracefile_read_lock()
-{
- down_read(&tracefile_sem);
-}
-
-void tracefile_read_unlock()
-{
- up_read(&tracefile_sem);
+ fini_rwsem(&cfs_tracefile_sem);
}
-void tracefile_write_lock()
+void cfs_tracefile_read_lock()
{
- down_write(&tracefile_sem);
+ down_read(&cfs_tracefile_sem);
}
-void tracefile_write_unlock()
+void cfs_tracefile_read_unlock()
{
- up_write(&tracefile_sem);
+ up_read(&cfs_tracefile_sem);
}
-char *
-trace_get_console_buffer(void)
+void cfs_tracefile_write_lock()
{
- int cpu = get_cpu();
- int type = 0;
-
- if (KeGetCurrentIrql() >= DISPATCH_LEVEL)
- type = TCD_TYPE_DISPATCH;
- else
- type = TCD_TYPE_PASSIVE;
- return trace_console_buffers[cpu][type];
+ down_write(&cfs_tracefile_sem);
}
-void
-trace_put_console_buffer(char *buffer)
+void cfs_tracefile_write_unlock()
{
- put_cpu();
+ up_write(&cfs_tracefile_sem);
}
-struct trace_cpu_data *
-trace_get_tcd(void)
+cfs_trace_buf_type_t cfs_trace_buf_idx_get()
{
- int cpu = get_cpu();
- int type = 0;
-
if (KeGetCurrentIrql() >= DISPATCH_LEVEL)
- type = TCD_TYPE_DISPATCH;
+ return CFS_TCD_TYPE_DISPATCH;
else
- type = TCD_TYPE_PASSIVE;
- return &(*trace_data[type])[cpu].tcd;
-}
-
-void
-trace_put_tcd (struct trace_cpu_data *tcd)
-{
- put_cpu();
+ return CFS_TCD_TYPE_PASSIVE;
}
-int trace_lock_tcd(struct trace_cpu_data *tcd)
+int cfs_trace_lock_tcd(struct cfs_trace_cpu_data *tcd, int walking)
{
- __LASSERT(tcd->tcd_type < TCD_TYPE_MAX);
+ __LASSERT(tcd->tcd_type < CFS_TCD_TYPE_MAX);
return 1;
}
-void trace_unlock_tcd(struct trace_cpu_data *tcd)
+void cfs_trace_unlock_tcd(struct cfs_trace_cpu_data *tcd, int walking)
{
- __LASSERT(tcd->tcd_type < TCD_TYPE_MAX);
+ __LASSERT(tcd->tcd_type < CFS_TCD_TYPE_MAX);
}
-int tcd_owns_tage(struct trace_cpu_data *tcd, struct trace_page *tage)
+int cfs_tcd_owns_tage(struct cfs_trace_cpu_data *tcd,
+ struct cfs_trace_page *tage)
{
/*
* XXX nikita: do NOT call portals_debug_msg() (CDEBUG/ENTRY/EXIT)
}
void
-set_ptldebug_header(struct ptldebug_header *header, int subsys, int mask,
- const int line, unsigned long stack)
+cfs_set_ptldebug_header(struct ptldebug_header *header, int subsys, int mask,
+ const int line, unsigned long stack)
{
struct timeval tv;
header->ph_subsys = subsys;
header->ph_mask = mask;
header->ph_cpu_id = smp_processor_id();
+ header->ph_type = cfs_trace_buf_idx_get();
header->ph_sec = (__u32)tv.tv_sec;
header->ph_usec = tv.tv_usec;
header->ph_stack = stack;
return;
}
-void print_to_console(struct ptldebug_header *hdr, int mask, const char *buf,
- int len, const char *file, const char *fn)
+void cfs_print_to_console(struct ptldebug_header *hdr, int mask,
+ const char *buf, int len, const char *file,
+ const char *fn)
{
char *prefix = "Lustre", *ptype = NULL;
return;
}
-int trace_max_debug_mb(void)
+int cfs_trace_max_debug_mb(void)
{
- int total_mb = (num_physpages >> (20 - CFS_PAGE_SHIFT));
-
- return MAX(512, (total_mb * 80)/100);
-}
+ int total_mb = (totalram_pages >> (20 - PAGE_CACHE_SHIFT));
-void
-trace_call_on_all_cpus(void (*fn)(void *_arg), void *arg)
-{
- int cpu;
- KAFFINITY mask = cfs_query_thread_affinity();
-
- for (cpu = 0; cpu < num_possible_cpus(); cpu++) {
- if (cfs_tie_thread_to_cpu(cpu)) {
- ASSERT((int)KeGetCurrentProcessorNumber() == cpu);
- fn(arg);
- cfs_set_thread_affinity(mask);
- }
- }
+ return MAX(512, (total_mb * 80)/100);
}