console: allocate ring buffer earlier
PATCH v2 1/1 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.
---
v2: Also adjust ARM (as requested by Julien). Rename new function to
console_init_ring().
xen/arch/arm/setup.c +1 -0
@@ -745,6 +745,7 @@ void __init start_xen(unsigned long bootdt_uart_init ();console_init_preirq (); +console_init_ring (); system_state = SYS_STATE_boot;
xen/arch/x86/setup.c +1 -0
@@ -1187,6 +1187,7 @@ void __init noreturn __start_xen(unsigne }vm_init (); +console_init_ring ();vesa_init ();softirq_init ();
xen/drivers/char/console.c +18 -6
@@ -744,15 +744,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);
@@ -763,17 +762,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;
xen/include/xen/console.h +1 -0
@@ -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);
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.
---
v2: Also adjust ARM (as requested by Julien). Rename new function to
console_init_ring().
xen/arch/arm/setup.c +1 -0
@@ -745,6 +745,7 @@ void __init start_xen(unsigned long bootdt_uart_init ();console_init_preirq (); +console_init_ring (); system_state = SYS_STATE_boot;
xen/arch/x86/setup.c +1 -0
@@ -1187,6 +1187,7 @@ void __init noreturn __start_xen(unsigne }vm_init (); +console_init_ring ();vesa_init ();softirq_init ();
xen/drivers/char/console.c +18 -6
@@ -744,15 +744,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);
@@ -763,17 +762,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;
xen/include/xen/console.h +1 -0
@@ -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);
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel
Quoted 7 lines · Jan Beulich
... 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 <[email protected]>
Quoted 91 lines
---
v2: Also adjust ARM (as requested by Julien). Rename new function to
console_init_ring().xen/arch/arm/setup.c +1
-0@@ -745,6 +745,7 @@ void __init start_xen(unsigned long bootdt_uart_init ();console_init_preirq (); +console_init_ring (); system_state = SYS_STATE_boot;xen/arch/x86/setup.c +1
-0@@ -1187,6 +1187,7 @@ void __init noreturn __start_xen(unsigne }vm_init (); +console_init_ring ();vesa_init ();softirq_init ();xen/drivers/char/console.c +18
-6@@ -744,15 +744,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);@@ -763,17 +762,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;xen/include/xen/console.h +1
-0@@ -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);
Don Slutz
Reviewed-byQuoted 11 lines · Ian Campbell
Quoted 7 lines · Jan Beulich
... 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 <[email protected]>
This change looks good to me, so:
-Don Slutz
Quoted 99 lines
Quoted 84 lines
---
v2: Also adjust ARM (as requested by Julien). Rename new function to
console_init_ring().xen/arch/arm/setup.c +1
-0@@ -745,6 +745,7 @@ void __init start_xen(unsigned long bootdt_uart_init ();console_init_preirq (); +console_init_ring (); system_state = SYS_STATE_boot;xen/arch/x86/setup.c +1
-0@@ -1187,6 +1187,7 @@ void __init noreturn __start_xen(unsigne }vm_init (); +console_init_ring ();vesa_init ();softirq_init ();xen/drivers/char/console.c +18
-6@@ -744,15 +744,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);@@ -763,17 +762,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;xen/include/xen/console.h struct xen_sysctl_readconsole; · line 20
Quoted 7 lines
xen/include/xen/console.h +1
-0@@ -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);_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xen.org/xen-devel