2 * Copyright 2014 Cisco Systems, Inc. All rights reserved.
4 * This program is free software; you may redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 2 of the License.
8 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
9 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
10 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
11 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
12 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
13 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
14 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18 #include <linux/module.h>
19 #include <linux/mempool.h>
20 #include <linux/errno.h>
21 #include <linux/vmalloc.h>
27 * snic_get_trc_buf : Allocates a trace record and returns.
29 struct snic_trc_data
*
30 snic_get_trc_buf(void)
32 struct snic_trc
*trc
= &snic_glob
->trc
;
33 struct snic_trc_data
*td
= NULL
;
36 spin_lock_irqsave(&trc
->lock
, flags
);
37 td
= &trc
->buf
[trc
->wr_idx
];
40 if (trc
->wr_idx
== trc
->max_idx
)
43 if (trc
->wr_idx
!= trc
->rd_idx
) {
44 spin_unlock_irqrestore(&trc
->lock
, flags
);
50 if (trc
->rd_idx
== trc
->max_idx
)
53 td
->ts
= 0; /* Marker for checking the record, for complete data*/
54 spin_unlock_irqrestore(&trc
->lock
, flags
);
59 } /* end of snic_get_trc_buf */
62 * snic_fmt_trc_data : Formats trace data for printing.
65 snic_fmt_trc_data(struct snic_trc_data
*td
, char *buf
, int buf_sz
)
68 struct timespec64 tmspec
;
70 jiffies_to_timespec64(td
->ts
, &tmspec
);
72 len
+= snprintf(buf
, buf_sz
,
73 "%llu.%09lu %-25s %3d %4x %16llx %16llx %16llx %16llx %16llx\n",
79 td
->data
[0], td
->data
[1], td
->data
[2], td
->data
[3],
83 } /* end of snic_fmt_trc_data */
86 * snic_get_trc_data : Returns a formatted trace buffer.
89 snic_get_trc_data(char *buf
, int buf_sz
)
91 struct snic_trc_data
*td
= NULL
;
92 struct snic_trc
*trc
= &snic_glob
->trc
;
95 spin_lock_irqsave(&trc
->lock
, flags
);
96 if (trc
->rd_idx
== trc
->wr_idx
) {
97 spin_unlock_irqrestore(&trc
->lock
, flags
);
101 td
= &trc
->buf
[trc
->rd_idx
];
104 /* write in progress. */
105 spin_unlock_irqrestore(&trc
->lock
, flags
);
111 if (trc
->rd_idx
== trc
->max_idx
)
113 spin_unlock_irqrestore(&trc
->lock
, flags
);
115 return snic_fmt_trc_data(td
, buf
, buf_sz
);
116 } /* end of snic_get_trc_data */
119 * snic_trc_init() : Configures Trace Functionality for snic.
124 struct snic_trc
*trc
= &snic_glob
->trc
;
126 int tbuf_sz
= 0, ret
;
128 tbuf_sz
= (snic_trace_max_pages
* PAGE_SIZE
);
129 tbuf
= vzalloc(tbuf_sz
);
131 SNIC_ERR("Failed to Allocate Trace Buffer Size. %d\n", tbuf_sz
);
132 SNIC_ERR("Trace Facility not enabled.\n");
138 trc
->buf
= (struct snic_trc_data
*) tbuf
;
139 spin_lock_init(&trc
->lock
);
141 snic_trc_debugfs_init();
143 trc
->max_idx
= (tbuf_sz
/ SNIC_TRC_ENTRY_SZ
);
144 trc
->rd_idx
= trc
->wr_idx
= 0;
146 SNIC_INFO("Trace Facility Enabled.\n Trace Buffer SZ %lu Pages.\n",
147 tbuf_sz
/ PAGE_SIZE
);
151 } /* end of snic_trc_init */
154 * snic_trc_free : Releases the trace buffer and disables the tracing.
159 struct snic_trc
*trc
= &snic_glob
->trc
;
162 snic_trc_debugfs_term();
169 SNIC_INFO("Trace Facility Disabled.\n");
170 } /* end of snic_trc_free */