[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 1/5] console: add relocation hook
The XHCI console uses DMA, so it's sensitive for relocating its structures, even if their virtual addresses remain the same. Add a new console initialization hooks called before+after Xen relocation. Relocation happens conditionally, but call the hooks unconditionally, as that simplifies logic in the driver (and if needed, the driver can easily detect if relocation happened anyway). Thanks to that, a driver may use it to finalize init steps that need physical address but can be delayed - this way, it doesn't need un-doing on relocation. The most important part is the post-relocation hook, but add also pre-relocation one to simplify clean handling of in-flight data. Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx> --- I considered more limited scope - calling them just around move_xen() (or even from within that function), but that complicates iommu_add_extra_reserved_device_memory() call - see the next patch. As for the post-relocation hook, I have considered a parameter with info whether the relocation actually happened, but driver can figure it out on its own anyway. --- xen/arch/x86/setup.c | 8 ++++++++ xen/drivers/char/console.c | 10 ++++++++++ xen/drivers/char/serial.c | 18 ++++++++++++++++++ xen/include/xen/console.h | 2 ++ xen/include/xen/serial.h | 6 ++++++ 5 files changed, 44 insertions(+) diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 25189541244d..3ef819a252e4 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -1481,6 +1481,8 @@ void asmlinkage __init noreturn __start_xen(void) highmem_start &= ~((1UL << L3_PAGETABLE_SHIFT) - 1); #endif + console_init_pre_relocate(); + /* * Iterate backwards over all superpage-aligned RAM regions. * @@ -1606,6 +1608,12 @@ void asmlinkage __init noreturn __start_xen(void) if ( !xen_phys_start ) panic("Not enough memory to relocate Xen\n"); + /* + * Notify console drivers about relocation, before reusing old Xen's + * memory. + */ + console_init_post_relocate(); + /* FIXME: Putting a hole in .bss would shatter the large page mapping. */ if ( using_2M_mapping() ) efi_boot_mem_unused(NULL, NULL); diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index c15987f5bbe2..12898b684b5e 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -1120,6 +1120,16 @@ void __init console_init_ring(void) printk("Allocated console ring of %u KiB.\n", opt_conring_size >> 10); } +void __init console_init_pre_relocate(void) +{ + serial_init_pre_relocate(); +} + +void __init console_init_post_relocate(void) +{ + serial_init_post_relocate(); +} + void __init console_init_irq(void) { serial_init_irq(); diff --git a/xen/drivers/char/serial.c b/xen/drivers/char/serial.c index 591a00900869..95f7410afa9c 100644 --- a/xen/drivers/char/serial.c +++ b/xen/drivers/char/serial.c @@ -447,6 +447,24 @@ void __init serial_init_preirq(void) com[i].driver->init_preirq(&com[i]); } +void __init serial_init_pre_relocate(void) +{ + unsigned int i; + + for ( i = 0; i < ARRAY_SIZE(com); i++ ) + if ( com[i].driver && com[i].driver->init_pre_relocate ) + com[i].driver->init_pre_relocate(&com[i]); +} + +void __init serial_init_post_relocate(void) +{ + unsigned int i; + + for ( i = 0; i < ARRAY_SIZE(com); i++ ) + if ( com[i].driver && com[i].driver->init_post_relocate ) + com[i].driver->init_post_relocate(&com[i]); +} + void __init serial_init_irq(void) { unsigned int i; diff --git a/xen/include/xen/console.h b/xen/include/xen/console.h index 83cbc9fbdafc..d563777ad9e2 100644 --- a/xen/include/xen/console.h +++ b/xen/include/xen/console.h @@ -18,6 +18,8 @@ void console_init_preirq(void); void console_init_ring(void); void console_init_irq(void); void console_init_postirq(void); +void console_init_pre_relocate(void); +void console_init_post_relocate(void); void console_endboot(void); int console_has(const char *device); diff --git a/xen/include/xen/serial.h b/xen/include/xen/serial.h index 63a82b032dde..1ee3df2624fb 100644 --- a/xen/include/xen/serial.h +++ b/xen/include/xen/serial.h @@ -64,6 +64,9 @@ struct uart_driver { void (*init_preirq)(struct serial_port *port); void (*init_irq)(struct serial_port *port); void (*init_postirq)(struct serial_port *port); + /* Hooks around optional Xen relocation. */ + void (*init_pre_relocate)(struct serial_port *port); + void (*init_post_relocate)(struct serial_port *port); /* Hook to clean up after Xen bootstrap (before domain 0 runs). */ void (*endboot)(struct serial_port *port); /* Driver suspend/resume. */ @@ -103,6 +106,9 @@ struct uart_driver { void serial_init_preirq(void); void serial_init_irq(void); void serial_init_postirq(void); +/* Notify drivers about Xen relocation (relevant for those using DMA). */ +void serial_init_pre_relocate(void); +void serial_init_post_relocate(void); /* Clean-up hook before domain 0 runs. */ void serial_endboot(void); -- git-series 0.9.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |