From patchwork Wed Aug 9 13:35:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 130041 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2DE1143018; Wed, 9 Aug 2023 15:36:37 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A79C343258; Wed, 9 Aug 2023 15:36:29 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id 4426D400D6 for ; Wed, 9 Aug 2023 15:36:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1691588187; x=1723124187; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=2WejG9xnvVD+18j9w4lea7/Rloks/gKwoWV3eC98Rd4=; b=l3gioPl3qfxBZfkkAcKydjchqv/GtkMa8Rume15NGJEGbmG+TDHdPvwV 9PxJn+sIjvKtw1+f/c+DNWhVmaweckSdewwjum1s4RIejvgV0nEpANCDL 1/HvUb29xsjvjkD4n+joCUmb8q6x3UtKIyyxrEUTYjlYL+GlLiNvrruSc RJxzX3tsh4dUMN7YxgdZdsEvsJPNgn4kVlIdVaVuICJFc3Yf+k0V7vgrK Q0dzbSYtLVyX4OKSvUcgycBh6CmGwdrta+3nXNF7fivxhQpf+C9al3JgJ GaFKVMbK1jBmIgkmu4HH/fDFonzY7wajy67ncAyucj6V4u2TfzxsBTDCy g==; X-IronPort-AV: E=McAfee;i="6600,9927,10795"; a="435015627" X-IronPort-AV: E=Sophos;i="6.01,159,1684825200"; d="scan'208";a="435015627" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Aug 2023 06:36:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.01,202,1684825200"; d="scan'208";a="875261475" Received: from silpixa00401385.ir.intel.com ([10.237.214.156]) by fmsmga001.fm.intel.com with ESMTP; 09 Aug 2023 06:36:07 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: david.marchand@redhat.com, Bruce Richardson , =?utf-8?q?Morten_Br=C3=B8rup?= , Tyler Retzlaff Subject: [PATCH v8 1/3] eal/windows: move fnmatch function to header file Date: Wed, 9 Aug 2023 14:35:51 +0100 Message-Id: <20230809133553.1396119-2-bruce.richardson@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230809133553.1396119-1-bruce.richardson@intel.com> References: <20220829151901.376754-1-bruce.richardson@intel.com> <20230809133553.1396119-1-bruce.richardson@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org To allow the fnmatch function to be shared between libraries, without having to export it into the public namespace (since it's not prefixed with "rte"), we can convert fnmatch.c to replace fnmatch.h. This allows fnmatch function to be static and limited in scope to the current file, preventing duplicate definitions if it is used by two libraries, while also not requiring export for sharing. Signed-off-by: Bruce Richardson Acked-by: Morten Brørup Acked-by: Tyler Retzlaff --- lib/eal/windows/fnmatch.c | 172 ------------------------------ lib/eal/windows/include/fnmatch.h | 169 ++++++++++++++++++++++++++--- lib/eal/windows/meson.build | 1 - 3 files changed, 156 insertions(+), 186 deletions(-) delete mode 100644 lib/eal/windows/fnmatch.c diff --git a/lib/eal/windows/fnmatch.c b/lib/eal/windows/fnmatch.c deleted file mode 100644 index f622bf54c5..0000000000 --- a/lib/eal/windows/fnmatch.c +++ /dev/null @@ -1,172 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause - * Copyright (c) 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Guido van Rossum. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; -#endif /* LIBC_SCCS and not lint */ - -/* - * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. - * Compares a filename or pathname to a pattern. - */ - -#include -#include -#include - -#include "fnmatch.h" - -#define EOS '\0' - -static const char *rangematch(const char *, char, int); - -int -fnmatch(const char *pattern, const char *string, int flags) -{ - const char *stringstart; - char c, test; - - for (stringstart = string;;) - switch (c = *pattern++) { - case EOS: - if ((flags & FNM_LEADING_DIR) && *string == '/') - return (0); - return (*string == EOS ? 0 : FNM_NOMATCH); - case '?': - if (*string == EOS) - return (FNM_NOMATCH); - if (*string == '/' && (flags & FNM_PATHNAME)) - return (FNM_NOMATCH); - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - ++string; - break; - case '*': - c = *pattern; - /* Collapse multiple stars. */ - while (c == '*') - c = *++pattern; - - if (*string == '.' && (flags & FNM_PERIOD) && - (string == stringstart || - ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) - return (FNM_NOMATCH); - - /* Optimize for pattern with * at end or before /. */ - if (c == EOS) - if (flags & FNM_PATHNAME) - return ((flags & FNM_LEADING_DIR) || - strchr(string, '/') == NULL ? - 0 : FNM_NOMATCH); - else - return (0); - else if (c == '/' && flags & FNM_PATHNAME) { - string = strchr(string, '/'); - if (string == NULL) - return (FNM_NOMATCH); - break; - } - - /* General case, use recursion. */ - while ((test = *string) != EOS) { - if (!fnmatch(pattern, string, - flags & ~FNM_PERIOD)) - return (0); - if (test == '/' && flags & FNM_PATHNAME) - break; - ++string; - } - return (FNM_NOMATCH); - case '[': - if (*string == EOS) - return (FNM_NOMATCH); - if (*string == '/' && flags & FNM_PATHNAME) - return (FNM_NOMATCH); - pattern = rangematch(pattern, *string, flags); - if (pattern == NULL) - return (FNM_NOMATCH); - ++string; - break; - case '\\': - if (!(flags & FNM_NOESCAPE)) { - c = *pattern++; - if (c == EOS) { - c = '\\'; - --pattern; - } - } - /* FALLTHROUGH */ - default: - if (c == *string) - ; - else if ((flags & FNM_CASEFOLD) && - (tolower((unsigned char)c) == - tolower((unsigned char)*string))) - ; - else if ((flags & FNM_PREFIX_DIRS) && *string == EOS && - ((c == '/' && string != stringstart) || - (string == stringstart+1 && *stringstart == '/'))) - return (0); - else - return (FNM_NOMATCH); - string++; - break; - } - /* NOTREACHED */ -} - -static const char * -rangematch(const char *pattern, char test, int flags) -{ - int negate, ok; - char c, c2; - - /* - * A bracket expression starting with an unquoted circumflex - * character produces unspecified results (IEEE 1003.2-1992, - * 3.13.2). This implementation treats it like '!', for - * consistency with the regular expression syntax. - * J.T. Conklin (conklin@ngai.kaleida.com) - */ - negate = (*pattern == '!' || *pattern == '^'); - if (negate) - ++pattern; - - if (flags & FNM_CASEFOLD) - test = tolower((unsigned char)test); - - for (ok = 0; (c = *pattern++) != ']';) { - if (c == '\\' && !(flags & FNM_NOESCAPE)) - c = *pattern++; - if (c == EOS) - return (NULL); - - if (flags & FNM_CASEFOLD) - c = tolower((unsigned char)c); - - c2 = *(pattern + 1); - if (*pattern == '-' && c2 != EOS && c2 != ']') { - pattern += 2; - if (c2 == '\\' && !(flags & FNM_NOESCAPE)) - c2 = *pattern++; - if (c2 == EOS) - return (NULL); - - if (flags & FNM_CASEFOLD) - c2 = tolower((unsigned char)c2); - - if ((unsigned char)c <= (unsigned char)test && - (unsigned char)test <= (unsigned char)c2) - ok = 1; - } else if (c == test) - ok = 1; - } - return (ok == negate ? NULL : pattern); -} diff --git a/lib/eal/windows/include/fnmatch.h b/lib/eal/windows/include/fnmatch.h index c6b226bd5d..c9fc14cbcf 100644 --- a/lib/eal/windows/include/fnmatch.h +++ b/lib/eal/windows/include/fnmatch.h @@ -1,20 +1,21 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2019 Intel Corporation + * Copyright (c) 1989, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Guido van Rossum. */ - #ifndef _FNMATCH_H_ #define _FNMATCH_H_ -/** - * This file is required to support the common code in eal_common_log.c - * as Microsoft libc does not contain fnmatch.h. This may be removed in - * future releases. +/* + * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. + * Compares a filename or pathname to a pattern. */ -#ifdef __cplusplus -extern "C" { -#endif -#include +#include +#include +#include #define FNM_NOMATCH 1 @@ -25,6 +26,57 @@ extern "C" { #define FNM_CASEFOLD 0x10 #define FNM_PREFIX_DIRS 0x20 +#define FNM_EOS '\0' + +static inline const char * +fnm_rangematch(const char *pattern, char test, int flags) +{ + int negate, ok; + char c, c2; + + /* + * A bracket expression starting with an unquoted circumflex + * character produces unspecified results (IEEE 1003.2-1992, + * 3.13.2). This implementation treats it like '!', for + * consistency with the regular expression syntax. + * J.T. Conklin (conklin@ngai.kaleida.com) + */ + negate = (*pattern == '!' || *pattern == '^'); + if (negate) + ++pattern; + + if (flags & FNM_CASEFOLD) + test = tolower((unsigned char)test); + + for (ok = 0; (c = *pattern++) != ']';) { + if (c == '\\' && !(flags & FNM_NOESCAPE)) + c = *pattern++; + if (c == FNM_EOS) + return (NULL); + + if (flags & FNM_CASEFOLD) + c = tolower((unsigned char)c); + + c2 = *(pattern + 1); + if (*pattern == '-' && c2 != FNM_EOS && c2 != ']') { + pattern += 2; + if (c2 == '\\' && !(flags & FNM_NOESCAPE)) + c2 = *pattern++; + if (c2 == FNM_EOS) + return (NULL); + + if (flags & FNM_CASEFOLD) + c2 = tolower((unsigned char)c2); + + if ((unsigned char)c <= (unsigned char)test && + (unsigned char)test <= (unsigned char)c2) + ok = 1; + } else if (c == test) + ok = 1; + } + return (ok == negate ? NULL : pattern); +} + /** * This function is used for searching a given string source * with the given regular expression pattern. @@ -41,10 +93,101 @@ extern "C" { * @return * if the pattern is found then return 0 or else FNM_NOMATCH */ -int fnmatch(const char *pattern, const char *string, int flags); +static inline int +fnmatch(const char *pattern, const char *string, int flags) +{ + const char *stringstart; + char c, test; + + for (stringstart = string;;) + switch (c = *pattern++) { + case FNM_EOS: + if ((flags & FNM_LEADING_DIR) && *string == '/') + return (0); + return (*string == FNM_EOS ? 0 : FNM_NOMATCH); + case '?': + if (*string == FNM_EOS) + return (FNM_NOMATCH); + if (*string == '/' && (flags & FNM_PATHNAME)) + return (FNM_NOMATCH); + if (*string == '.' && (flags & FNM_PERIOD) && + (string == stringstart || + ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) + return (FNM_NOMATCH); + ++string; + break; + case '*': + c = *pattern; + /* Collapse multiple stars. */ + while (c == '*') + c = *++pattern; + + if (*string == '.' && (flags & FNM_PERIOD) && + (string == stringstart || + ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) + return (FNM_NOMATCH); + + /* Optimize for pattern with * at end or before /. */ + if (c == FNM_EOS) + if (flags & FNM_PATHNAME) + return ((flags & FNM_LEADING_DIR) || + strchr(string, '/') == NULL ? + 0 : FNM_NOMATCH); + else + return (0); + else if (c == '/' && flags & FNM_PATHNAME) { + string = strchr(string, '/'); + if (string == NULL) + return (FNM_NOMATCH); + break; + } -#ifdef __cplusplus + /* General case, use recursion. */ + while ((test = *string) != FNM_EOS) { + if (!fnmatch(pattern, string, + flags & ~FNM_PERIOD)) + return (0); + if (test == '/' && flags & FNM_PATHNAME) + break; + ++string; + } + return (FNM_NOMATCH); + case '[': + if (*string == FNM_EOS) + return (FNM_NOMATCH); + if (*string == '/' && flags & FNM_PATHNAME) + return (FNM_NOMATCH); + pattern = fnm_rangematch(pattern, *string, flags); + if (pattern == NULL) + return (FNM_NOMATCH); + ++string; + break; + case '\\': + if (!(flags & FNM_NOESCAPE)) { + c = *pattern++; + if (c == FNM_EOS) { + c = '\\'; + --pattern; + } + } + /* FALLTHROUGH */ + default: + if (c == *string) + ; + else if ((flags & FNM_CASEFOLD) && + (tolower((unsigned char)c) == + tolower((unsigned char)*string))) + ; + else if ((flags & FNM_PREFIX_DIRS) && *string == FNM_EOS && + ((c == '/' && string != stringstart) || + (string == stringstart+1 && *stringstart == '/'))) + return (0); + else + return (FNM_NOMATCH); + string++; + break; + } + /* NOTREACHED */ } -#endif #endif /* _FNMATCH_H_ */ diff --git a/lib/eal/windows/meson.build b/lib/eal/windows/meson.build index 845e406ca1..e4b2427610 100644 --- a/lib/eal/windows/meson.build +++ b/lib/eal/windows/meson.build @@ -18,7 +18,6 @@ sources += files( 'eal_mp.c', 'eal_thread.c', 'eal_timer.c', - 'fnmatch.c', 'getopt.c', 'rte_thread.c', ) From patchwork Wed Aug 9 13:35:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 130042 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0168243018; Wed, 9 Aug 2023 15:36:44 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A5A1F4325C; Wed, 9 Aug 2023 15:36:31 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id 7E99643254 for ; Wed, 9 Aug 2023 15:36:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1691588189; x=1723124189; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=MEjc6czPeTlE8KjebvxPIjZYa4DZuZ6jg7xj3x2gVqQ=; b=YKvh5xGHHQawMv+ta1670MMjG6zdAp6MSOzxOLv2RyZ+Nu7KUDMjSa+O k6JsPBkyXPBMkqNwFcl0W9TRSG9dtBhcUOEZcgu2+1xcXjLFOTe0kh2n5 3OGYSrEV6c0g0aC+fpOnCyNtoRpuproJCCyUmTeMoTQyF+9nh9fp8VoNL b412SxlYa5oAF9f3eOqxmAQkAjuewTReKWsoEr9hbE0zAPG7O+/u7p7ZA FnHbx4yOwBrF9UT+0AhFNpkHZJ3C1XYJVYoJodEmRzyv79TxitcXEc9KZ RNB3DHZN06qCa/RHn9aTUwgU3I/2y6I/jDMlIFi619XFdB/3MjOQ6j4lQ A==; X-IronPort-AV: E=McAfee;i="6600,9927,10795"; a="435015661" X-IronPort-AV: E=Sophos;i="6.01,159,1684825200"; d="scan'208";a="435015661" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Aug 2023 06:36:08 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.01,202,1684825200"; d="scan'208";a="875261506" Received: from silpixa00401385.ir.intel.com ([10.237.214.156]) by fmsmga001.fm.intel.com with ESMTP; 09 Aug 2023 06:36:10 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: david.marchand@redhat.com, Bruce Richardson , =?utf-8?q?Morten_Br=C3=B8rup?= , Tyler Retzlaff Subject: [PATCH v8 2/3] log: separate logging functions out of EAL Date: Wed, 9 Aug 2023 14:35:52 +0100 Message-Id: <20230809133553.1396119-3-bruce.richardson@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230809133553.1396119-1-bruce.richardson@intel.com> References: <20220829151901.376754-1-bruce.richardson@intel.com> <20230809133553.1396119-1-bruce.richardson@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Move the logging capability to a separate library, free from EAL. Rename files as appropriate, and use meson.build to select the correct file to be built for each operating system, rather than having a subdir per-os. Add new documentation section in programmers guide to cover logging in more detail. Signed-off-by: Bruce Richardson Acked-by: Morten Brørup Acked-by: Tyler Retzlaff --- MAINTAINERS | 6 +- doc/api/doxy-api.conf.in | 1 + .../prog_guide/env_abstraction_layer.rst | 4 +- doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/log_lib.rst | 113 ++++++++++++++++++ lib/eal/common/eal_common_options.c | 2 +- lib/eal/common/eal_private.h | 7 -- lib/eal/common/meson.build | 1 - lib/eal/include/meson.build | 1 - lib/eal/linux/eal.c | 2 +- lib/eal/linux/meson.build | 1 - lib/eal/meson.build | 2 +- lib/eal/version.map | 17 --- lib/eal/windows/eal.c | 2 +- lib/eal/windows/meson.build | 1 - lib/kvargs/meson.build | 3 +- .../common/eal_common_log.c => log/log.c} | 7 +- lib/log/log_freebsd.c | 12 ++ .../common/eal_log.h => log/log_internal.h} | 18 ++- lib/{eal/linux/eal_log.c => log/log_linux.c} | 2 +- .../windows/eal_log.c => log/log_windows.c} | 2 +- lib/log/meson.build | 9 ++ lib/{eal/include => log}/rte_log.h | 0 lib/log/version.map | 34 ++++++ lib/meson.build | 1 + lib/telemetry/meson.build | 3 +- 26 files changed, 205 insertions(+), 47 deletions(-) create mode 100644 doc/guides/prog_guide/log_lib.rst rename lib/{eal/common/eal_common_log.c => log/log.c} (99%) create mode 100644 lib/log/log_freebsd.c rename lib/{eal/common/eal_log.h => log/log_internal.h} (69%) rename lib/{eal/linux/eal_log.c => log/log_linux.c} (97%) rename lib/{eal/windows/eal_log.c => log/log_windows.c} (93%) create mode 100644 lib/log/meson.build rename lib/{eal/include => log}/rte_log.h (100%) create mode 100644 lib/log/version.map diff --git a/MAINTAINERS b/MAINTAINERS index 6345e7f8a6..8c3f2c993f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -164,7 +164,6 @@ F: app/test/test_devargs.c F: app/test/test_eal* F: app/test/test_errno.c F: app/test/test_lcores.c -F: app/test/test_logs.c F: app/test/test_memcpy* F: app/test/test_per_lcore.c F: app/test/test_pflock.c @@ -177,6 +176,11 @@ F: app/test/test_tailq.c F: app/test/test_threads.c F: app/test/test_version.c +Logging +F: lib/log/ +F: doc/guides/prog_guide/log_lib.rst +F: app/test/test_logs.c + Trace - EXPERIMENTAL M: Jerin Jacob M: Sunil Kumar Kori diff --git a/doc/api/doxy-api.conf.in b/doc/api/doxy-api.conf.in index 31885039c7..a88accd907 100644 --- a/doc/api/doxy-api.conf.in +++ b/doc/api/doxy-api.conf.in @@ -50,6 +50,7 @@ INPUT = @TOPDIR@/doc/api/doxy-api-index.md \ @TOPDIR@/lib/jobstats \ @TOPDIR@/lib/kvargs \ @TOPDIR@/lib/latencystats \ + @TOPDIR@/lib/log \ @TOPDIR@/lib/lpm \ @TOPDIR@/lib/mbuf \ @TOPDIR@/lib/member \ diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst index 5d382fdd90..89014789de 100644 --- a/doc/guides/prog_guide/env_abstraction_layer.rst +++ b/doc/guides/prog_guide/env_abstraction_layer.rst @@ -443,9 +443,7 @@ Per-lcore variables are implemented using *Thread Local Storage* (TLS) to provid Logs ~~~~ -A logging API is provided by EAL. -By default, in a Linux application, logs are sent to syslog and also to the console. -However, the log function can be overridden by the user to use a different logging mechanism. +While originally part of EAL, DPDK logging functionality is now provided by the :doc:`log_lib`. Trace and Debug Functions ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst index 2c47d9d010..52a6d9e7aa 100644 --- a/doc/guides/prog_guide/index.rst +++ b/doc/guides/prog_guide/index.rst @@ -12,6 +12,7 @@ Programmer's Guide overview source_org env_abstraction_layer + log_lib service_cores trace_lib rcu_lib diff --git a/doc/guides/prog_guide/log_lib.rst b/doc/guides/prog_guide/log_lib.rst new file mode 100644 index 0000000000..19e295fc9b --- /dev/null +++ b/doc/guides/prog_guide/log_lib.rst @@ -0,0 +1,113 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2023 Intel Corporation. + +Log Library +=========== + +The DPDK Log library provides the logging functionality for other DPDK libraries and drivers. +By default, in a Linux application, logs are sent to syslog and also to the console. +On FreeBSD and Windows applications, logs are sent only to the console. +However, the log function can be overridden by the user to use a different logging mechanism. + +Log Levels +---------- + +Log messages from apps and libraries are reported with a given level of severity. +These levels, specified in ``rte_log.h`` are (from most to least important): + +#. Emergency +#. Alert +#. Critical +#. Error +#. Warning +#. Notice +#. Information +#. Debug + +At runtime, only messages of a configured level or above (i.e. of higher importance) +will be emitted by the application to the log output. +That level can be configured either by the application calling the relevant APIs from the logging library, +or by the user passing the ``--log-level`` parameter to the EAL via the application. + +Setting Global Log Level +~~~~~~~~~~~~~~~~~~~~~~~~ + +To adjust the global log level for an application, +just pass a numeric level or a level name to the ``--log-level`` EAL parameter. +For example:: + + /path/to/app --log-level=error + + /path/to/app --log-level=debug + + /path/to/app --log-level=5 # warning + +Within an application, the log level can be similarly set using the ``rte_log_set_global_level`` API. + +Setting Log Level for a Component +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In some cases, for example, for debugging purposes, +it may be desirable to increase or decrease the log level for only a specific component, or set of components. +To facilitate this, the ``--log-level`` argument also accepts an, optionally wildcarded, component name, +along with the desired level for that component. +For example:: + + /path/to/app --log-level=lib.eal:crit + + /path/to/app --log-level=lib.*:warning + +Within an application, the same result can be got using the ``rte_log_set_level_pattern()`` or ``rte_log_set_level_regex()`` APIs. + +Using Logging APIs to Generate Log Messages +------------------------------------------- + +To output log messages, ``rte_log()`` API function should be used. +As well as the log message, ``rte_log()`` takes two additional parameters: + +* The log level +* The log component type + +The log level is a numeric value as discussed above. +The component type is a unique id that identifies the particular DPDK component to the logging system. +To get this id, each component needs to register itself at startup, +using the macro ``RTE_LOG_REGISTER_DEFAULT``. +This macro takes two parameters, with the second being the default log level for the component. +The first parameter, called "type", the name of the "logtype", or "component type" variable used in the component. +This variable will be defined by the macro, and should be passed as the second parameter in calls to ``rte_log()``. +In general, most DPDK components define their own logging macros to simplify the calls to the log APIs. +They do this by: + +* Hiding the component type parameter inside the macro so it never needs to be passed explicitly. +* Using the log-level definitions given in ``rte_log.h`` to allow short textual names to be used in + place of the numeric log levels. + +The following code is taken from ``rte_dmadev.c`` and shows the log registration, +and subsequent definition of a shortcut logging macro. +It can be used as a template for any new components using DPDK logging. + +.. code:: C + + RTE_LOG_REGISTER_DEFAULT(rte_dma_logtype, INFO); + #define RTE_DMA_LOG(level, ...) \ + rte_log(RTE_LOG_ ## level, rte_dma_logtype, RTE_FMT("dma: " \ + RTE_FMT_HEAD(__VA_ARGS__,) "\n", RTE_FMT_TAIL(__VA_ARGS__,))) + +.. note:: + + Because the log registration macro provides the logtype variable definition, + it should be placed near the top of the C file using it. + If not, the logtype variable should be defined as an "extern int" near the top of the file. + + Similarly, if logging is to be done by multiple files in a component, + only one file should register the logtype via the macro, + and the logtype should be defined as an "extern int" in a common header file. + Any component-specific logging macro should similarly be defined in that header. + +Throughout the dmadev library, all logging calls are therefore of the form: + +.. code:: C + + RTE_DMA_LOG(ERR, "Name can't be NULL"); + + RTE_DMA_LOG(WARNING, "Device %d already started", dev_id); diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c index 062f1d8d9c..d74b581567 100644 --- a/lib/eal/common/eal_common_options.c +++ b/lib/eal/common/eal_common_options.c @@ -39,7 +39,7 @@ #include "eal_options.h" #include "eal_filesystem.h" #include "eal_private.h" -#include "eal_log.h" +#include "log_internal.h" #ifndef RTE_EXEC_ENV_WINDOWS #include "eal_trace.h" #endif diff --git a/lib/eal/common/eal_private.h b/lib/eal/common/eal_private.h index d7f83776c1..5eadba4902 100644 --- a/lib/eal/common/eal_private.h +++ b/lib/eal/common/eal_private.h @@ -152,13 +152,6 @@ int rte_eal_tailqs_init(void); */ int rte_eal_intr_init(void); -/** - * Close the default log stream - * - * This function is private to EAL. - */ -void rte_eal_log_cleanup(void); - /** * Init alarm mechanism. This is to allow a callback be called after * specific time. diff --git a/lib/eal/common/meson.build b/lib/eal/common/meson.build index 917758cc65..22a626ba6f 100644 --- a/lib/eal/common/meson.build +++ b/lib/eal/common/meson.build @@ -18,7 +18,6 @@ sources += files( 'eal_common_interrupts.c', 'eal_common_launch.c', 'eal_common_lcore.c', - 'eal_common_log.c', 'eal_common_mcfg.c', 'eal_common_memalloc.c', 'eal_common_memory.c', diff --git a/lib/eal/include/meson.build b/lib/eal/include/meson.build index b0db9b3b3a..a0463efac7 100644 --- a/lib/eal/include/meson.build +++ b/lib/eal/include/meson.build @@ -28,7 +28,6 @@ headers += files( 'rte_launch.h', 'rte_lcore.h', 'rte_lock_annotations.h', - 'rte_log.h', 'rte_malloc.h', 'rte_mcslock.h', 'rte_memory.h', diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index a1fefcd9d8..477ad03d38 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -50,10 +50,10 @@ #include "eal_hugepages.h" #include "eal_memcfg.h" #include "eal_trace.h" -#include "eal_log.h" #include "eal_options.h" #include "eal_vfio.h" #include "hotplug_mp.h" +#include "log_internal.h" #define MEMSIZE_IF_NO_HUGE_PAGE (64ULL * 1024ULL * 1024ULL) diff --git a/lib/eal/linux/meson.build b/lib/eal/linux/meson.build index 5af456db9e..e99ebed256 100644 --- a/lib/eal/linux/meson.build +++ b/lib/eal/linux/meson.build @@ -11,7 +11,6 @@ sources += files( 'eal_hugepage_info.c', 'eal_interrupts.c', 'eal_lcore.c', - 'eal_log.c', 'eal_memalloc.c', 'eal_memory.c', 'eal_thread.c', diff --git a/lib/eal/meson.build b/lib/eal/meson.build index 9aa941a5ae..0fb974c78b 100644 --- a/lib/eal/meson.build +++ b/lib/eal/meson.build @@ -22,7 +22,7 @@ subdir(exec_env) subdir(arch_subdir) -deps += ['kvargs'] +deps += ['log', 'kvargs'] if not is_windows deps += ['telemetry'] endif diff --git a/lib/eal/version.map b/lib/eal/version.map index bdb98cf479..7940431e5a 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -140,21 +140,6 @@ DPDK_24 { rte_lcore_iterate; rte_lcore_to_cpu_id; rte_lcore_to_socket_id; - rte_log; - rte_log_can_log; - rte_log_cur_msg_loglevel; - rte_log_cur_msg_logtype; - rte_log_dump; - rte_log_get_global_level; - rte_log_get_level; - rte_log_get_stream; - rte_log_list_types; - rte_log_register; - rte_log_register_type_and_pick_level; - rte_log_set_global_level; - rte_log_set_level; - rte_log_set_level_pattern; - rte_log_set_level_regexp; rte_malloc; rte_malloc_dump_heaps; rte_malloc_dump_stats; @@ -225,7 +210,6 @@ DPDK_24 { rte_mp_request_async; rte_mp_request_sync; rte_mp_sendmsg; - rte_openlog_stream; rte_rand; rte_rand_max; rte_realloc; @@ -299,7 +283,6 @@ DPDK_24 { rte_vfio_noiommu_is_enabled; # WINDOWS_NO_EXPORT rte_vfio_release_device; # WINDOWS_NO_EXPORT rte_vfio_setup_device; # WINDOWS_NO_EXPORT - rte_vlog; rte_zmalloc; rte_zmalloc_socket; diff --git a/lib/eal/windows/eal.c b/lib/eal/windows/eal.c index 096cb98d1c..22dc7f6ee1 100644 --- a/lib/eal/windows/eal.c +++ b/lib/eal/windows/eal.c @@ -27,8 +27,8 @@ #include "eal_firmware.h" #include "eal_hugepages.h" #include "eal_trace.h" -#include "eal_log.h" #include "eal_windows.h" +#include "log_internal.h" #define MEMSIZE_IF_NO_HUGE_PAGE (64ULL * 1024ULL * 1024ULL) diff --git a/lib/eal/windows/meson.build b/lib/eal/windows/meson.build index e4b2427610..7756d417be 100644 --- a/lib/eal/windows/meson.build +++ b/lib/eal/windows/meson.build @@ -12,7 +12,6 @@ sources += files( 'eal_hugepages.c', 'eal_interrupts.c', 'eal_lcore.c', - 'eal_log.c', 'eal_memalloc.c', 'eal_memory.c', 'eal_mp.c', diff --git a/lib/kvargs/meson.build b/lib/kvargs/meson.build index b746516965..7eae744a8f 100644 --- a/lib/kvargs/meson.build +++ b/lib/kvargs/meson.build @@ -1,7 +1,6 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2017 Intel Corporation -includes = [global_inc] - +deps += 'log' sources = files('rte_kvargs.c') headers = files('rte_kvargs.h') diff --git a/lib/eal/common/eal_common_log.c b/lib/log/log.c similarity index 99% rename from lib/eal/common/eal_common_log.c rename to lib/log/log.c index 0a1d219d69..52c771fb6b 100644 --- a/lib/eal/common/eal_common_log.c +++ b/lib/log/log.c @@ -15,8 +15,11 @@ #include #include -#include "eal_log.h" -#include "eal_private.h" +#include "log_internal.h" + +#ifdef RTE_EXEC_ENV_WINDOWS +#define strdup _strdup +#endif struct rte_log_dynamic_type { const char *name; diff --git a/lib/log/log_freebsd.c b/lib/log/log_freebsd.c new file mode 100644 index 0000000000..698d3c5423 --- /dev/null +++ b/lib/log/log_freebsd.c @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2023 Intel Corporation + */ + +#include +#include "log_internal.h" + +int +eal_log_init(__rte_unused const char *id, __rte_unused int facility) +{ + return 0; +} diff --git a/lib/eal/common/eal_log.h b/lib/log/log_internal.h similarity index 69% rename from lib/eal/common/eal_log.h rename to lib/log/log_internal.h index c784fa6043..20d6313898 100644 --- a/lib/eal/common/eal_log.h +++ b/lib/log/log_internal.h @@ -2,31 +2,43 @@ * Copyright 2021 Mellanox Technologies, Ltd */ -#ifndef EAL_LOG_H -#define EAL_LOG_H +#ifndef LOG_INTERNAL_H +#define LOG_INTERNAL_H #include #include +#include /* * Initialize the default log stream. */ +__rte_internal int eal_log_init(const char *id, int facility); /* * Determine where log data is written when no call to rte_openlog_stream. */ +__rte_internal void eal_log_set_default(FILE *default_log); /* * Save a log option for later. */ +__rte_internal int eal_log_save_regexp(const char *regexp, uint32_t level); +__rte_internal int eal_log_save_pattern(const char *pattern, uint32_t level); /* * Convert log level to string. */ +__rte_internal const char *eal_log_level2str(uint32_t level); -#endif /* EAL_LOG_H */ +/* + * Close the default log stream + */ +__rte_internal +void rte_eal_log_cleanup(void); + +#endif /* LOG_INTERNAL_H */ diff --git a/lib/eal/linux/eal_log.c b/lib/log/log_linux.c similarity index 97% rename from lib/eal/linux/eal_log.c rename to lib/log/log_linux.c index d44416fd65..2dfb0c974b 100644 --- a/lib/eal/linux/eal_log.c +++ b/lib/log/log_linux.c @@ -8,7 +8,7 @@ #include -#include "eal_log.h" +#include "log_internal.h" /* * default log function diff --git a/lib/eal/windows/eal_log.c b/lib/log/log_windows.c similarity index 93% rename from lib/eal/windows/eal_log.c rename to lib/log/log_windows.c index d4ea47f1c8..a6a0889550 100644 --- a/lib/eal/windows/eal_log.c +++ b/lib/log/log_windows.c @@ -4,7 +4,7 @@ #include #include -#include "eal_log.h" +#include "log_internal.h" /* set the log to default function, called during eal init process. */ int diff --git a/lib/log/meson.build b/lib/log/meson.build new file mode 100644 index 0000000000..545cdb8084 --- /dev/null +++ b/lib/log/meson.build @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2022 Intel Corporation + +includes += global_inc +sources = files( + 'log.c', + 'log_' + exec_env + '.c', +) +headers = files('rte_log.h') diff --git a/lib/eal/include/rte_log.h b/lib/log/rte_log.h similarity index 100% rename from lib/eal/include/rte_log.h rename to lib/log/rte_log.h diff --git a/lib/log/version.map b/lib/log/version.map new file mode 100644 index 0000000000..0648f8831a --- /dev/null +++ b/lib/log/version.map @@ -0,0 +1,34 @@ +DPDK_24 { + global: + + rte_log; + rte_log_cur_msg_loglevel; + rte_log_cur_msg_logtype; + rte_log_can_log; + rte_log_dump; + rte_log_get_global_level; + rte_log_get_level; + rte_log_get_stream; + rte_log_list_types; + rte_log_register; + rte_log_register_type_and_pick_level; + rte_log_set_global_level; + rte_log_set_level; + rte_log_set_level_pattern; + rte_log_set_level_regexp; + rte_openlog_stream; + rte_vlog; + + local: *; +}; + +INTERNAL { + global: + + eal_log_init; + eal_log_level2str; + eal_log_save_pattern; + eal_log_save_regexp; + eal_log_set_default; + rte_eal_log_cleanup; +}; diff --git a/lib/meson.build b/lib/meson.build index bbfa28ba86..92cbd6bb66 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -9,6 +9,7 @@ # given as a dep, no need to mention ring. This is especially true for the # core libs which are widely reused, so their deps are kept to a minimum. libraries = [ + 'log', 'kvargs', # eal depends on kvargs 'telemetry', # basic info querying 'eal', # everything depends on eal diff --git a/lib/telemetry/meson.build b/lib/telemetry/meson.build index f84c9aa3be..489d000047 100644 --- a/lib/telemetry/meson.build +++ b/lib/telemetry/meson.build @@ -1,8 +1,7 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2018 Intel Corporation -includes = [global_inc] - +deps += 'log' sources = files('telemetry.c', 'telemetry_data.c', 'telemetry_legacy.c') headers = files('rte_telemetry.h') includes += include_directories('../metrics') From patchwork Wed Aug 9 13:35:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 130043 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D067643018; Wed, 9 Aug 2023 15:36:53 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2A0D541151; Wed, 9 Aug 2023 15:36:37 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id A04BB40DFB for ; Wed, 9 Aug 2023 15:36:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1691588195; x=1723124195; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=9u5Xav9/VDLpmSonCrUEBIKeoyUq3j3n1p5Zajo+UJQ=; b=buQqBGwscwllq2Tr18MgZzQPeanTQKPl2vT8ZDN+dIB0jnRxy032AlLY kPgVmi7xTFpJqo9RCzzpyEKHAjs7GrT52Q6MfNTVqCuGdQq0b3H0pXK1v pAqY6UldiIKYwcg2C5AZmxGzdBC39knylDSlHkdF6zl7HvE2KV7wajSIF u9ztWDApgvAEHBglBQfzBTM1Y71jtLrfIngOYM5AFJQ6cme+lTLzdM97F X7vg9I7ISFnWRTEi5xSID4p+zKXoujRCmyACoIZAeeePM9mKmlAv1J1dw j+xLMYj3aGz5bNPOW3sWVjwyHRiAiLqxyixH8ayMuCBF+Ap50O6HAJSDr w==; X-IronPort-AV: E=McAfee;i="6600,9927,10795"; a="435015708" X-IronPort-AV: E=Sophos;i="6.01,159,1684825200"; d="scan'208";a="435015708" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Aug 2023 06:36:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.01,202,1684825200"; d="scan'208";a="875261571" Received: from silpixa00401385.ir.intel.com ([10.237.214.156]) by fmsmga001.fm.intel.com with ESMTP; 09 Aug 2023 06:36:14 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: david.marchand@redhat.com, Bruce Richardson , =?utf-8?q?Morten_Br=C3=B8rup?= , Tyler Retzlaff Subject: [PATCH v8 3/3] telemetry: use standard logging Date: Wed, 9 Aug 2023 14:35:53 +0100 Message-Id: <20230809133553.1396119-4-bruce.richardson@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230809133553.1396119-1-bruce.richardson@intel.com> References: <20220829151901.376754-1-bruce.richardson@intel.com> <20230809133553.1396119-1-bruce.richardson@intel.com> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Now that logging is moved out of EAL, we don't need injection of the logtype and logging function from EAL to telemetry library, simplifying things. Signed-off-by: Bruce Richardson Acked-by: Morten Brørup Acked-by: Tyler Retzlaff --- lib/eal/freebsd/eal.c | 6 +----- lib/eal/linux/eal.c | 6 +----- lib/telemetry/telemetry.c | 11 +++-------- lib/telemetry/telemetry_internal.h | 3 +-- 4 files changed, 6 insertions(+), 20 deletions(-) diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c index dfe973e6fd..0175d89e4b 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -898,13 +898,9 @@ rte_eal_init(int argc, char **argv) return -1; } if (rte_eal_process_type() == RTE_PROC_PRIMARY && !internal_conf->no_telemetry) { - int tlog = rte_log_register_type_and_pick_level( - "lib.telemetry", RTE_LOG_WARNING); - if (tlog < 0) - tlog = RTE_LOGTYPE_EAL; if (rte_telemetry_init(rte_eal_get_runtime_dir(), rte_version(), - &internal_conf->ctrl_cpuset, rte_log, tlog) != 0) + &internal_conf->ctrl_cpuset) != 0) return -1; } diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c index 477ad03d38..ed50576d99 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -1314,13 +1314,9 @@ rte_eal_init(int argc, char **argv) return -1; } if (rte_eal_process_type() == RTE_PROC_PRIMARY && !internal_conf->no_telemetry) { - int tlog = rte_log_register_type_and_pick_level( - "lib.telemetry", RTE_LOG_WARNING); - if (tlog < 0) - tlog = RTE_LOGTYPE_EAL; if (rte_telemetry_init(rte_eal_get_runtime_dir(), rte_version(), - &internal_conf->ctrl_cpuset, rte_log, tlog) != 0) + &internal_conf->ctrl_cpuset) != 0) return -1; } diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c index 590720bfa6..7d0488a6d7 100644 --- a/lib/telemetry/telemetry.c +++ b/lib/telemetry/telemetry.c @@ -54,11 +54,9 @@ static struct socket v1_socket; /* socket for v1 telemetry */ static const char *telemetry_version; /* save rte_version */ static const char *socket_dir; /* runtime directory */ static rte_cpuset_t *thread_cpuset; -static rte_log_fn rte_log_ptr; -static uint32_t logtype; -#define TMTY_LOG(l, ...) \ - rte_log_ptr(RTE_LOG_ ## l, logtype, "TELEMETRY: " __VA_ARGS__) +RTE_LOG_REGISTER_DEFAULT(logtype, WARNING); +#define TMTY_LOG(l, ...) rte_log(RTE_LOG_ ## l, logtype, "TELEMETRY: " __VA_ARGS__) /* list of command callbacks, with one command registered by default */ static struct cmd_callback *callbacks; @@ -627,14 +625,11 @@ telemetry_v2_init(void) #endif /* !RTE_EXEC_ENV_WINDOWS */ int32_t -rte_telemetry_init(const char *runtime_dir, const char *rte_version, rte_cpuset_t *cpuset, - rte_log_fn log_fn, uint32_t registered_logtype) +rte_telemetry_init(const char *runtime_dir, const char *rte_version, rte_cpuset_t *cpuset) { telemetry_version = rte_version; socket_dir = runtime_dir; thread_cpuset = cpuset; - rte_log_ptr = log_fn; - logtype = registered_logtype; #ifndef RTE_EXEC_ENV_WINDOWS if (telemetry_v2_init() != 0) diff --git a/lib/telemetry/telemetry_internal.h b/lib/telemetry/telemetry_internal.h index 80e2bd3a49..b331e9458f 100644 --- a/lib/telemetry/telemetry_internal.h +++ b/lib/telemetry/telemetry_internal.h @@ -108,7 +108,6 @@ typedef int (*rte_log_fn)(uint32_t level, uint32_t logtype, const char *format, */ __rte_internal int -rte_telemetry_init(const char *runtime_dir, const char *rte_version, rte_cpuset_t *cpuset, - rte_log_fn log_fn, uint32_t registered_logtype); +rte_telemetry_init(const char *runtime_dir, const char *rte_version, rte_cpuset_t *cpuset); #endif