diff options
author | Greg Kurz <gkurz@linux.vnet.ibm.com> | 2016-06-15 16:26:41 -0400 |
---|---|---|
committer | Michael Ellerman <mpe@ellerman.id.au> | 2016-07-08 05:22:15 -0400 |
commit | 8c6a0a1f4041f19559538649e0b9f3d9224b03a8 (patch) | |
tree | 9b0647f3194095df36bbc1abbc12b0e1d1731456 /arch/powerpc/kernel/rtasd.c | |
parent | 63a72284b159c569ec52f380c9a8dd9342d43bb8 (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.c | 22 |
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 | } |
527 | EXPORT_SYMBOL_GPL(rtas_cancel_event_scan); | 527 | EXPORT_SYMBOL_GPL(rtas_cancel_event_scan); |
528 | 528 | ||
529 | static int __init rtas_init(void) | 529 | static 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 | } | ||
567 | arch_initcall(rtas_event_scan_init); | ||
568 | |||
569 | static 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); |