diff mbox series

[3/4] log: Add a way to enable/disable a log device

Message ID 20200912122845.3.I3743cdceacc4e8d4046331664ff17066779b9fd9@changeid
State Accepted
Delegated to: Tom Rini
Headers show
Series log: Fix the syslog spam when running tests | expand

Commit Message

Simon Glass Sept. 12, 2020, 6:28 p.m. UTC
At present all log devices are enabled by default. Add a function to allow
devices to be disabled or enabled at runtime.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 common/log.c              | 38 ++++++++++++++++++++++++++++++++++++++
 include/log.h             | 17 +++++++++++++++++
 test/log/log_test.c       |  7 +++++++
 test/py/tests/test_log.py |  8 ++++++++
 4 files changed, 70 insertions(+)

Comments

Heinrich Schuchardt Sept. 12, 2020, 8:24 p.m. UTC | #1
Am 12. September 2020 20:28:49 MESZ schrieb Simon Glass <sjg@chromium.org>:
>At present all log devices are enabled by default. Add a function to
>allow
>devices to be disabled or enabled at runtime.

Should this capability be added to the log command?

Regards

Heinrich

>
>Signed-off-by: Simon Glass <sjg@chromium.org>
>---
>
> common/log.c              | 38 ++++++++++++++++++++++++++++++++++++++
> include/log.h             | 17 +++++++++++++++++
> test/log/log_test.c       |  7 +++++++
> test/py/tests/test_log.py |  8 ++++++++
> 4 files changed, 70 insertions(+)
>
>diff --git a/common/log.c b/common/log.c
>index ce528fe4535..a9aacfaf354 100644
>--- a/common/log.c
>+++ b/common/log.c
>@@ -297,6 +297,44 @@ int log_remove_filter(const char *drv_name, int
>filter_num)
> 	return -ENOENT;
> }
> 
>+/**
>+ * log_find_device_by_drv() - Find a device by its driver
>+ *
>+ * @drv: Log driver
>+ * @return Device associated with that driver, or NULL if not found
>+ */
>+static struct log_device *log_find_device_by_drv(struct log_driver
>*drv)
>+{
>+	struct log_device *ldev;
>+
>+	list_for_each_entry(ldev, &gd->log_head, sibling_node) {
>+		if (ldev->drv == drv)
>+			return ldev;
>+	}
>+	/*
>+	 * It is quite hard to pass an invalid driver since passing an
>unknown
>+	 * LOG_GET_DRIVER(xxx) would normally produce a compilation error.
>But
>+	 * it is possible to pass NULL, for example, so this
>+	 */
>+
>+	return NULL;
>+}
>+
>+int log_device_set_enable(struct log_driver *drv, bool enable)
>+{
>+	struct log_device *ldev;
>+
>+	ldev = log_find_device_by_drv(drv);
>+	if (!ldev)
>+		return -ENOENT;
>+	if (enable)
>+		ldev->flags |= LOGDF_ENABLE;
>+	else
>+		ldev->flags &= ~LOGDF_ENABLE;
>+
>+	return 0;
>+}
>+
> int log_init(void)
> {
>	struct log_driver *drv = ll_entry_start(struct log_driver,
>log_driver);
>diff --git a/include/log.h b/include/log.h
>index d28bc1ef0e4..4acc087b2e9 100644
>--- a/include/log.h
>+++ b/include/log.h
>@@ -388,6 +388,10 @@ struct log_filter {
> #define LOG_DRIVER(_name) \
> 	ll_entry_declare(struct log_driver, _name, log_driver)
> 
>+/* Get a pointer to a given driver */
>+#define LOG_GET_DRIVER(__name)						\
>+	ll_entry_get(struct log_driver, __name, log_driver)
>+
> /**
>  * log_get_cat_name() - Get the name of a category
>  *
>@@ -465,6 +469,19 @@ int log_add_filter(const char *drv_name, enum
>log_category_t cat_list[],
>  */
> int log_remove_filter(const char *drv_name, int filter_num);
> 
>+/**
>+ * log_device_set_enable() - Enable or disable a log device
>+ *
>+ * Devices are referenced by their driver, so use LOG_GET_DRIVER(name)
>to pass
>+ * the driver to this function. For example if the driver is declared
>with
>+ * LOG_DRIVER(wibble) then pass LOG_GET_DRIVER(wibble) here.
>+ *
>+ * @drv: Driver of device to enable
>+ * @enable: true to enable, false to disable
>+ * @return 0 if OK, -ENOENT if the driver was not found
>+ */
>+int log_device_set_enable(struct log_driver *drv, bool enable);
>+
> #if CONFIG_IS_ENABLED(LOG)
> /**
>  * log_init() - Set up the log system ready for use
>diff --git a/test/log/log_test.c b/test/log/log_test.c
>index fdee5e6757f..6a60ff6be3c 100644
>--- a/test/log/log_test.c
>+++ b/test/log/log_test.c
>@@ -196,6 +196,13 @@ static int log_test(int testnum)
> 		log_io("level %d\n", LOGL_DEBUG_IO);
> 		break;
> 	}
>+	case 11:
>+		log_err("default\n");
>+		ret = log_device_set_enable(LOG_GET_DRIVER(console), false);
>+		log_err("disabled\n");
>+		ret = log_device_set_enable(LOG_GET_DRIVER(console), true);
>+		log_err("enabled\n");
>+		break;
> 	}
> 
> 	return 0;
>diff --git a/test/py/tests/test_log.py b/test/py/tests/test_log.py
>index ddc28f19ee8..275f9382d2f 100644
>--- a/test/py/tests/test_log.py
>+++ b/test/py/tests/test_log.py
>@@ -92,6 +92,13 @@ def test_log(u_boot_console):
>         for i in range(7):
>             assert 'log_test() level %d' % i == next(lines)
> 
>+    def test11():
>+        """Test use of log_device_set_enable()"""
>+        lines = run_test(11)
>+        assert 'log_test() default'
>+        # disabled should not be displayed
>+        assert 'log_test() enabled'
>+
>  # TODO(sjg@chromium.org): Consider structuring this as separate tests
>     cons = u_boot_console
>     test0()
>@@ -105,6 +112,7 @@ def test_log(u_boot_console):
>     test8()
>     test9()
>     test10()
>+    test11()
> 
> @pytest.mark.buildconfigspec('cmd_log')
> def test_log_format(u_boot_console):
Simon Glass Sept. 13, 2020, 1:24 a.m. UTC | #2
Hi Heinrich,

On Sat, 12 Sep 2020 at 14:25, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>
> Am 12. September 2020 20:28:49 MESZ schrieb Simon Glass <sjg@chromium.org>:
> >At present all log devices are enabled by default. Add a function to
> >allow
> >devices to be disabled or enabled at runtime.
>
> Should this capability be added to the log command?

It's probably not a bad idea. I'll take a look.

Regards,
Simon
Tom Rini Oct. 12, 2020, 1:15 a.m. UTC | #3
On Sat, Sep 12, 2020 at 12:28:49PM -0600, Simon Glass wrote:

> At present all log devices are enabled by default. Add a function to allow
> devices to be disabled or enabled at runtime.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/common/log.c b/common/log.c
index ce528fe4535..a9aacfaf354 100644
--- a/common/log.c
+++ b/common/log.c
@@ -297,6 +297,44 @@  int log_remove_filter(const char *drv_name, int filter_num)
 	return -ENOENT;
 }
 
+/**
+ * log_find_device_by_drv() - Find a device by its driver
+ *
+ * @drv: Log driver
+ * @return Device associated with that driver, or NULL if not found
+ */
+static struct log_device *log_find_device_by_drv(struct log_driver *drv)
+{
+	struct log_device *ldev;
+
+	list_for_each_entry(ldev, &gd->log_head, sibling_node) {
+		if (ldev->drv == drv)
+			return ldev;
+	}
+	/*
+	 * It is quite hard to pass an invalid driver since passing an unknown
+	 * LOG_GET_DRIVER(xxx) would normally produce a compilation error. But
+	 * it is possible to pass NULL, for example, so this
+	 */
+
+	return NULL;
+}
+
+int log_device_set_enable(struct log_driver *drv, bool enable)
+{
+	struct log_device *ldev;
+
+	ldev = log_find_device_by_drv(drv);
+	if (!ldev)
+		return -ENOENT;
+	if (enable)
+		ldev->flags |= LOGDF_ENABLE;
+	else
+		ldev->flags &= ~LOGDF_ENABLE;
+
+	return 0;
+}
+
 int log_init(void)
 {
 	struct log_driver *drv = ll_entry_start(struct log_driver, log_driver);
diff --git a/include/log.h b/include/log.h
index d28bc1ef0e4..4acc087b2e9 100644
--- a/include/log.h
+++ b/include/log.h
@@ -388,6 +388,10 @@  struct log_filter {
 #define LOG_DRIVER(_name) \
 	ll_entry_declare(struct log_driver, _name, log_driver)
 
+/* Get a pointer to a given driver */
+#define LOG_GET_DRIVER(__name)						\
+	ll_entry_get(struct log_driver, __name, log_driver)
+
 /**
  * log_get_cat_name() - Get the name of a category
  *
@@ -465,6 +469,19 @@  int log_add_filter(const char *drv_name, enum log_category_t cat_list[],
  */
 int log_remove_filter(const char *drv_name, int filter_num);
 
+/**
+ * log_device_set_enable() - Enable or disable a log device
+ *
+ * Devices are referenced by their driver, so use LOG_GET_DRIVER(name) to pass
+ * the driver to this function. For example if the driver is declared with
+ * LOG_DRIVER(wibble) then pass LOG_GET_DRIVER(wibble) here.
+ *
+ * @drv: Driver of device to enable
+ * @enable: true to enable, false to disable
+ * @return 0 if OK, -ENOENT if the driver was not found
+ */
+int log_device_set_enable(struct log_driver *drv, bool enable);
+
 #if CONFIG_IS_ENABLED(LOG)
 /**
  * log_init() - Set up the log system ready for use
diff --git a/test/log/log_test.c b/test/log/log_test.c
index fdee5e6757f..6a60ff6be3c 100644
--- a/test/log/log_test.c
+++ b/test/log/log_test.c
@@ -196,6 +196,13 @@  static int log_test(int testnum)
 		log_io("level %d\n", LOGL_DEBUG_IO);
 		break;
 	}
+	case 11:
+		log_err("default\n");
+		ret = log_device_set_enable(LOG_GET_DRIVER(console), false);
+		log_err("disabled\n");
+		ret = log_device_set_enable(LOG_GET_DRIVER(console), true);
+		log_err("enabled\n");
+		break;
 	}
 
 	return 0;
diff --git a/test/py/tests/test_log.py b/test/py/tests/test_log.py
index ddc28f19ee8..275f9382d2f 100644
--- a/test/py/tests/test_log.py
+++ b/test/py/tests/test_log.py
@@ -92,6 +92,13 @@  def test_log(u_boot_console):
         for i in range(7):
             assert 'log_test() level %d' % i == next(lines)
 
+    def test11():
+        """Test use of log_device_set_enable()"""
+        lines = run_test(11)
+        assert 'log_test() default'
+        # disabled should not be displayed
+        assert 'log_test() enabled'
+
     # TODO(sjg@chromium.org): Consider structuring this as separate tests
     cons = u_boot_console
     test0()
@@ -105,6 +112,7 @@  def test_log(u_boot_console):
     test8()
     test9()
     test10()
+    test11()
 
 @pytest.mark.buildconfigspec('cmd_log')
 def test_log_format(u_boot_console):