mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-18 08:35:08 +08:00
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: f033c26de5
("regmap: Add maple tree based register cache")
Cc: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20230720172021.2617326-1-linux@roeck-us.net
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
ee43f5bb23
commit
b0393e1fe4
@ -74,7 +74,7 @@ static int regcache_maple_write(struct regmap *map, unsigned int reg,
|
||||
rcu_read_unlock();
|
||||
|
||||
entry = kmalloc((last - index + 1) * sizeof(unsigned long),
|
||||
GFP_KERNEL);
|
||||
map->alloc_flags);
|
||||
if (!entry)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -92,7 +92,7 @@ static int regcache_maple_write(struct regmap *map, unsigned int reg,
|
||||
mas_lock(&mas);
|
||||
|
||||
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);
|
||||
|
||||
@ -134,7 +134,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min,
|
||||
|
||||
lower = kmemdup(entry, ((min - mas.index) *
|
||||
sizeof(unsigned long)),
|
||||
GFP_KERNEL);
|
||||
map->alloc_flags);
|
||||
if (!lower) {
|
||||
ret = -ENOMEM;
|
||||
goto out_unlocked;
|
||||
@ -148,7 +148,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min,
|
||||
upper = kmemdup(&entry[max + 1],
|
||||
((mas.last - max) *
|
||||
sizeof(unsigned long)),
|
||||
GFP_KERNEL);
|
||||
map->alloc_flags);
|
||||
if (!upper) {
|
||||
ret = -ENOMEM;
|
||||
goto out_unlocked;
|
||||
@ -162,7 +162,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min,
|
||||
/* Insert new nodes with the saved data */
|
||||
if (lower) {
|
||||
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)
|
||||
goto out;
|
||||
lower = NULL;
|
||||
@ -170,7 +170,7 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min,
|
||||
|
||||
if (upper) {
|
||||
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)
|
||||
goto out;
|
||||
upper = NULL;
|
||||
@ -320,7 +320,7 @@ static int regcache_maple_insert_block(struct regmap *map, int first,
|
||||
unsigned long *entry;
|
||||
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)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -331,7 +331,7 @@ static int regcache_maple_insert_block(struct regmap *map, int first,
|
||||
|
||||
mas_set_range(&mas, map->reg_defaults[first].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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user