From patchwork Thu May 18 12:49:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 126990 X-Patchwork-Delegate: thomas@monjalon.net 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 065CD42B3A; Thu, 18 May 2023 14:50:07 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 32DCA42B8B; Thu, 18 May 2023 14:50:03 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id 9FFCA4282D for ; Thu, 18 May 2023 14:50:01 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1684414201; x=1715950201; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=2J4s+IIoSLpy3yfrtLwrW9WcalDfNGq/PhBZljP+R94=; b=UZJXclOQsdKDYkjTWrJx/5401Tn+RcDqlyXJYgAaLKU3AyXwuFfL5i4d kW1aMI3xn+1CnzT9NCY5sPn+wP3izBhKFcHfsa8mixO2IN5n9Fgj0wX14 9MoqeWH1pQJ2eTpu21P5fkp0No0pW/Cmrdz80t49Oj1OLgDwWz6HVk+c8 MJdps4xbKUy5nS/wtY//l8FvAfZDKCPv4fU75+/7ScKiWBDZa6im9b7xn F31AEcegFWmrUKd2nt78eSbj/x5zxJ93fTYy6GPNiEFSqydcMrCw6Tlbi pWTWZvpIz8I4VMFBrt4MuntbzWwB69FfuRjc0LRgRW2Co/CIOqXmGpnBq A==; X-IronPort-AV: E=McAfee;i="6600,9927,10713"; a="380259871" X-IronPort-AV: E=Sophos;i="5.99,285,1677571200"; d="scan'208";a="380259871" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 May 2023 05:50:01 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10713"; a="705187632" X-IronPort-AV: E=Sophos;i="5.99,285,1677571200"; d="scan'208";a="705187632" Received: from silpixa00401385.ir.intel.com ([10.237.214.44]) by fmsmga007.fm.intel.com with ESMTP; 18 May 2023 05:49:59 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Bruce Richardson , =?utf-8?q?Morten_Br=C3=B8?= =?utf-8?q?rup?= , Tyler Retzlaff Subject: [PATCH v5 1/3] eal/windows: move fnmatch function to header file Date: Thu, 18 May 2023 13:49:47 +0100 Message-Id: <20230518124949.879834-2-bruce.richardson@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230518124949.879834-1-bruce.richardson@intel.com> References: <20220829151901.376754-1-bruce.richardson@intel.com> <20230518124949.879834-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 | 175 +++++++++++++++++++++++++++--- lib/eal/windows/meson.build | 1 - 3 files changed, 162 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..fbf1eef21c 100644 --- a/lib/eal/windows/include/fnmatch.h +++ b/lib/eal/windows/include/fnmatch.h @@ -1,20 +1,25 @@ /* 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. +#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. */ -#ifdef __cplusplus -extern "C" { -#endif -#include +#include +#include +#include #define FNM_NOMATCH 1 @@ -25,6 +30,10 @@ extern "C" { #define FNM_CASEFOLD 0x10 #define FNM_PREFIX_DIRS 0x20 +#define FNM_EOS '\0' + +static const char *fnm_rangematch(const char *, char, int); + /** * This function is used for searching a given string source * with the given regular expression pattern. @@ -41,10 +50,150 @@ 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 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; + } + + /* 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 */ +} + +static 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); -#ifdef __cplusplus + 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); } -#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 Thu May 18 12:49:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 126991 X-Patchwork-Delegate: thomas@monjalon.net 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 01D0D42B3A; Thu, 18 May 2023 14:50:15 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5415442D17; Thu, 18 May 2023 14:50:07 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id 1A25742D16 for ; Thu, 18 May 2023 14:50:04 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1684414205; x=1715950205; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ELRqjKxQPJPhripyIGLe8YLDj2X2ZFDMNXXcW8PnQ2o=; b=Qt1SVfWb2Xi47xUuDx5iXsuPnttCm1S8rY5mALiogCTeOiAgfV68CEEF ZpAttff1H4xBMhA4Cu3F71zT6e+f65IeUtUNRbnWRkR+q1o2evdEdHnO9 +joEGCEVDMiS9lBF3tWYHNplx5uvIYFmDRTgh/P6xaxIccOP2haGnefzj zNctylmKghbUfNLCOE/RbQFOWxYZZtTsIyiB/QTOLn2M3t9inJe042BWf XopMmaciazm56uippO+Laoa/atDIQAYUwkz+ZMHU+wjC5/nMWMgVfMOXW GzZaSUGxmRzYTAoahnVIiZPjr2XwRyaRVWlcrSa5B1fc/HvhYFq+cooav A==; X-IronPort-AV: E=McAfee;i="6600,9927,10713"; a="380259885" X-IronPort-AV: E=Sophos;i="5.99,285,1677571200"; d="scan'208";a="380259885" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 May 2023 05:50:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10713"; a="705187652" X-IronPort-AV: E=Sophos;i="5.99,285,1677571200"; d="scan'208";a="705187652" Received: from silpixa00401385.ir.intel.com ([10.237.214.44]) by fmsmga007.fm.intel.com with ESMTP; 18 May 2023 05:50:03 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Bruce Richardson , =?utf-8?q?Morten_Br=C3=B8?= =?utf-8?q?rup?= , Tyler Retzlaff Subject: [PATCH v5 2/3] log: separate logging functions out of EAL Date: Thu, 18 May 2023 13:49:48 +0100 Message-Id: <20230518124949.879834-3-bruce.richardson@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230518124949.879834-1-bruce.richardson@intel.com> References: <20220829151901.376754-1-bruce.richardson@intel.com> <20230518124949.879834-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 --- 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 | 115 ++++++++++++++++++ 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 +- 25 files changed, 202 insertions(+), 46 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/doc/api/doxy-api.conf.in b/doc/api/doxy-api.conf.in index d230a19e1f..967aa11701 100644 --- a/doc/api/doxy-api.conf.in +++ b/doc/api/doxy-api.conf.in @@ -51,6 +51,7 @@ INPUT = @TOPDIR@/doc/api/doxy-api-index.md \ @TOPDIR@/lib/kni \ @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 93c8a031be..8033f6cebd 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 :ref:`Log_Library`. Trace and Debug Functions ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst index 87333ee84a..ac01f0eae9 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..706ddcfef3 --- /dev/null +++ b/doc/guides/prog_guide/log_lib.rst @@ -0,0 +1,115 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2023 Intel Corporation. + +.. _log_library: + +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 0305933698..9cbe42e587 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 ae323cd492..765ad1d783 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 3cccfa36c0..1b913acc06 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 51a820d829..8f25f31499 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -140,21 +140,6 @@ DPDK_23 { 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_23 { 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_23 { 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 033825c14c..725c8618e3 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 bd7b188ceb..c3ede383b2 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..6baff83ee5 --- /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..726ff9fbcf --- /dev/null +++ b/lib/log/version.map @@ -0,0 +1,34 @@ +DPDK_23 { + 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 dc8aa4ac84..ebcd0a5ebd 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 73750d9ef4..72f135d7d2 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 Thu May 18 12:49:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bruce Richardson X-Patchwork-Id: 126992 X-Patchwork-Delegate: thomas@monjalon.net 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 E631942B3A; Thu, 18 May 2023 14:50:23 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E2B9B42D16; Thu, 18 May 2023 14:50:10 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id 8747942D3D for ; Thu, 18 May 2023 14:50:09 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1684414209; x=1715950209; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=muLJi5nGdGqYInm/NVM1JohzJc1aYGM0NZgwwBRcspg=; b=f2rrERyO9Zi0fE5PTeMVzfAJ1I1MbsPbd0eFnUXuLJ8OuC85+m9WWkhc rnL5a9chi73CD86M94Vf2O7FxNhQ/Or+gEbcvnv8NnNXag49lL0sCAGbK 1zD6U++75hb6JovAS4QYO6/HNbOehqwzh2rdhGRNw81hJObokNncI4X+d z8m0Z/ziqCyKCpAdTeNSprQzp1rA9CK3qZMnAFY2fjBimVbOHSqxqSJJN FL6OA1kYuUzUFL9/HdVWxNUX66RSkqhij7o9+D6DBdBeGWXkXlIxTVDCN febGNT4B+hjPLRb4NkahBhQnDM6UNyyG4+rySOMwjadaKSRZj0AAgRN+E Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10713"; a="380259908" X-IronPort-AV: E=Sophos;i="5.99,285,1677571200"; d="scan'208";a="380259908" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 May 2023 05:50:09 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10713"; a="705187684" X-IronPort-AV: E=Sophos;i="5.99,285,1677571200"; d="scan'208";a="705187684" Received: from silpixa00401385.ir.intel.com ([10.237.214.44]) by fmsmga007.fm.intel.com with ESMTP; 18 May 2023 05:50:07 -0700 From: Bruce Richardson To: dev@dpdk.org Cc: Bruce Richardson , =?utf-8?q?Morten_Br=C3=B8?= =?utf-8?q?rup?= , Tyler Retzlaff Subject: [PATCH v5 3/3] telemetry: use standard logging Date: Thu, 18 May 2023 13:49:49 +0100 Message-Id: <20230518124949.879834-4-bruce.richardson@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230518124949.879834-1-bruce.richardson@intel.com> References: <20220829151901.376754-1-bruce.richardson@intel.com> <20230518124949.879834-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 7daf22e314..f125a0d3de 100644 --- a/lib/eal/freebsd/eal.c +++ b/lib/eal/freebsd/eal.c @@ -884,13 +884,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 765ad1d783..c80647d6b2 100644 --- a/lib/eal/linux/eal.c +++ b/lib/eal/linux/eal.c @@ -1330,13 +1330,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 deba7f34a3..3feeebd814 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; @@ -612,14 +610,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 d085c492dc..5c75d73183 100644 --- a/lib/telemetry/telemetry_internal.h +++ b/lib/telemetry/telemetry_internal.h @@ -109,7 +109,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