Re: [PATCH 4.9 75/95] random: set up the NUMA crng instances after the CRNG is fully initialized

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

 



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             }



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]