2020-07-07 14:17:31

by Alain Michaud

[permalink] [raw]
Subject: [PATCH v2] Bluetooth: create CONFIG_BT_DEBUG_FEATURE_FUNC_NAME

Creates a CONFIG_BT_DEBUG_FEATURE_FUNC_NAME option to include function names in
debug statements.

Unlike other platforms __func__ isn't a string literal so it cannot be
automatically concatenated by the pre-processor. As a result, the
function name is passed as a parameter to the tracing function. Since
pr_debug is a function like macro, the normal expansion of BT_PREFIX_PARAM
does not work as it gets processed within the first parameter as well,
for this reason, BT_DBG is split into two versions.

This patch was built tested with all 4 possible combinations of
CONFIG_BT_DEBUG_FUNC_NAME and CONFIG_BT_FEATURE_DEBUG configurations.

Signed-off-by: Alain Michaud <[email protected]>
Reviewed-by: Archie Pusaka <[email protected]>
---

Changes in v2:
- Making CONFIG_BT_DEBUG_FEATURE_FUNC_NAME dependent on
CONFIG_BT_DEBUG_FEATURE

include/net/bluetooth/bluetooth.h | 32 +++++++++++++++++++++++--------
net/bluetooth/Kconfig | 11 +++++++++++
2 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
index 7ee8041af803..8506dd268d4b 100644
--- a/include/net/bluetooth/bluetooth.h
+++ b/include/net/bluetooth/bluetooth.h
@@ -162,22 +162,37 @@ void bt_dbg_set(bool enable);
bool bt_dbg_get(void);
__printf(1, 2)
void bt_dbg(const char *fmt, ...);
+#define BT_DBG_INT bt_dbg
+#else
+#define BT_DBG_INT pr_debug
#endif
__printf(1, 2)
void bt_warn_ratelimited(const char *fmt, ...);
__printf(1, 2)
void bt_err_ratelimited(const char *fmt, ...);

-#define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__)
-#define BT_WARN(fmt, ...) bt_warn(fmt "\n", ##__VA_ARGS__)
-#define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__)
-
-#if IS_ENABLED(CONFIG_BT_FEATURE_DEBUG)
-#define BT_DBG(fmt, ...) bt_dbg(fmt "\n", ##__VA_ARGS__)
+#if IS_ENABLED(BT_FEATURE_DEBUG_FUNC_NAMES)
+#define BT_PREFIX "%s() "
+#define BT_PREFIX_PARAM ,__func__
+#define BT_DBG(fmt, ...) \
+ BT_DBG_INT(BT_PREFIX fmt "\n", __func__, ##__VA_ARGS__)
#else
-#define BT_DBG(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__)
+#define BT_PREFIX
+#define BT_PREFIX_PARAM
+#define BT_DBG(fmt, ...) \
+ BT_DBG_INT(fmt "\n", ##__VA_ARGS__)
#endif

+#define BT_INFO(fmt, ...) \
+ bt_info(BT_PREFIX fmt "\n" BT_PREFIX_PARAM, ##__VA_ARGS__)
+#define BT_WARN(fmt, ...) \
+ bt_warn(BT_PREFIX fmt "\n" BT_PREFIX_PARAM, ##__VA_ARGS__)
+#define BT_ERR(fmt, ...) \
+ bt_err(BT_PREFIX fmt "\n" BT_PREFIX_PARAM, ##__VA_ARGS__)
+
+#define BT_ERR_RATELIMITED(fmt, ...) \
+ bt_err_ratelimited(BT_PREFIX fmt "\n" BT_PREFIX_PARAM, ##__VA_ARGS__)
+
#define bt_dev_info(hdev, fmt, ...) \
BT_INFO("%s: " fmt, (hdev)->name, ##__VA_ARGS__)
#define bt_dev_warn(hdev, fmt, ...) \
@@ -188,7 +203,8 @@ void bt_err_ratelimited(const char *fmt, ...);
BT_DBG("%s: " fmt, (hdev)->name, ##__VA_ARGS__)

#define bt_dev_warn_ratelimited(hdev, fmt, ...) \
- bt_warn_ratelimited("%s: " fmt, (hdev)->name, ##__VA_ARGS__)
+ bt_warn_ratelimited("%s: " BT_PREFIX fmt, (hdev)->name \
+ BT_PREFIX_PARAM, ##__VA_ARGS__)
#define bt_dev_err_ratelimited(hdev, fmt, ...) \
bt_err_ratelimited("%s: " fmt, (hdev)->name, ##__VA_ARGS__)

diff --git a/net/bluetooth/Kconfig b/net/bluetooth/Kconfig
index 1d6d243cdde9..ccbf762053f1 100644
--- a/net/bluetooth/Kconfig
+++ b/net/bluetooth/Kconfig
@@ -142,4 +142,15 @@ config BT_FEATURE_DEBUG
This provides an option to enable/disable debugging statements
at runtime via the experimental features interface.

+config BT_FEATURE_DEBUG_FUNC_NAMES
+ bool "Include function names in debugging statements"
+ depends on BT_FEATURE_DEBUG
+ default n
+ help
+ Provides an option to include function names in debugging
+ statements.
+
+ When enabled, trace statements will include the function name as a
+ prefix which may help identify the source code references.
+
source "drivers/bluetooth/Kconfig"
--
2.27.0.212.ge8ba1cc988-goog


2020-07-07 15:54:04

by Marcel Holtmann

[permalink] [raw]
Subject: Re: [PATCH v2] Bluetooth: create CONFIG_BT_DEBUG_FEATURE_FUNC_NAME

Hi Alain,

> Creates a CONFIG_BT_DEBUG_FEATURE_FUNC_NAME option to include function names in
> debug statements.
>
> Unlike other platforms __func__ isn't a string literal so it cannot be
> automatically concatenated by the pre-processor. As a result, the
> function name is passed as a parameter to the tracing function. Since
> pr_debug is a function like macro, the normal expansion of BT_PREFIX_PARAM
> does not work as it gets processed within the first parameter as well,
> for this reason, BT_DBG is split into two versions.
>
> This patch was built tested with all 4 possible combinations of
> CONFIG_BT_DEBUG_FUNC_NAME and CONFIG_BT_FEATURE_DEBUG configurations.
>
> Signed-off-by: Alain Michaud <[email protected]>
> Reviewed-by: Archie Pusaka <[email protected]>
> ---
>
> Changes in v2:
> - Making CONFIG_BT_DEBUG_FEATURE_FUNC_NAME dependent on
> CONFIG_BT_DEBUG_FEATURE
>
> include/net/bluetooth/bluetooth.h | 32 +++++++++++++++++++++++--------
> net/bluetooth/Kconfig | 11 +++++++++++
> 2 files changed, 35 insertions(+), 8 deletions(-)
>
> diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
> index 7ee8041af803..8506dd268d4b 100644
> --- a/include/net/bluetooth/bluetooth.h
> +++ b/include/net/bluetooth/bluetooth.h
> @@ -162,22 +162,37 @@ void bt_dbg_set(bool enable);
> bool bt_dbg_get(void);
> __printf(1, 2)
> void bt_dbg(const char *fmt, ...);
> +#define BT_DBG_INT bt_dbg
> +#else
> +#define BT_DBG_INT pr_debug
> #endif
> __printf(1, 2)
> void bt_warn_ratelimited(const char *fmt, ...);
> __printf(1, 2)
> void bt_err_ratelimited(const char *fmt, ...);
>
> -#define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__)
> -#define BT_WARN(fmt, ...) bt_warn(fmt "\n", ##__VA_ARGS__)
> -#define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__)
> -
> -#if IS_ENABLED(CONFIG_BT_FEATURE_DEBUG)
> -#define BT_DBG(fmt, ...) bt_dbg(fmt "\n", ##__VA_ARGS__)
> +#if IS_ENABLED(BT_FEATURE_DEBUG_FUNC_NAMES)

are you sure you tested this?

And frankly I don’t get the point for the new Kconfig option. It is rather useless in this patch. Tell me one thing, do you prefer that FEATURE_DEBUG prints the function names or not. Because if dynamic debug is used, we don’t need it since that is all configurable via dynamic debug itself and we don’t need it there (and I also don’t want it in the dynamic debug case).

Regards

Marcel

2020-07-07 17:17:15

by Alain Michaud

[permalink] [raw]
Subject: Re: [PATCH v2] Bluetooth: create CONFIG_BT_DEBUG_FEATURE_FUNC_NAME

On Tue, Jul 7, 2020 at 11:53 AM Marcel Holtmann <[email protected]> wrote:
>
> Hi Alain,
>
> > Creates a CONFIG_BT_DEBUG_FEATURE_FUNC_NAME option to include function names in
> > debug statements.
> >
> > Unlike other platforms __func__ isn't a string literal so it cannot be
> > automatically concatenated by the pre-processor. As a result, the
> > function name is passed as a parameter to the tracing function. Since
> > pr_debug is a function like macro, the normal expansion of BT_PREFIX_PARAM
> > does not work as it gets processed within the first parameter as well,
> > for this reason, BT_DBG is split into two versions.
> >
> > This patch was built tested with all 4 possible combinations of
> > CONFIG_BT_DEBUG_FUNC_NAME and CONFIG_BT_FEATURE_DEBUG configurations.
> >
> > Signed-off-by: Alain Michaud <[email protected]>
> > Reviewed-by: Archie Pusaka <[email protected]>
> > ---
> >
> > Changes in v2:
> > - Making CONFIG_BT_DEBUG_FEATURE_FUNC_NAME dependent on
> > CONFIG_BT_DEBUG_FEATURE
> >
> > include/net/bluetooth/bluetooth.h | 32 +++++++++++++++++++++++--------
> > net/bluetooth/Kconfig | 11 +++++++++++
> > 2 files changed, 35 insertions(+), 8 deletions(-)
> >
> > diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
> > index 7ee8041af803..8506dd268d4b 100644
> > --- a/include/net/bluetooth/bluetooth.h
> > +++ b/include/net/bluetooth/bluetooth.h
> > @@ -162,22 +162,37 @@ void bt_dbg_set(bool enable);
> > bool bt_dbg_get(void);
> > __printf(1, 2)
> > void bt_dbg(const char *fmt, ...);
> > +#define BT_DBG_INT bt_dbg
> > +#else
> > +#define BT_DBG_INT pr_debug
> > #endif
> > __printf(1, 2)
> > void bt_warn_ratelimited(const char *fmt, ...);
> > __printf(1, 2)
> > void bt_err_ratelimited(const char *fmt, ...);
> >
> > -#define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__)
> > -#define BT_WARN(fmt, ...) bt_warn(fmt "\n", ##__VA_ARGS__)
> > -#define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__)
> > -
> > -#if IS_ENABLED(CONFIG_BT_FEATURE_DEBUG)
> > -#define BT_DBG(fmt, ...) bt_dbg(fmt "\n", ##__VA_ARGS__)
> > +#if IS_ENABLED(BT_FEATURE_DEBUG_FUNC_NAMES)
>
> are you sure you tested this?

This was tested on chromeos using this patch chain which also sets the
configuration and revert our original patch:
https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/2279613

>
>
> And frankly I don’t get the point for the new Kconfig option. It is rather useless in this patch. Tell me one thing, do you prefer that FEATURE_DEBUG prints the function names or not. Because if dynamic debug is used, we don’t need it since that is all configurable via dynamic debug itself and we don’t need it there (and I also don’t want it in the dynamic debug case).
I'd be ok if we unconditionally print function names if
CONFIG_BT_FEATURE_DEBUG is set. what I want to avoid is to overly
complicate the debug macros to have the function names configurable at
runtime.

>
> Regards
>
> Marcel
>

2020-07-07 20:04:19

by Alain Michaud

[permalink] [raw]
Subject: Re: [PATCH v2] Bluetooth: create CONFIG_BT_DEBUG_FEATURE_FUNC_NAME

On Tue, Jul 7, 2020 at 1:15 PM Alain Michaud <[email protected]> wrote:
>
> On Tue, Jul 7, 2020 at 11:53 AM Marcel Holtmann <[email protected]> wrote:
> >
> > Hi Alain,
> >
> > > Creates a CONFIG_BT_DEBUG_FEATURE_FUNC_NAME option to include function names in
> > > debug statements.
> > >
> > > Unlike other platforms __func__ isn't a string literal so it cannot be
> > > automatically concatenated by the pre-processor. As a result, the
> > > function name is passed as a parameter to the tracing function. Since
> > > pr_debug is a function like macro, the normal expansion of BT_PREFIX_PARAM
> > > does not work as it gets processed within the first parameter as well,
> > > for this reason, BT_DBG is split into two versions.
> > >
> > > This patch was built tested with all 4 possible combinations of
> > > CONFIG_BT_DEBUG_FUNC_NAME and CONFIG_BT_FEATURE_DEBUG configurations.
> > >
> > > Signed-off-by: Alain Michaud <[email protected]>
> > > Reviewed-by: Archie Pusaka <[email protected]>
> > > ---
> > >
> > > Changes in v2:
> > > - Making CONFIG_BT_DEBUG_FEATURE_FUNC_NAME dependent on
> > > CONFIG_BT_DEBUG_FEATURE
> > >
> > > include/net/bluetooth/bluetooth.h | 32 +++++++++++++++++++++++--------
> > > net/bluetooth/Kconfig | 11 +++++++++++
> > > 2 files changed, 35 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
> > > index 7ee8041af803..8506dd268d4b 100644
> > > --- a/include/net/bluetooth/bluetooth.h
> > > +++ b/include/net/bluetooth/bluetooth.h
> > > @@ -162,22 +162,37 @@ void bt_dbg_set(bool enable);
> > > bool bt_dbg_get(void);
> > > __printf(1, 2)
> > > void bt_dbg(const char *fmt, ...);
> > > +#define BT_DBG_INT bt_dbg
> > > +#else
> > > +#define BT_DBG_INT pr_debug
> > > #endif
> > > __printf(1, 2)
> > > void bt_warn_ratelimited(const char *fmt, ...);
> > > __printf(1, 2)
> > > void bt_err_ratelimited(const char *fmt, ...);
> > >
> > > -#define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__)
> > > -#define BT_WARN(fmt, ...) bt_warn(fmt "\n", ##__VA_ARGS__)
> > > -#define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__)
> > > -
> > > -#if IS_ENABLED(CONFIG_BT_FEATURE_DEBUG)
> > > -#define BT_DBG(fmt, ...) bt_dbg(fmt "\n", ##__VA_ARGS__)
> > > +#if IS_ENABLED(BT_FEATURE_DEBUG_FUNC_NAMES)
> >
> > are you sure you tested this?
>
> This was tested on chromeos using this patch chain which also sets the
> configuration and revert our original patch:
> https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/2279613
(facepalm) You were right, I introduced this bug in v2's rename. This
is now fixed in V3.
>
> >
> >
> > And frankly I don’t get the point for the new Kconfig option. It is rather useless in this patch. Tell me one thing, do you prefer that FEATURE_DEBUG prints the function names or not. Because if dynamic debug is used, we don’t need it since that is all configurable via dynamic debug itself and we don’t need it there (and I also don’t want it in the dynamic debug case).
> I'd be ok if we unconditionally print function names if
> CONFIG_BT_FEATURE_DEBUG is set. what I want to avoid is to overly
> complicate the debug macros to have the function names configurable at
> runtime.
>
> >
> > Regards
> >
> > Marcel
> >