]>
git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/dpdk/lib/librte_eal/common/eal_common_log.c
4 * Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * * Neither the name of Intel Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44 #include <rte_per_lcore.h>
46 #include "eal_private.h"
48 /* global log structure */
49 struct rte_logs rte_logs
= {
51 .level
= RTE_LOG_DEBUG
,
55 /* Stream to use for logging if rte_logs.file is NULL */
56 static FILE *default_log_stream
;
59 * This global structure stores some informations about the message
60 * that is currently being processed by one lcore
63 uint32_t loglevel
; /**< log level - see rte_log.h */
64 uint32_t logtype
; /**< log type - see rte_log.h */
67 struct rte_log_dynamic_type
{
73 static RTE_DEFINE_PER_LCORE(struct log_cur_msg
, log_cur_msg
);
77 /* Change the stream that will be used by logging system */
79 rte_openlog_stream(FILE *f
)
85 /* Set global log level */
87 rte_log_set_global_level(uint32_t level
)
89 rte_logs
.level
= (uint32_t)level
;
92 /* Set global log level */
93 /* replaced by rte_log_set_global_level */
95 rte_set_log_level(uint32_t level
)
97 rte_log_set_global_level(level
);
100 /* Get global log level */
102 rte_log_get_global_level(void)
104 return rte_logs
.level
;
107 /* Get global log level */
108 /* replaced by rte_log_get_global_level */
110 rte_get_log_level(void)
112 return rte_log_get_global_level();
115 /* Set global log type */
116 __rte_deprecated
void
117 rte_set_log_type(uint32_t type
, int enable
)
119 if (type
< RTE_LOGTYPE_FIRST_EXT_ID
) {
121 rte_logs
.type
|= 1 << type
;
123 rte_logs
.type
&= ~(1 << type
);
127 rte_log_set_level(type
, 0);
129 rte_log_set_level(type
, RTE_LOG_DEBUG
);
132 /* Get global log type */
133 __rte_deprecated
uint32_t
134 rte_get_log_type(void)
136 return rte_logs
.type
;
140 rte_log_set_level(uint32_t type
, uint32_t level
)
142 if (type
>= rte_logs
.dynamic_types_len
)
144 if (level
> RTE_LOG_DEBUG
)
147 rte_logs
.dynamic_types
[type
].loglevel
= level
;
154 rte_log_set_level_regexp(const char *pattern
, uint32_t level
)
159 if (level
> RTE_LOG_DEBUG
)
162 if (regcomp(&r
, pattern
, 0) != 0)
165 for (i
= 0; i
< rte_logs
.dynamic_types_len
; i
++) {
166 if (rte_logs
.dynamic_types
[i
].name
== NULL
)
168 if (regexec(&r
, rte_logs
.dynamic_types
[i
].name
, 0,
170 rte_logs
.dynamic_types
[i
].loglevel
= level
;
176 /* get the current loglevel for the message beeing processed */
177 int rte_log_cur_msg_loglevel(void)
179 return RTE_PER_LCORE(log_cur_msg
).loglevel
;
182 /* get the current logtype for the message beeing processed */
183 int rte_log_cur_msg_logtype(void)
185 return RTE_PER_LCORE(log_cur_msg
).logtype
;
189 rte_log_lookup(const char *name
)
193 for (i
= 0; i
< rte_logs
.dynamic_types_len
; i
++) {
194 if (rte_logs
.dynamic_types
[i
].name
== NULL
)
196 if (strcmp(name
, rte_logs
.dynamic_types
[i
].name
) == 0)
203 /* register an extended log type, assuming table is large enough, and id
204 * is not yet registered.
207 __rte_log_register(const char *name
, int id
)
209 char *dup_name
= strdup(name
);
211 if (dup_name
== NULL
)
214 rte_logs
.dynamic_types
[id
].name
= dup_name
;
215 rte_logs
.dynamic_types
[id
].loglevel
= RTE_LOG_DEBUG
;
220 /* register an extended log type */
222 rte_log_register(const char *name
)
224 struct rte_log_dynamic_type
*new_dynamic_types
;
227 id
= rte_log_lookup(name
);
231 new_dynamic_types
= realloc(rte_logs
.dynamic_types
,
232 sizeof(struct rte_log_dynamic_type
) *
233 (rte_logs
.dynamic_types_len
+ 1));
234 if (new_dynamic_types
== NULL
)
236 rte_logs
.dynamic_types
= new_dynamic_types
;
238 ret
= __rte_log_register(name
, rte_logs
.dynamic_types_len
);
242 rte_logs
.dynamic_types_len
++;
252 static const struct logtype logtype_strings
[] = {
253 {RTE_LOGTYPE_EAL
, "eal"},
254 {RTE_LOGTYPE_MALLOC
, "malloc"},
255 {RTE_LOGTYPE_RING
, "ring"},
256 {RTE_LOGTYPE_MEMPOOL
, "mempool"},
257 {RTE_LOGTYPE_TIMER
, "timer"},
258 {RTE_LOGTYPE_PMD
, "pmd"},
259 {RTE_LOGTYPE_HASH
, "hash"},
260 {RTE_LOGTYPE_LPM
, "lpm"},
261 {RTE_LOGTYPE_KNI
, "kni"},
262 {RTE_LOGTYPE_ACL
, "acl"},
263 {RTE_LOGTYPE_POWER
, "power"},
264 {RTE_LOGTYPE_METER
, "meter"},
265 {RTE_LOGTYPE_SCHED
, "sched"},
266 {RTE_LOGTYPE_PORT
, "port"},
267 {RTE_LOGTYPE_TABLE
, "table"},
268 {RTE_LOGTYPE_PIPELINE
, "pipeline"},
269 {RTE_LOGTYPE_MBUF
, "mbuf"},
270 {RTE_LOGTYPE_CRYPTODEV
, "cryptodev"},
271 {RTE_LOGTYPE_EFD
, "efd"},
272 {RTE_LOGTYPE_EVENTDEV
, "eventdev"},
273 {RTE_LOGTYPE_USER1
, "user1"},
274 {RTE_LOGTYPE_USER2
, "user2"},
275 {RTE_LOGTYPE_USER3
, "user3"},
276 {RTE_LOGTYPE_USER4
, "user4"},
277 {RTE_LOGTYPE_USER5
, "user5"},
278 {RTE_LOGTYPE_USER6
, "user6"},
279 {RTE_LOGTYPE_USER7
, "user7"},
280 {RTE_LOGTYPE_USER8
, "user8"}
283 RTE_INIT(rte_log_init
);
289 #if RTE_LOG_LEVEL >= RTE_LOG_DEBUG
290 rte_log_set_global_level(RTE_LOG_INFO
);
292 rte_log_set_global_level(RTE_LOG_LEVEL
);
295 rte_logs
.dynamic_types
= calloc(RTE_LOGTYPE_FIRST_EXT_ID
,
296 sizeof(struct rte_log_dynamic_type
));
297 if (rte_logs
.dynamic_types
== NULL
)
300 /* register legacy log types */
301 for (i
= 0; i
< RTE_DIM(logtype_strings
); i
++)
302 __rte_log_register(logtype_strings
[i
].logtype
,
303 logtype_strings
[i
].log_id
);
305 rte_logs
.dynamic_types_len
= RTE_LOGTYPE_FIRST_EXT_ID
;
309 loglevel_to_string(uint32_t level
)
312 case 0: return "disabled";
313 case RTE_LOG_EMERG
: return "emerg";
314 case RTE_LOG_ALERT
: return "alert";
315 case RTE_LOG_CRIT
: return "critical";
316 case RTE_LOG_ERR
: return "error";
317 case RTE_LOG_WARNING
: return "warning";
318 case RTE_LOG_NOTICE
: return "notice";
319 case RTE_LOG_INFO
: return "info";
320 case RTE_LOG_DEBUG
: return "debug";
321 default: return "unknown";
325 /* dump global level and registered log types */
327 rte_log_dump(FILE *f
)
331 fprintf(f
, "global log level is %s\n",
332 loglevel_to_string(rte_log_get_global_level()));
334 for (i
= 0; i
< rte_logs
.dynamic_types_len
; i
++) {
335 if (rte_logs
.dynamic_types
[i
].name
== NULL
)
337 fprintf(f
, "id %zu: %s, level is %s\n",
338 i
, rte_logs
.dynamic_types
[i
].name
,
339 loglevel_to_string(rte_logs
.dynamic_types
[i
].loglevel
));
344 * Generates a log message The message will be sent in the stream
345 * defined by the previous call to rte_openlog_stream().
348 rte_vlog(uint32_t level
, uint32_t logtype
, const char *format
, va_list ap
)
351 FILE *f
= rte_logs
.file
;
353 f
= default_log_stream
;
356 * Grab the current value of stderr here, rather than
357 * just initializing default_log_stream to stderr. This
358 * ensures that we will always use the current value
359 * of stderr, even if the application closes and
366 if (level
> rte_logs
.level
)
368 if (logtype
>= rte_logs
.dynamic_types_len
)
370 if (level
> rte_logs
.dynamic_types
[logtype
].loglevel
)
373 /* save loglevel and logtype in a global per-lcore variable */
374 RTE_PER_LCORE(log_cur_msg
).loglevel
= level
;
375 RTE_PER_LCORE(log_cur_msg
).logtype
= logtype
;
377 ret
= vfprintf(f
, format
, ap
);
383 * Generates a log message The message will be sent in the stream
384 * defined by the previous call to rte_openlog_stream().
385 * No need to check level here, done by rte_vlog().
388 rte_log(uint32_t level
, uint32_t logtype
, const char *format
, ...)
393 va_start(ap
, format
);
394 ret
= rte_vlog(level
, logtype
, format
, ap
);
400 * Called by environment-specific initialization functions.
403 eal_log_set_default(FILE *default_log
)
405 default_log_stream
= default_log
;
407 #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
409 "Debug dataplane logs available - lower performance\n");