Commit b0393e1f authored by Guenter Roeck's avatar Guenter Roeck Committed by Mark Brown

regmap: maple: Use alloc_flags for memory allocations

REGCACHE_MAPLE needs to allocate memory for regmap operations.
This results in lockdep splats if used with fast_io since fast_io uses
spinlocks for locking.

BUG: sleeping function called from invalid context at include/linux/sched/mm.h:306
in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 167, name: kunit_try_catch
preempt_count: 1, expected: 0
1 lock held by kunit_try_catch/167:
 #0: 838e9c10 (regmap_kunit:86:(config)->lock){....}-{2:2}, at: regmap_lock_spinlock+0x14/0x1c
irq event stamp: 146
hardirqs last  enabled at (145): [<8078bfa8>] crng_make_state+0x1a0/0x294
hardirqs last disabled at (146): [<80c5f62c>] _raw_spin_lock_irqsave+0x7c/0x80
softirqs last  enabled at (0): [<80110cc4>] copy_process+0x810/0x216c
softirqs last disabled at (0): [<00000000>] 0x0
CPU: 0 PID: 167 Comm: kunit_try_catch Tainted: G                 N 6.5.0-rc1-00028-gc4be22597a36-dirty #6
Hardware name: Generic DT based system
 unwind_backtrace from show_stack+0x18/0x1c
 show_stack from dump_stack_lvl+0x38/0x5c
 dump_stack_lvl from __might_resched+0x188/0x2d0
 __might_resched from __kmem_cache_alloc_node+0x1f4/0x258
 __kmem_cache_alloc_node from __kmalloc+0x48/0x170
 __kmalloc from regcache_maple_write+0x194/0x248
 regcache_maple_write from _regmap_write+0x88/0x140
 _regmap_write from regmap_write+0x44/0x68
 regmap_write from basic_read_write+0x8c/0x27c
 basic_read_write from kunit_generic_run_threadfn_adapter+0x1c/0x28
 kunit_generic_run_threadfn_adapter from kthread+0xf8/0x120
 kthread from ret_from_fork+0x14/0x3c
Exception stack(0x881a5fb0 to 0x881a5ff8)
5fa0:                                     00000000 00000000 00000000 00000000
5fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
5fe0: 00000000 00000000 00000000 00000000 00000013 00000000

Use map->alloc_flags instead of GFP_KERNEL for memory allocations to fix
the problem.

Fixes: f033c26d ("regmap: Add maple tree based register cache")
Cc: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20230720172021.2617326-1-linux@roeck-us.netSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent ee43f5bb
...@@ -74,7 +74,7 @@ static int regcache_maple_write(struct regmap *map, unsigned int reg, ...@@ -74,7 +74,7 @@ static int regcache_maple_write(struct regmap *map, unsigned int reg,
rcu_read_unlock(); rcu_read_unlock();
entry = kmalloc((last - index + 1) * sizeof(unsigned long), entry = kmalloc((last - index + 1) * sizeof(unsigned long),
GFP_KERNEL); map->alloc_flags);
if (!entry) if (!entry)
return -ENOMEM; return -ENOMEM;
...@@ -92,7 +92,7 @@ static int regcache_maple_write(struct regmap *map, unsigned int reg, ...@@ -92,7 +92,7 @@ static int regcache_maple_write(struct regmap *map, unsigned int reg,
mas_lock(&mas); mas_lock(&mas);
mas_set_range(&mas, index, last); mas_set_range(&mas, index, last);
ret = mas_store_gfp(&mas, entry, GFP_KERNEL); ret = mas_store_gfp(&mas, entry, map->alloc_flags);
mas_unlock(&mas); mas_unlock(&mas);
...@@ -134,7 +134,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min, ...@@ -134,7 +134,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min,
lower = kmemdup(entry, ((min - mas.index) * lower = kmemdup(entry, ((min - mas.index) *
sizeof(unsigned long)), sizeof(unsigned long)),
GFP_KERNEL); map->alloc_flags);
if (!lower) { if (!lower) {
ret = -ENOMEM; ret = -ENOMEM;
goto out_unlocked; goto out_unlocked;
...@@ -148,7 +148,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min, ...@@ -148,7 +148,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min,
upper = kmemdup(&entry[max + 1], upper = kmemdup(&entry[max + 1],
((mas.last - max) * ((mas.last - max) *
sizeof(unsigned long)), sizeof(unsigned long)),
GFP_KERNEL); map->alloc_flags);
if (!upper) { if (!upper) {
ret = -ENOMEM; ret = -ENOMEM;
goto out_unlocked; goto out_unlocked;
...@@ -162,7 +162,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min, ...@@ -162,7 +162,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min,
/* Insert new nodes with the saved data */ /* Insert new nodes with the saved data */
if (lower) { if (lower) {
mas_set_range(&mas, lower_index, lower_last); mas_set_range(&mas, lower_index, lower_last);
ret = mas_store_gfp(&mas, lower, GFP_KERNEL); ret = mas_store_gfp(&mas, lower, map->alloc_flags);
if (ret != 0) if (ret != 0)
goto out; goto out;
lower = NULL; lower = NULL;
...@@ -170,7 +170,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min, ...@@ -170,7 +170,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min,
if (upper) { if (upper) {
mas_set_range(&mas, upper_index, upper_last); mas_set_range(&mas, upper_index, upper_last);
ret = mas_store_gfp(&mas, upper, GFP_KERNEL); ret = mas_store_gfp(&mas, upper, map->alloc_flags);
if (ret != 0) if (ret != 0)
goto out; goto out;
upper = NULL; upper = NULL;
...@@ -320,7 +320,7 @@ static int regcache_maple_insert_block(struct regmap *map, int first, ...@@ -320,7 +320,7 @@ static int regcache_maple_insert_block(struct regmap *map, int first,
unsigned long *entry; unsigned long *entry;
int i, ret; int i, ret;
entry = kcalloc(last - first + 1, sizeof(unsigned long), GFP_KERNEL); entry = kcalloc(last - first + 1, sizeof(unsigned long), map->alloc_flags);
if (!entry) if (!entry)
return -ENOMEM; return -ENOMEM;
...@@ -331,7 +331,7 @@ static int regcache_maple_insert_block(struct regmap *map, int first, ...@@ -331,7 +331,7 @@ static int regcache_maple_insert_block(struct regmap *map, int first,
mas_set_range(&mas, map->reg_defaults[first].reg, mas_set_range(&mas, map->reg_defaults[first].reg,
map->reg_defaults[last].reg); map->reg_defaults[last].reg);
ret = mas_store_gfp(&mas, entry, GFP_KERNEL); ret = mas_store_gfp(&mas, entry, map->alloc_flags);
mas_unlock(&mas); mas_unlock(&mas);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment