Whamcloud - gitweb
* Landed portals:b_port_step as follows...
[fs/lustre-release.git] / lnet / libcfs / darwin / darwin-tracefile.c
1
2 #define DEBUG_SUBSYSTEM S_PORTALS
3 #define LUSTRE_TRACEFILE_PRIVATE
4 #include <libcfs/libcfs.h>
5 #include <libcfs/kp30.h>
6 #include "tracefile.h"
7
8 /*
9  * We can't support smp tracefile currently.
10  * Everything is put on one cpu.
11  */
12
13 #define M_TCD_MAX_PAGES (128 * 1280)
14 extern union trace_data_union trace_data[NR_CPUS];
15 extern char *tracefile;
16 extern long long tracefile_size;
17 extern struct rw_semaphore tracefile_sem;
18 extern int trace_start_thread(void);
19 extern void trace_stop_thread(void);
20
21 long max_debug_mb = M_TCD_MAX_PAGES;
22 static long max_permit_mb = (64 * 1024);
23
24 inline struct trace_cpu_data *
25 __trace_get_tcd (unsigned long *flags)
26 {
27         return &trace_data[0].tcd;
28 }
29
30 inline void
31 __trace_put_tcd (struct trace_cpu_data *tcd, unsigned long flags)
32 {
33         return;
34 }
35
36 void
37 set_ptldebug_header(struct ptldebug_header *header, int subsys, int mask, 
38                     const int line, unsigned long stack)
39
40         struct timeval tv; 
41         
42         do_gettimeofday(&tv); 
43         header->ph_subsys = subsys; 
44         header->ph_mask = mask; 
45         header->ph_cpu_id = smp_processor_id(); 
46         header->ph_sec = (__u32)tv.tv_sec; 
47         header->ph_usec = tv.tv_usec; 
48         header->ph_stack = stack; 
49         header->ph_pid = 0; 
50         header->ph_line_num = line; 
51         header->ph_extern_pid = 0;
52 }
53
54 void print_to_console(struct ptldebug_header *hdr, int mask, char *buf, 
55                              int len, char *file, const char *fn)
56
57         char *prefix = NULL, *ptype = NULL;
58                         
59         if ((mask & D_EMERG) != 0) { 
60                 prefix = "LustreError"; 
61                 ptype = KERN_EMERG; 
62         } else if ((mask & D_ERROR) != 0) { 
63                 prefix = "LustreError"; 
64                 ptype = KERN_ERR; 
65         } else if ((mask & D_WARNING) != 0) { 
66                 prefix = "Lustre"; 
67                 ptype = KERN_WARNING; 
68         } else if (portal_printk != 0) { 
69                 prefix = "Lustre"; 
70                 ptype = KERN_INFO; 
71         } 
72         printk("%s%s: %d:%d:(%s:%d:%s()) %*s", ptype, prefix, hdr->ph_pid, 
73                hdr->ph_extern_pid, file, hdr->ph_line_num, fn, len, buf);
74 }
75
76 /*
77  * Sysctl handle of libcfs
78  */
79 int cfs_trace_daemon SYSCTL_HANDLER_ARGS
80 {
81         int error = 0;
82         char *name = NULL;
83
84         MALLOC(name, char *, req->newlen + 1, M_TEMP, M_WAITOK | M_ZERO);
85         if (name == NULL)
86                 return -ENOMEM;
87         down_write(&tracefile_sem);
88         error = sysctl_handle_string(oidp, name, req->newlen + 1, req);
89         if (!error || req->newptr != NULL) {
90                 /* write */
91                 if (strcmp(name, "stop") == 0) {
92                         /* stop tracefile daemon */
93                         tracefile = NULL;
94                         trace_stop_thread();
95                         goto out; 
96                 }else if (strncmp(name, "size=", 5) == 0) { 
97                         tracefile_size = simple_strtoul(name + 5, NULL, 0); 
98                         if (tracefile_size < 10 || tracefile_size > 20480) 
99                                 tracefile_size = TRACEFILE_SIZE; 
100                         else 
101                                 tracefile_size <<= 20; 
102                         goto out;
103
104                 }
105                 if (name[0] != '/') { 
106                         error = -EINVAL; 
107                         goto out; 
108                 } 
109                 if (tracefile != NULL) 
110                         cfs_free(tracefile);
111                 tracefile = name; 
112                 name = NULL; 
113                 trace_start_thread();
114         } else if (req->newptr != NULL) {
115                 /* Something was wrong with the write request */
116                 printf("sysctl debug daemon failed: %d.\n", error);
117                 goto out;
118         } else {
119                 /* Read request */
120                 SYSCTL_OUT(req, tracefile, sizeof(tracefile));
121         }
122 out:
123         if (name != NULL) 
124                 FREE(name, M_TEMP);
125         up_write(&tracefile_sem);
126         return error;
127 }
128
129
130 int cfs_debug_mb SYSCTL_HANDLER_ARGS
131 {
132         int i;
133         int error = 0;
134
135         error = sysctl_handle_long(oidp, oidp->oid_arg1, oidp->oid_arg2, req);
136         if (!error && req->newptr != NULL) {
137                 /* We have a new value stored in the standard location */
138                 if (max_debug_mb <= 0)
139                         return -EINVAL;
140                 if (max_debug_mb > max_permit_mb) {
141                         printf("sysctl debug_mb is too big: %d.\n", max_debug_mb);
142                         return 0;
143                 } 
144                 for (i = 0; i < NR_CPUS; i++) { 
145                         struct trace_cpu_data *tcd; 
146                         tcd = &trace_data[i].tcd; 
147                         tcd->tcd_max_pages = max_debug_mb;
148                 }
149         } else if (req->newptr != NULL) {
150                 /* Something was wrong with the write request */
151                 printf ("sysctl debug_mb fault: %d.\n", error);
152         } else {
153                 /* Read request */
154                 error = SYSCTL_OUT(req, &max_debug_mb, sizeof max_debug_mb);
155         }
156         return error;
157 }
158
159