aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/rtasd.c
diff options
context:
space:
mode:
authorGreg Kurz <gkurz@linux.vnet.ibm.com>2016-06-15 16:26:41 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2016-07-08 05:22:15 -0400
commit8c6a0a1f4041f19559538649e0b9f3d9224b03a8 (patch)
tree9b0647f3194095df36bbc1abbc12b0e1d1731456 /arch/powerpc/kernel/rtasd.c
parent63a72284b159c569ec52f380c9a8dd9342d43bb8 (diff)
powerpc/pseries: start rtasd before PCI probing
A strange behaviour is observed when comparing PCI hotplug in QEMU, between x86 and pseries. If you consider the following steps: - start a VM - add a PCI device via the QEMU monitor before the rtasd has started (for example starting the VM in paused state, or hotplug during FW or boot loader) - resume the VM execution The x86 kernel detects the PCI device, but the pseries one does not. This happens because the rtasd kernel worker is currently started under device_initcall, while PCI probing happens earlier under subsys_initcall. As a consequence, if we have a pending RTAS event at boot time, a message is printed and the event is dropped. This patch moves all the initialization of rtasd to arch_initcall, which is run before subsys_call: this way, logging_enabled is true when the RTAS event pops up and it is not lost anymore. The proc fs bits stay at device_initcall because they cannot be run before fs_initcall. Signed-off-by: Greg Kurz <gkurz@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/kernel/rtasd.c')
-rw-r--r--arch/powerpc/kernel/rtasd.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/arch/powerpc/kernel/rtasd.c b/arch/powerpc/kernel/rtasd.c
index e864b7c5884e..a26a02006576 100644
--- a/arch/powerpc/kernel/rtasd.c
+++ b/arch/powerpc/kernel/rtasd.c
@@ -526,10 +526,8 @@ void rtas_cancel_event_scan(void)
526} 526}
527EXPORT_SYMBOL_GPL(rtas_cancel_event_scan); 527EXPORT_SYMBOL_GPL(rtas_cancel_event_scan);
528 528
529static int __init rtas_init(void) 529static int __init rtas_event_scan_init(void)
530{ 530{
531 struct proc_dir_entry *entry;
532
533 if (!machine_is(pseries) && !machine_is(chrp)) 531 if (!machine_is(pseries) && !machine_is(chrp))
534 return 0; 532 return 0;
535 533
@@ -562,13 +560,27 @@ static int __init rtas_init(void)
562 return -ENOMEM; 560 return -ENOMEM;
563 } 561 }
564 562
563 start_event_scan();
564
565 return 0;
566}
567arch_initcall(rtas_event_scan_init);
568
569static int __init rtas_init(void)
570{
571 struct proc_dir_entry *entry;
572
573 if (!machine_is(pseries) && !machine_is(chrp))
574 return 0;
575
576 if (!rtas_log_buf)
577 return -ENODEV;
578
565 entry = proc_create("powerpc/rtas/error_log", S_IRUSR, NULL, 579 entry = proc_create("powerpc/rtas/error_log", S_IRUSR, NULL,
566 &proc_rtas_log_operations); 580 &proc_rtas_log_operations);
567 if (!entry) 581 if (!entry)
568 printk(KERN_ERR "Failed to create error_log proc entry\n"); 582 printk(KERN_ERR "Failed to create error_log proc entry\n");
569 583
570 start_event_scan();
571
572 return 0; 584 return 0;
573} 585}
574__initcall(rtas_init); 586__initcall(rtas_init);