File 548e9c0d-console-allocate-ring-buffer-earlier.patch of Package xen.4507
# Commit 2676bc915157ab474ee478d929b0928cf696b385
# Date 2014-12-15 09:30:05 +0100
# Author Jan Beulich <jbeulich@suse.com>
# Committer Jan Beulich <jbeulich@suse.com>
console: allocate ring buffer earlier
... when "conring_size=" was specified on the command line. We can't
really do this as early as we would want to when the option was not
specified, as the default depends on knowing the system CPU count. Yet
the parsing of the ACPI tables is one of the things that generates a
lot of output especially on large systems.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com> (ARM and generic bits)
Index: xen-4.4.4-testing/xen/arch/arm/setup.c
===================================================================
--- xen-4.4.4-testing.orig/xen/arch/arm/setup.c
+++ xen-4.4.4-testing/xen/arch/arm/setup.c
@@ -683,6 +683,7 @@ void __init start_xen(unsigned long boot
dt_uart_init();
console_init_preirq();
+ console_init_ring();
system_state = SYS_STATE_boot;
Index: xen-4.4.4-testing/xen/arch/x86/setup.c
===================================================================
--- xen-4.4.4-testing.orig/xen/arch/x86/setup.c
+++ xen-4.4.4-testing/xen/arch/x86/setup.c
@@ -1191,6 +1191,7 @@ void __init __start_xen(unsigned long mb
system_state = SYS_STATE_boot;
vm_init();
+ console_init_ring();
vesa_init();
softirq_init();
Index: xen-4.4.4-testing/xen/drivers/char/console.c
===================================================================
--- xen-4.4.4-testing.orig/xen/drivers/char/console.c
+++ xen-4.4.4-testing/xen/drivers/char/console.c
@@ -684,15 +684,14 @@ void __init console_init_preirq(void)
}
}
-void __init console_init_postirq(void)
+void __init console_init_ring(void)
{
char *ring;
unsigned int i, order, memflags;
-
- serial_init_postirq();
+ unsigned long flags;
if ( !opt_conring_size )
- opt_conring_size = num_present_cpus() << (9 + xenlog_lower_thresh);
+ return;
order = get_order_from_bytes(max(opt_conring_size, conring_size));
memflags = MEMF_bits(crashinfo_maxaddr_bits);
@@ -703,17 +702,30 @@ void __init console_init_postirq(void)
}
opt_conring_size = PAGE_SIZE << order;
- spin_lock_irq(&console_lock);
+ spin_lock_irqsave(&console_lock, flags);
for ( i = conringc ; i != conringp; i++ )
ring[i & (opt_conring_size - 1)] = conring[i & (conring_size - 1)];
conring = ring;
smp_wmb(); /* Allow users of console_force_unlock() to see larger buffer. */
conring_size = opt_conring_size;
- spin_unlock_irq(&console_lock);
+ spin_unlock_irqrestore(&console_lock, flags);
printk("Allocated console ring of %u KiB.\n", opt_conring_size >> 10);
}
+void __init console_init_postirq(void)
+{
+ serial_init_postirq();
+
+ if ( conring != _conring )
+ return;
+
+ if ( !opt_conring_size )
+ opt_conring_size = num_present_cpus() << (9 + xenlog_lower_thresh);
+
+ console_init_ring();
+}
+
void __init console_endboot(void)
{
int i, j;
Index: xen-4.4.4-testing/xen/include/xen/console.h
===================================================================
--- xen-4.4.4-testing.orig/xen/include/xen/console.h
+++ xen-4.4.4-testing/xen/include/xen/console.h
@@ -14,6 +14,7 @@ struct xen_sysctl_readconsole;
long read_console_ring(struct xen_sysctl_readconsole *op);
void console_init_preirq(void);
+void console_init_ring(void);
void console_init_postirq(void);
void console_endboot(void);
int console_has(const char *device);