regmap: Disable debugfs when locking is disabled
authorMark Brown <broonie@kernel.org>
Tue, 12 Dec 2017 16:56:43 +0000 (16:56 +0000)
committerMark Brown <broonie@kernel.org>
Wed, 13 Dec 2017 16:22:31 +0000 (16:22 +0000)
The recently added support for disabling the regmap internal locking left
debugfs enabled for devices with the locking disabled. This is a problem
since debugfs allows userspace to do things like initiate reads from the
hardware which will use the scratch buffers protected by the regmap locking
so could cause data corruption.

For safety address this by just disabling debugfs for these devices. That
is overly conservative since some of the debugfs files just read internal
data structures but it's much simpler to implmement and less likely to
lead to problems with tooling that works with debugfs.

Reported-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/base/regmap/internal.h
drivers/base/regmap/regmap-debugfs.c
drivers/base/regmap/regmap.c

index 8641183cac2ff35ae883b8913b00831fa3a5af8a..53785e0e297a0b6e3e05f90a34329d35d79cf863 100644 (file)
@@ -77,6 +77,7 @@ struct regmap {
        int async_ret;
 
 #ifdef CONFIG_DEBUG_FS
+       bool debugfs_disable;
        struct dentry *debugfs;
        const char *debugfs_name;
 
@@ -215,10 +216,17 @@ struct regmap_field {
 extern void regmap_debugfs_initcall(void);
 extern void regmap_debugfs_init(struct regmap *map, const char *name);
 extern void regmap_debugfs_exit(struct regmap *map);
+
+static inline void regmap_debugfs_disable(struct regmap *map)
+{
+       map->debugfs_disable = true;
+}
+
 #else
 static inline void regmap_debugfs_initcall(void) { }
 static inline void regmap_debugfs_init(struct regmap *map, const char *name) { }
 static inline void regmap_debugfs_exit(struct regmap *map) { }
+static inline void regmap_debugfs_disable(struct regmap *map) { }
 #endif
 
 /* regcache core declarations */
index 36ce3511c733f62193a32fe3b63fd4d195209092..c8ecefd75d6fa25e8a1aca4f8b0045e6af02ccfd 100644 (file)
@@ -529,6 +529,9 @@ void regmap_debugfs_init(struct regmap *map, const char *name)
        struct regmap_range_node *range_node;
        const char *devname = "dummy";
 
+       if (map->debugfs_disable)
+               return;
+
        /* If we don't have the debugfs root yet, postpone init */
        if (!regmap_debugfs_root) {
                struct regmap_debugfs_node *node;
index 54b1aa371c6105b73215c77b5b78a92954b725da..df9ca36753ffdbddac5d261cfa0b0f44ceaa59ed 100644 (file)
@@ -676,6 +676,7 @@ struct regmap *__regmap_init(struct device *dev,
 
        if (config->disable_locking) {
                map->lock = map->unlock = regmap_lock_unlock_none;
+               regmap_debugfs_disable(map);
        } else if (config->lock && config->unlock) {
                map->lock = config->lock;
                map->unlock = config->unlock;