Patch "regmap: maple: Use alloc_flags for memory allocations" has been added to the 6.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    regmap: maple: Use alloc_flags for memory allocations

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     regmap-maple-use-alloc_flags-for-memory-allocations.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit d908d538c8544452e4b3627669d7b63cd5918318
Author: Guenter Roeck <linux@xxxxxxxxxxxx>
Date:   Thu Jul 20 10:20:21 2023 -0700

    regmap: maple: Use alloc_flags for memory allocations
    
    [ Upstream commit b0393e1fe40e962574613a5cdc4a470d6c1de023 ]
    
    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: f033c26de5a5 ("regmap: Add maple tree based register cache")
    Cc: Dan Carpenter <dan.carpenter@xxxxxxxxxx>
    Signed-off-by: Guenter Roeck <linux@xxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230720172021.2617326-1-linux@xxxxxxxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/base/regmap/regcache-maple.c b/drivers/base/regmap/regcache-maple.c
index 14f6f49af097c..08316d578be23 100644
--- a/drivers/base/regmap/regcache-maple.c
+++ b/drivers/base/regmap/regcache-maple.c
@@ -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;
@@ -250,7 +250,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;
 
@@ -261,7 +261,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);
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux