Re: [PATCH v5 08/11] devm-helpers: Add resource managed version of debugfs directory create function

From: Christophe JAILLET
Date: Sat Mar 23 2024 - 17:19:52 EST


Le 23/03/2024 à 17:43, Marek Behún a écrit :
A few drivers register a devm action to remove a debugfs directory,
implementing a one-liner function that calls debufs_remove_recursive().
Help drivers avoid this repeated implementations by adding managed
version of debugfs directory create function.

Use the new function devm_debugfs_create_dir() in the following
drivers:
drivers/crypto/caam/ctrl.c
drivers/gpu/drm/bridge/ti-sn65dsi86.c
drivers/hwmon/hp-wmi-sensors.c
drivers/hwmon/mr75203.c
drivers/hwmon/pmbus/pmbus_core.c

Also use the action function devm_debugfs_dir_recursive_drop() in
driver
drivers/gpio/gpio-mockup.c

As per Dan Williams' request [1], do not touch the driver
drivers/cxl/mem.c

[1] https://lore.kernel.org/linux-gpio/65d7918b358a5_1ee3129432@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.notmuch/

Signed-off-by: Marek Behún <kabel@xxxxxxxxxx>
---
drivers/crypto/caam/ctrl.c | 16 +++--------
drivers/gpio/gpio-mockup.c | 11 ++------
drivers/gpu/drm/bridge/ti-sn65dsi86.c | 13 ++-------
drivers/hwmon/hp-wmi-sensors.c | 15 ++--------
drivers/hwmon/mr75203.c | 15 ++++------
drivers/hwmon/pmbus/pmbus_core.c | 16 ++++-------
include/linux/devm-helpers.h | 40 +++++++++++++++++++++++++++
7 files changed, 61 insertions(+), 65 deletions(-)

..

diff --git a/drivers/gpio/gpio-mockup.c b/drivers/gpio/gpio-mockup.c
index 455eecf6380e..adbe0fe09490 100644
--- a/drivers/gpio/gpio-mockup.c
+++ b/drivers/gpio/gpio-mockup.c
@@ -12,6 +12,7 @@
#include <linux/cleanup.h>
#include <linux/debugfs.h>
#include <linux/device.h>
+#include <linux/devm-helpers.h>
#include <linux/gpio/driver.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
@@ -390,13 +391,6 @@ static void gpio_mockup_debugfs_setup(struct device *dev,
}
}
-static void gpio_mockup_debugfs_cleanup(void *data)
-{
- struct gpio_mockup_chip *chip = data;
-
- debugfs_remove_recursive(chip->dbg_dir);
-}
-
static void gpio_mockup_dispose_mappings(void *data)
{
struct gpio_mockup_chip *chip = data;
@@ -480,7 +474,8 @@ static int gpio_mockup_probe(struct platform_device *pdev)
gpio_mockup_debugfs_setup(dev, chip);
- return devm_add_action_or_reset(dev, gpio_mockup_debugfs_cleanup, chip);
+ return devm_add_action_or_reset(dev, devm_debugfs_dir_recursive_drop,
+ chip->dbg_dir);

This look strange. Shouldn't the debugfs_create_dir() call in gpio_mockup_debugfs_setup() be changed, instead?

(I've not look in the previous version if something was said about it, so apologies if already discussed)

}
static const struct of_device_id gpio_mockup_of_match[] = {

..


diff --git a/drivers/hwmon/mr75203.c b/drivers/hwmon/mr75203.c
index 50a8b9c3f94d..50f348fca108 100644
--- a/drivers/hwmon/mr75203.c
+++ b/drivers/hwmon/mr75203.c
@@ -10,6 +10,7 @@
#include <linux/bits.h>
#include <linux/clk.h>
#include <linux/debugfs.h>
+#include <linux/devm-helpers.h>
#include <linux/hwmon.h>
#include <linux/kstrtox.h>
#include <linux/module.h>
@@ -216,17 +217,11 @@ static const struct file_operations pvt_ts_coeff_j_fops = {
.llseek = default_llseek,
};
-static void devm_pvt_ts_dbgfs_remove(void *data)
-{
- struct pvt_device *pvt = (struct pvt_device *)data;
-
- debugfs_remove_recursive(pvt->dbgfs_dir);
- pvt->dbgfs_dir = NULL;
-}
-
static int pvt_ts_dbgfs_create(struct pvt_device *pvt, struct device *dev)
{
- pvt->dbgfs_dir = debugfs_create_dir(dev_name(dev), NULL);
+ pvt->dbgfs_dir = devm_debugfs_create_dir(dev, dev_name(dev), NULL);
+ if (IS_ERR(pvt->dbgfs_dir))
+ return PTR_ERR(pvt->dbgfs_dir);

Not sure if the test and error handling should be added here.
*If I'm correct*, functions related to debugfs already handle this case and just do nothing. And failure in debugfs related code is not considered as something that need to be reported and abort a probe function.

Maybe the same other (already existing) tests in this patch should be removed as well, in a separated patch.

just my 2c

CJ

debugfs_create_u32("ts_coeff_h", 0644, pvt->dbgfs_dir,
&pvt->ts_coeff.h);
@@ -237,7 +232,7 @@ static int pvt_ts_dbgfs_create(struct pvt_device *pvt, struct device *dev)
debugfs_create_file("ts_coeff_j", 0644, pvt->dbgfs_dir, pvt,
&pvt_ts_coeff_j_fops);
- return devm_add_action_or_reset(dev, devm_pvt_ts_dbgfs_remove, pvt);
+ return 0;
}

..