Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp3886220ybl; Mon, 3 Feb 2020 08:21:56 -0800 (PST) X-Google-Smtp-Source: APXvYqz5qZHC7nOiC3CHLqiEVEsxaeRGSTYMndgDhaTzbXqusQn3G8wg6xBUqRvlRWQLtVwdsSwm X-Received: by 2002:aca:1913:: with SMTP id l19mr14362069oii.47.1580746916860; Mon, 03 Feb 2020 08:21:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580746916; cv=none; d=google.com; s=arc-20160816; b=x02JKrf3RdjkeJ07Le+IxN0qohgelxbzlsOZU+ANHEjZ85++2dK5L68IUQgr/0HBsL 83NisyXzx+PdT3k3FrCFcZ7v9Mc+vnL0xjaprub28tCsrCXq8NbJ8eIVrL1wMfwkhiNG r7LLtw+is53GMsXeBu7w4/fXWCAR39Ds8f7tutErgDhmxxoypokL/Vb7tQIGmbKnpnSR Z2E0qGZtD9FO/m2q1bj+/EJmoIYB/BKwmgOubwadm/+KzELft515yK5Si3m/eoC+dMYx BQbNPNRwYbBkkWFCB5tm0ZRXukb2rlIdc/27pQfcIYjiPyKc/kyc+lLNZRU9ICXlDZAt n5EQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:to:from; bh=NUk1ebAeaZgo/SfyO7V5ZiRio6E10ZrA6qDVzFXCl24=; b=J0gDGcenf9haYLAaWx4GzOAYqoVUhXAhN/Tack+3mG+l+TJ+FFk7d23dS3VvO99ZMC w2LOxpuaAK5qH2IcphupaTgfmrrRgknaiLJkoJFFWjfC9wOIumOkMcxAw+znqzkc6FD3 hpmb6aOIM9XwSncDUXQkmg3L7BA1JIAtOwtqbgyHa7pDrnxpjW60gSoFIND7DyWHhGY7 cN4irJvWiyYofn47h4Uets4X3cX0L5bUdarci39CgnRMZLFB7skLSb+xh1Qua3XbPDhh PTBeuhFf/ZYZPLMLj4p5KeE2qwSfvdPO4e/B4jZWp23ICGr5flD1Kawtp6a7rxZ1JmPf 6HPg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m19si9385748otq.40.2020.02.03.08.21.30; Mon, 03 Feb 2020 08:21:56 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-bluetooth-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728080AbgBCPgK (ORCPT + 99 others); Mon, 3 Feb 2020 10:36:10 -0500 Received: from coyote.holtmann.net ([212.227.132.17]:33742 "EHLO mail.holtmann.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726272AbgBCPgJ (ORCPT ); Mon, 3 Feb 2020 10:36:09 -0500 Received: from localhost.localdomain (x59cc8b15.dyn.telefonica.de [89.204.139.21]) by mail.holtmann.org (Postfix) with ESMTPSA id 66DDDCED1A for ; Mon, 3 Feb 2020 16:45:29 +0100 (CET) From: Marcel Holtmann To: linux-bluetooth@vger.kernel.org Subject: [RFC v3] Bluetooth: Add debugfs option to enable runtime debug statements Date: Mon, 3 Feb 2020 16:36:03 +0100 Message-Id: <20200203153603.61931-1-marcel@holtmann.org> X-Mailer: git-send-email 2.24.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org Signed-off-by: Marcel Holtmann --- include/net/bluetooth/bluetooth.h | 10 +++++ net/bluetooth/Kconfig | 7 +++ net/bluetooth/af_bluetooth.c | 2 + net/bluetooth/lib.c | 73 +++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+) diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h index e42bb8e03c09..1670953178a0 100644 --- a/include/net/bluetooth/bluetooth.h +++ b/include/net/bluetooth/bluetooth.h @@ -129,6 +129,10 @@ void bt_warn(const char *fmt, ...); __printf(1, 2) void bt_err(const char *fmt, ...); __printf(1, 2) +#if IS_ENABLED(CONFIG_BT_DEBUGFS_OPTION) +void bt_dbg(const char *fmt, ...); +__printf(1, 2) +#endif void bt_warn_ratelimited(const char *fmt, ...); __printf(1, 2) void bt_err_ratelimited(const char *fmt, ...); @@ -136,7 +140,11 @@ 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_DEBUGFS_OPTION) +#define BT_DBG(fmt, ...) bt_dbg(fmt "\n", ##__VA_ARGS__) +#else #define BT_DBG(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__) +#endif #define bt_dev_info(hdev, fmt, ...) \ BT_INFO("%s: " fmt, (hdev)->name, ##__VA_ARGS__) @@ -393,6 +401,8 @@ void bt_procfs_cleanup(struct net *net, const char *name); extern struct dentry *bt_debugfs; +void bt_lib_debugfs_init(void); + int l2cap_init(void); void l2cap_exit(void); diff --git a/net/bluetooth/Kconfig b/net/bluetooth/Kconfig index 165148c7c4ce..2871d0770c11 100644 --- a/net/bluetooth/Kconfig +++ b/net/bluetooth/Kconfig @@ -128,4 +128,11 @@ config BT_DEBUGFS Provide extensive information about internal Bluetooth states in debugfs. + When dynamic debug is not used, then this option also includes + a switch to enable/disable internal debug statements. + +config BT_DEBUGFS_OPTION + bool + default y if BT_DEBUGFS && !DYNAMIC_DEBUG + source "drivers/bluetooth/Kconfig" diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 3fd124927d4d..fa0cd665f32a 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c @@ -731,6 +731,8 @@ static int __init bt_init(void) bt_debugfs = debugfs_create_dir("bluetooth", NULL); + bt_lib_debugfs_init(); + bt_leds_init(); err = bt_sysfs_init(); diff --git a/net/bluetooth/lib.c b/net/bluetooth/lib.c index c09e0a3a0ed9..29f9edb57c5c 100644 --- a/net/bluetooth/lib.c +++ b/net/bluetooth/lib.c @@ -27,6 +27,7 @@ #define pr_fmt(fmt) "Bluetooth: " fmt #include +#include #include @@ -135,6 +136,57 @@ int bt_to_errno(__u16 code) } EXPORT_SYMBOL(bt_to_errno); +#ifdef CONFIG_BT_DEBUGFS_OPTION +static bool debug_enable; + +static ssize_t debug_enable_read(struct file *file, char __user *user_buf, + size_t count, loff_t *ppos) +{ + char buf[3]; + + buf[0] = debug_enable ? 'Y': 'N'; + buf[1] = '\n'; + buf[2] = '\0'; + return simple_read_from_buffer(user_buf, count, ppos, buf, 2); +} + +static ssize_t debug_enable_write(struct file *file, + const char __user *user_buf, + size_t count, loff_t *ppos) +{ + bool enable; + int err; + + err = kstrtobool_from_user(user_buf, count, &enable); + if (err) + return err; + + if (enable == debug_enable) + return -EALREADY; + + debug_enable = enable; + + return count; +} + +static const struct file_operations debug_enable_fops = { + .open = simple_open, + .read = debug_enable_read, + .write = debug_enable_write, + .llseek = default_llseek, +}; + +void bt_lib_debugfs_init(void) +{ + debugfs_create_file("debug_enable", 0644, bt_debugfs, NULL, + &debug_enable_fops); +} +#else +void bt_lib_debugfs_init(void) +{ +} +#endif + void bt_info(const char *format, ...) { struct va_format vaf; @@ -183,6 +235,27 @@ void bt_err(const char *format, ...) } EXPORT_SYMBOL(bt_err); +#ifdef CONFIG_BT_DEBUGFS_OPTION +void bt_dbg(const char *format, ...) +{ + struct va_format vaf; + va_list args; + + if (likely(!debug_enable)) + return; + + va_start(args, format); + + vaf.fmt = format; + vaf.va = &args; + + printk(KERN_DEBUG pr_fmt("%pV"), &vaf); + + va_end(args); +} +EXPORT_SYMBOL(bt_dbg); +#endif + void bt_warn_ratelimited(const char *format, ...) { struct va_format vaf; -- 2.24.1