[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <201804231921.DGB18791.QOVFLFMJFtSOHO@I-love.SAKURA.ne.jp>
Date: Mon, 23 Apr 2018 19:21:10 +0900
From: Tetsuo Handa <penguin-kernel@...ove.SAKURA.ne.jp>
To: gregkh@...uxfoundation.org, ben@...adent.org.uk
Cc: linux-kernel@...r.kernel.org, tytso@....edu,
stable@...r.kernel.org, jannh@...gle.com, stable@...nel.org,
carnil@...ian.org
Subject: Re: [PATCH 4.9 75/95] random: set up the NUMA crng instances after the CRNG is fully initialized
Greg Kroah-Hartman wrote:
> > I think this can be fixed by backporting commit 4a072c71f49b
> > "random: silence compiler warnings and fix race" but I'm not sure
> > whether that depends on other changes.
>
> According to Tetsuo Handa, it's also causing problems in mainline :(
>
> Ted, any thoughts as to what to do here?
(Resending because Webmail post was rejected by both stable ML and linux-kernel ML.)
Subject: random: GFP_KERNEL|__GFP_NOFAIL allocation from IRQ context
Hello.
Commit 8ef35c866f8862df ("random: set up the NUMA crng instances after
the CRNG is fully initialized") is causing sleep inside atomic warning
due to GFP_KERNEL|__GFP_NOFAIL allocation from IRQ context. Though it
unlikely sleeps because there will be enough free memory at boot up...
Please don't backport that patch now.
[ 9.712722] BUG: sleeping function called from invalid context at mm/slab.h:421
[ 9.715231] in_atomic(): 1, irqs_disabled(): 0, pid: 0, name: swapper/2
[ 9.717396] INFO: lockdep is turned off.
[ 9.718717] CPU: 2 PID: 0 Comm: swapper/2 Not tainted 4.17.0-rc1+ #480
[ 9.720857] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 05/19/2017
[ 9.724328] Call Trace:
[ 9.725176] <IRQ>
[ 9.725880] dump_stack+0xb1/0xfc
[ 9.727003] ___might_sleep+0x23e/0x270
[ 9.728285] __might_sleep+0x45/0x80
[ 9.729479] __kmalloc+0x284/0x3e0
[ 9.730642] ? crng_reseed+0x122/0x320
[ 9.731876] crng_reseed+0x122/0x320
[ 9.733078] credit_entropy_bits+0x2f6/0x370
[ 9.734503] ? add_timer_randomness+0xb8/0xd0
[ 9.735880] add_timer_randomness+0xb8/0xd0
[ 9.737201] add_disk_randomness+0x32/0x170
[ 9.738666] scsi_end_request+0x182/0x210
[ 9.740004] scsi_io_completion+0x2cd/0x620
[ 9.741448] scsi_finish_command+0xf3/0x170
[ 9.742844] scsi_softirq_done+0x12b/0x170
[ 9.744209] blk_done_softirq+0xb2/0xd0
[ 9.745501] __do_softirq+0xcf/0x49b
[ 9.746726] irq_exit+0xbc/0xd0
[ 9.747785] smp_call_function_single_interrupt+0x17a/0x270
[ 9.749603] call_function_single_interrupt+0xf/0x20
[ 9.751240] </IRQ>
[ 9.751970] RIP: 0010:native_safe_halt+0x6/0x10
[ 9.753467] RSP: 0018:ffff88011963fe78 EFLAGS: 00000286 ORIG_RAX: ffffffffffffff04
[ 9.755922] RAX: ffff880119626380 RBX: ffff880119626380 RCX: 0000000000000000
[ 9.758362] RDX: ffff880119626380 RSI: 0000000000000001 RDI: ffff880119626380
[ 9.760743] RBP: ffff88011963fe78 R08: 0000000000000000 R09: 0000000000000000
[ 9.763068] R10: 0000000000000001 R11: ffff88011a4a3693 R12: 0000000000000002
[ 9.765382] R13: 0000000000000000 R14: 0000000000000000 R15: ffff880119626380
[ 9.767709] ? trace_hardirqs_on+0xd/0x10
[ 9.769044] default_idle+0x2c/0x1a0
[ 9.770333] arch_cpu_idle+0x10/0x20
[ 9.771526] default_idle_call+0x1e/0x40
[ 9.772833] do_idle+0x196/0x2a0
[ 9.773923] ? complete+0x48/0x50
[ 9.775068] cpu_startup_entry+0x5f/0x62
[ 9.776392] start_secondary+0x1a3/0x1f0
[ 9.777697] secondary_startup_64+0xa5/0xb0
[ 9.779101] random: crng init done
# ./scripts/faddr2line vmlinux crng_reseed+0x122/0x320
crng_reseed+0x122/0x320:
kmalloc_array at include/linux/slab.h:631
626 {
627 if (size != 0 && n > SIZE_MAX / size)
628 return NULL;
629 if (__builtin_constant_p(n) && __builtin_constant_p(size))
630 return kmalloc(n * size, flags);
631 return __kmalloc(n * size, flags);
632 }
633
634 /**
635 * kcalloc - allocate memory for an array. The memory is set to zero.
636 * @n: number of elements.
(inlined by) kcalloc at include/linux/slab.h:642
637 * @size: element size.
638 * @flags: the type of memory to allocate (see kmalloc).
639 */
640 static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
641 {
642 return kmalloc_array(n, size, flags | __GFP_ZERO);
643 }
644
645 /*
646 * kmalloc_track_caller is a special version of kmalloc that records the
647 * calling function of the routine calling it for slab leak tracking instead
(inlined by) numa_crng_init at drivers/char/random.c:798
793 {
794 int i;
795 struct crng_state *crng;
796 struct crng_state **pool;
797
798 pool = kcalloc(nr_node_ids, sizeof(*pool), GFP_KERNEL|__GFP_NOFAIL);
799 for_each_online_node(i) {
800 crng = kmalloc_node(sizeof(struct crng_state),
801 GFP_KERNEL | __GFP_NOFAIL, i);
802 spin_lock_init(&crng->lock);
803 crng_initialize(crng);
(inlined by) crng_reseed at drivers/char/random.c:923
918 memzero_explicit(&buf, sizeof(buf));
919 crng->init_time = jiffies;
920 spin_unlock_irqrestore(&crng->lock, flags);
921 if (crng == &primary_crng && crng_init < 2) {
922 invalidate_batched_entropy();
923 numa_crng_init();
924 crng_init = 2;
925 process_random_ready_list();
926 wake_up_interruptible(&crng_init_wait);
927 pr_notice("random: crng init done\n");
928 }
Powered by blists - more mailing lists