Simplify smp_call_function*() by using common implementation
PATCH 1/1 Simplify smp_call_function*() by using common implementation
smp_call_function and smp_call_function_single are almost complete duplicates of the same logic. This patch combines them by implementing them in terms of the more general smp_call_function_mask().
[ Jan, Andi: This only changes arch/i386; can x86_64 be changed in the
same way? ]
[ Rebased onto Jan's x86_64-mm-consolidate-smp_send_stop patch ]
--- arch/i386/kernel/smp.c | 177 +++++++++++++++++++++++------------------------- 1 file changed, 86 insertions(+), 91 deletions(-)
===================================================================
arch/i386/kernel/smp.c +86 -91
@@ -515,14 +515,26 @@ void unlock_ipi_call_lock(void)static struct call_data_struct *call_data; -static void __smp_call_function (void (*func) (void *info),void *info, -int nonatomic,int wait) + +static int __smp_call_function_mask (cpumask_t mask, +void (*func)(void *),void *info, +int wait) {struct call_data_struct data; -int cpus =num_online_cpus () -1 ; +cpumask_t allbutself; +int cpus; + +/* Can deadlock when called with interrupts disabled */ +WARN_ON (irqs_disabled ()); + + allbutself = cpu_online_map; +cpu_clear (smp_processor_id (), allbutself); + +cpus_and (mask, mask, allbutself); + cpus =cpus_weight (mask);if (!cpus) -return ; +return 0 ; data.func = func; data.info = info;
@@ -533,9 +545,12 @@ static void __smp_call_function(void (*f call_data = &data;mb (); - -/* Send a message to all other CPUs and wait for them to respond */ -send_IPI_allbutself (CALL_FUNCTION_VECTOR ); + +/* Send a message to other CPUs */ +if (cpus_equal (mask, allbutself)) +send_IPI_allbutself (CALL_FUNCTION_VECTOR ); +else +send_IPI_mask (mask,CALL_FUNCTION_VECTOR );/* Wait for response */ while (atomic_read (&data.started) != cpus)
@@ -544,6 +559,34 @@ static void __smp_call_function(void (*fif (wait)while (atomic_read (&data.finished) != cpus)cpu_relax (); + +return 0 ; +} + +/** +* smp_call_function_mask(): Run a function on a set of other CPUs. +* @mask: The set of cpus to run on. Must not include the current cpu. +* @func: The function to run. This must be fast and non-blocking. +* @info: An arbitrary pointer to pass to the function. +* @wait: If true, wait (atomically) until function has completed on other CPUs. +* +* Returns 0 on success, else a negative status code. Does not return until +* remote CPUs are nearly ready to execute <<func>> or are or have finished. +* +* You must not call this function with disabled interrupts or from a +* hardware interrupt handler or from a bottom half handler. +*/ +int smp_call_function_mask (cpumask_t mask, +void (*func)(void *),void *info, +int wait) +{ +int ret; + +spin_lock (&call_lock); + ret =__smp_call_function_mask (mask, func, info, wait); +spin_unlock (&call_lock); + +return ret; }/**
@@ -559,20 +602,43 @@ static void __smp_call_function(void (*f* You must not call this function with disabled interrupts or from a * hardware interrupt handler or from a bottom half handler. */ -int smp_call_function (void (*func) (void *info),void *info,int nonatomic, -int wait) -{ -/* Can deadlock when called with interrupts disabled */ -WARN_ON (irqs_disabled ()); - -/* Holding any lock stops cpus from going down. */ -spin_lock (&call_lock); -__smp_call_function (func, info, nonatomic, wait); -spin_unlock (&call_lock); - -return 0 ; +int smp_call_function (void (*func) (void *info),void *info,int nonatomic, +int wait) +{ +return smp_call_function_mask (cpu_online_map, func, info, wait); }EXPORT_SYMBOL (smp_call_function); + +/* +* smp_call_function_single - Run a function on another CPU +* @func: The function to run. This must be fast and non-blocking. +* @info: An arbitrary pointer to pass to the function. +* @nonatomic: Currently unused. +* @wait: If true, wait until function has completed on other CPUs. +* +* Retrurns 0 on success, else a negative status code. +* +* Does not return until the remote CPU is nearly ready to execute <func> +* or is or has executed. +*/ +int smp_call_function_single (int cpu,void (*func) (void *info),void *info, +int nonatomic,int wait) +{ +/* prevent preemption and reschedule on another processor */ +int ret; +int me =get_cpu (); +if (cpu == me) { +WARN_ON (1 ); +put_cpu (); +return -EBUSY ; + } + + ret =smp_call_function_mask (cpumask_of_cpu (cpu), func, info, wait); + +put_cpu (); +return ret; +} +EXPORT_SYMBOL (smp_call_function_single);static void stop_this_cpu (void * dummy) {
@@ -598,7 +664,7 @@ void smp_send_stop(void)unsigned long flags;local_irq_save (flags); -__smp_call_function (stop_this_cpu,NULL ,0 ,0 ); +__smp_call_function_mask (cpu_online_map, stop_this_cpu,NULL ,0 );if (!nolock)spin_unlock (&call_lock);disable_local_APIC ();
@@ -641,77 +707,6 @@ fastcall void smp_call_function_interrup } } -/* -* this function sends a 'generic call function' IPI to one other CPU -* in the system. -* -* cpu is a standard Linux logical CPU number. -*/ -static void -__smp_call_function_single (int cpu,void (*func) (void *info),void *info, -int nonatomic,int wait) -{ -struct call_data_struct data; -int cpus =1 ; - - data.func = func; - data.info = info; -atomic_set (&data.started,0 ); - data.wait = wait; -if (wait) -atomic_set (&data.finished,0 ); - - call_data = &data; -wmb (); -/* Send a message to all other CPUs and wait for them to respond */ -send_IPI_mask (cpumask_of_cpu (cpu),CALL_FUNCTION_VECTOR ); - -/* Wait for response */ -while (atomic_read (&data.started) != cpus) -cpu_relax (); - -if (!wait) -return ; - -while (atomic_read (&data.finished) != cpus) -cpu_relax (); -} - -/* -* smp_call_function_single - Run a function on another CPU -* @func: The function to run. This must be fast and non-blocking. -* @info: An arbitrary pointer to pass to the function. -* @nonatomic: Currently unused. -* @wait: If true, wait until function has completed on other CPUs. -* -* Retrurns 0 on success, else a negative status code. -* -* Does not return until the remote CPU is nearly ready to execute <func> -* or is or has executed. -*/ - -int smp_call_function_single (int cpu,void (*func) (void *info),void *info, -int nonatomic,int wait) -{ -/* prevent preemption and reschedule on another processor */ -int me =get_cpu (); -if (cpu == me) { -WARN_ON (1 ); -put_cpu (); -return -EBUSY ; - } - -/* Can deadlock when called with interrupts disabled */ -WARN_ON (irqs_disabled ()); - -spin_lock_bh (&call_lock); -__smp_call_function_single (cpu, func, info, nonatomic, wait); -spin_unlock_bh (&call_lock); -put_cpu (); -return 0 ; -} -EXPORT_SYMBOL (smp_call_function_single); -static int convert_apicid_to_cpu (int apic_id) {int i;
Quoted 33 lines · On Tue, 27 Mar 2007 15:13:29 -0700 Jeremy Fitzhardinge wrote:
smp_call_functionandsmp_call_function_singleare almost complete duplicates of the same logic. This patch combines them by implementing them in terms of the more generalsmp_call_function_mask().[ Jan, Andi: This only changes
arch/i386; canx86_64be changed in the
same way? ][ Rebased onto Jan's x86_64-mm-consolidate-smp_send_stop patch ]
Signed-off-by Jeremy Fitzhardinge <[email protected]>Cc Jan Beulich <[email protected]>Cc Stephane Eranian <[email protected]>Cc Andrew Morton <[email protected]>Cc Andi Kleen <[email protected]>Cc "Randy.Dunlap" <[email protected]>Cc Ingo Molnar <[email protected]>--- arch/i386/kernel/smp.c | 177 +++++++++++++++++++++++------------------------- 1 file changed, 86 insertions(+), 91 deletions(-)===================================================================
arch/i386/kernel/smp.c +3
-0@@ -544,6 +559,34 @@ static void __smp_call_function(void (*fif (wait)while (atomic_read (&data.finished) != cpus)cpu_relax (); + +return 0 ; +}
arch/i386/kernel/smp.c static void __smp_call_function(void (*f · line 574
Quoted 10 lines
arch/i386/kernel/smp.c +10
-0+ +/** +* smp_call_function_mask(): Run a function on a set of other CPUs. +* @mask: The set of cpus to run on. Must not include the current cpu. +* @func: The function to run. This must be fast and non-blocking. +* @info: An arbitrary pointer to pass to the function. +* @wait: If true, wait (atomically) until function has completed on other CPUs. +* +* Returns 0 on success, else a negative status code. Does not return until +* remote CPUs are nearly ready to execute <<func>> or are or have finished.
func() or <what>??
and what does "nearly ready" mean?
Quoted 32 lines
arch/i386/kernel/smp.c +15
-10+* +* You must not call this function with disabled interrupts or from a +* hardware interrupt handler or from a bottom half handler. +*/ +int smp_call_function_mask (cpumask_t mask, +void (*func)(void *),void *info, +int wait) +{ +int ret; + +spin_lock (&call_lock); + ret =__smp_call_function_mask (mask, func, info, wait); +spin_unlock (&call_lock); + +return ret; }/** @@ -559,20 +602,43 @@ static void __smp_call_function(void (*f* You must not call this function with disabled interrupts or from a * hardware interrupt handler or from a bottom half handler. */ -int smp_call_function (void (*func) (void *info),void *info,int nonatomic, -int wait) -{ -/* Can deadlock when called with interrupts disabled */ -WARN_ON (irqs_disabled ()); - -/* Holding any lock stops cpus from going down. */ -spin_lock (&call_lock); -__smp_call_function (func, info, nonatomic, wait); -spin_unlock (&call_lock);
arch/i386/kernel/smp.c static void __smp_call_function(void (*f · line 612
Quoted 10 lines
arch/i386/kernel/smp.c +6
-2- -return 0 ; +int smp_call_function (void (*func) (void *info),void *info,int nonatomic, +int wait) +{ +return smp_call_function_mask (cpu_online_map, func, info, wait); }EXPORT_SYMBOL (smp_call_function); + +/*
/**
arch/i386/kernel/smp.c static void __smp_call_function(void (*f · line 619
Quoted 7 lines
arch/i386/kernel/smp.c +7
-0+* smp_call_function_single - Run a function on another CPU +* @func: The function to run. This must be fast and non-blocking. +* @info: An arbitrary pointer to pass to the function. +* @nonatomic: Currently unused. +* @wait: If true, wait until function has completed on other CPUs. +* +* Retrurns 0 on success, else a negative status code.
Returns
arch/i386/kernel/smp.c static void __smp_call_function(void (*f · line 621
Quoted 2 lines
arch/i386/kernel/smp.c +2
-0+* +* Does not return until the remote CPU is nearly ready to execute <func>
Same comments: what is "nearly ready"? and s/<func>/func()/
arch/i386/kernel/smp.c static void __smp_call_function(void (*f · line 622
Quoted 1 line
arch/i386/kernel/smp.c +1
-0+* or is or has executed.
Huh? or what??
Quoted 91 lines
arch/i386/kernel/smp.c +19
-64+*/ +int smp_call_function_single (int cpu,void (*func) (void *info),void *info, +int nonatomic,int wait) +{ +/* prevent preemption and reschedule on another processor */ +int ret; +int me =get_cpu (); +if (cpu == me) { +WARN_ON (1 ); +put_cpu (); +return -EBUSY ; + } + + ret =smp_call_function_mask (cpumask_of_cpu (cpu), func, info, wait); + +put_cpu (); +return ret; +} +EXPORT_SYMBOL (smp_call_function_single);static void stop_this_cpu (void * dummy) {@@ -641,77 +707,6 @@ fastcall void smp_call_function_interrup } } -/* -* this function sends a 'generic call function' IPI to one other CPU -* in the system. -* -* cpu is a standard Linux logical CPU number. -*/ -static void -__smp_call_function_single (int cpu,void (*func) (void *info),void *info, -int nonatomic,int wait) -{ -struct call_data_struct data; -int cpus =1 ; - - data.func = func; - data.info = info; -atomic_set (&data.started,0 ); - data.wait = wait; -if (wait) -atomic_set (&data.finished,0 ); - - call_data = &data; -wmb (); -/* Send a message to all other CPUs and wait for them to respond */ -send_IPI_mask (cpumask_of_cpu (cpu),CALL_FUNCTION_VECTOR ); - -/* Wait for response */ -while (atomic_read (&data.started) != cpus) -cpu_relax (); - -if (!wait) -return ; - -while (atomic_read (&data.finished) != cpus) -cpu_relax (); -} - -/* -* smp_call_function_single - Run a function on another CPU -* @func: The function to run. This must be fast and non-blocking. -* @info: An arbitrary pointer to pass to the function. -* @nonatomic: Currently unused. -* @wait: If true, wait until function has completed on other CPUs. -* -* Retrurns 0 on success, else a negative status code. -* -* Does not return until the remote CPU is nearly ready to execute <func> -* or is or has executed. -*/ - -int smp_call_function_single (int cpu,void (*func) (void *info),void *info, -int nonatomic,int wait) -{ -/* prevent preemption and reschedule on another processor */ -int me =get_cpu (); -if (cpu == me) { -WARN_ON (1 ); -put_cpu (); -return -EBUSY ; - } - -/* Can deadlock when called with interrupts disabled */ -WARN_ON (irqs_disabled ()); - -spin_lock_bh (&call_lock);
arch/i386/kernel/smp.c fastcall void smp_call_function_interrup · line 712
Quoted 10 lines
arch/i386/kernel/smp.c +0
-7-__smp_call_function_single (cpu, func, info, nonatomic, wait); -spin_unlock_bh (&call_lock); -put_cpu (); -return 0 ; -} -EXPORT_SYMBOL (smp_call_function_single); -static int convert_apicid_to_cpu (int apic_id) {int i;
---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***
Quoted 3 lines · Randy Dunlap
func()or <what>??
and what does "nearly ready" mean?
Sorry, I forgot to include your doc updates from last time.
"nearly ready" means that its just about to call the function, but hasn't necessarily done so.
J
Quoted 4 lines · Jeremy Fitzhardinge
smp_call_functionandsmp_call_function_singleare almost complete duplicates of the same logic. This patch combines them by implementing them in terms of the more generalsmp_call_function_mask().
I think I got those already.
-Andi
Quoted 10 lines · Andi Kleen
Quoted 5 lines · Jeremy Fitzhardinge
smp_call_functionandsmp_call_function_singleare almost complete duplicates of the same logic. This patch combines them by implementing them in terms of the more generalsmp_call_function_mask().I think I got those already.
OK. Do you have smp_ops and machine_ops?
There's a doc update patch too:
Subject: Fix smp_call_function* docs
As reported by Randy Dunlap <[email protected]>
--- arch/i386/kernel/smp.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-)
===================================================================
arch/i386/kernel/smp.c +16 -11
@@ -570,8 +570,10 @@ static int __smp_call_function_mask(cpum* @info: An arbitrary pointer to pass to the function. * @wait: If true, wait (atomically) until function has completed on other CPUs. * -* Returns 0 on success, else a negative status code. Does not return until -* remote CPUs are nearly ready to execute <<func>> or are or have finished. +* Returns 0 on success, else a negative status code. +* +* If @wait is true, then returns once @func has returned; otherwise +* it returns just before the target cpu calls @func. * * You must not call this function with disabled interrupts or from a * hardware interrupt handler or from a bottom half handler.
@@ -593,11 +595,13 @@ int smp_call_function_mask(cpumask_t mas* smp_call_function(): Run a function on all other CPUs. * @func: The function to run. This must be fast and non-blocking. * @info: An arbitrary pointer to pass to the function. -* @nonatomic: currently unused. +* @nonatomic: Unused. * @wait: If true, wait (atomically) until function has completed on other CPUs. * -* Returns 0 on success, else a negative status code. Does not return until -* remote CPUs are nearly ready to execute <<func>> or are or have executed. +* Returns 0 on success, else a negative status code. +* +* If @wait is true, then returns once @func has returned; otherwise +* it returns just before the target cpu calls @func. * * You must not call this function with disabled interrupts or from a * hardware interrupt handler or from a bottom half handler.
@@ -609,17 +613,18 @@ int smp_call_function(void (*func) (void }EXPORT_SYMBOL (smp_call_function); -/* +/** * smp_call_function_single - Run a function on another CPU +* @cpu: The target CPU. Cannot be the calling CPU. * @func: The function to run. This must be fast and non-blocking. * @info: An arbitrary pointer to pass to the function. -* @nonatomic: Currently unused. +* @nonatomic: Unused. * @wait: If true, wait until function has completed on other CPUs. * -* Retrurns 0 on success, else a negative status code. -* -* Does not return until the remote CPU is nearly ready to execute <func> -* or is or has executed. +* Returns 0 on success, else a negative status code. +* +* If @wait is true, then returns once @func has returned; otherwise +* it returns just before the target cpu calls @func. */ int smp_call_function_single (int cpu,void (*func) (void *info),void *info,int nonatomic,int wait)
Quoted 9 lines · Jeremy Fitzhardinge
Quoted 8 lines · Andi Kleen
Quoted 5 lines · Jeremy Fitzhardinge
smp_call_functionandsmp_call_function_singleare almost complete duplicates of the same logic. This patch combines them by implementing them in terms of the more generalsmp_call_function_mask().
Quoted 4 lines
Quoted 2 lines
I think I got those already.
OK. Do you have
smp_opsandmachine_ops?
Not yet. Can you resend the current set?
Quoted 1 line
There's a doc update patch too:
Can you send that separately after i sync out please?
Thanks
-Andi
PATCH 1/1 Add smp_ops interface
Subject: Add smp_ops interface
Add a smp_ops interface. This abstracts the API defined by <linux/smp.h> for use within arch/i386. The primary intent is that it be used by a paravirtualizing hypervisor to implement SMP, but it could also be used by non-APIC-using sub-architectures.
This is related to CONFIG_PARAVIRT, but is implemented unconditionally since it is simpler that way and not a highly performance-sensitive interface.
--- arch/i386/kernel/smp.c | 21 +++++++++++++---- arch/i386/kernel/smpboot.c | 8 +++--- include/asm-i386/smp.h | 53 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 9 deletions(-)
===================================================================
arch/i386/kernel/smp.c +16 -5
@@ -483,7 +483,7 @@ void flush_tlb_all(void)* it goes straight through and wastes no time serializing * anything. Worst case is that we lose a reschedule ... */ -void smp_send_reschedule (int cpu) +void native_smp_send_reschedule (int cpu) {WARN_ON (cpu_is_offline (cpu));send_IPI_mask (cpumask_of_cpu (cpu),RESCHEDULE_VECTOR );
@@ -576,9 +576,9 @@ static int __smp_call_function_mask(cpum* You must not call this function with disabled interrupts or from a * hardware interrupt handler or from a bottom half handler. */ -int smp_call_function_mask (cpumask_t mask, -void (*func)(void *),void *info, -int wait) +int native_smp_call_function_mask (cpumask_t mask, +void (*func)(void *),void *info, +int wait) {int ret;
@@ -657,7 +657,7 @@ static void stop_this_cpu (void * dummy)* this function calls the 'stop' function on all other CPUs in the system. */ -void smp_send_stop (void ) +void native_smp_send_stop (void ) {/* Don't deadlock on the call lock in panic */ int nolock = !spin_trylock (&call_lock);
@@ -733,3 +733,14 @@ int safe_smp_processor_id(void)return cpuid >=0 ? cpuid :0 ; } + +struct smp_ops smp_ops = { + .smp_prepare_boot_cpu = native_smp_prepare_boot_cpu, + .smp_prepare_cpus = native_smp_prepare_cpus, + .cpu_up = native_cpu_up, + .smp_cpus_done = native_smp_cpus_done, + + .smp_send_stop = native_smp_send_stop, + .smp_send_reschedule = native_smp_send_reschedule, + .smp_call_function_mask = native_smp_call_function_mask, +};
===================================================================
arch/i386/kernel/smpboot.c +4 -4
@@ -1169,7 +1169,7 @@ static void __init smp_boot_cpus(unsigne/* These are wrappers to interface to the new boot process. Someone who understands all this stuff should rewrite it properly. --RR 15/Jul/02 */ -void __init smp_prepare_cpus (unsigned int max_cpus) +void __init native_smp_prepare_cpus (unsigned int max_cpus) { smp_commenced_mask =cpumask_of_cpu (0 ); cpu_callin_map =cpumask_of_cpu (0 );
@@ -1189,7 +1189,7 @@ static inline void switch_to_new_gdt(voi asm ("mov %0, %%fs" : :"r" (__KERNEL_PERCPU) :"memory" ); } -void __init smp_prepare_boot_cpu (void ) +void __init native_smp_prepare_boot_cpu (void ) {unsigned int cpu =smp_processor_id ();
@@ -1290,7 +1290,7 @@ void __cpu_die(unsigned int cpu) }#endif /* CONFIG_HOTPLUG_CPU */ -int __cpuinit __cpu_up (unsigned int cpu) +int __cpuinit native_cpu_up (unsigned int cpu) {unsigned long flags;#ifdef CONFIG_HOTPLUG_CPU
@@ -1335,7 +1335,7 @@ int __cpuinit __cpu_up(unsigned int cpu)return 0 ; } -void __init smp_cpus_done (unsigned int max_cpus) +void __init native_smp_cpus_done (unsigned int max_cpus) {#ifdef CONFIG_X86_IO_APIC setup_ioapic_dest ();
===================================================================
include/asm-i386/smp.h +53 -0
59 lines not on this page · raw message
PATCH 1/1 Add machine_ops interface to abstract halting and rebooting
In reply to Andi Kleenmachine_ops is an interface for the machine_* functions defined in <linux/reboot.h>. This is intended to allow hypervisors to intercept the reboot process, but it could be used to implement other x86 subarchtecture reboots.
--- arch/i386/kernel/apm.c | 3 -- arch/i386/kernel/reboot.c | 49 +++++++++++++++++++++++++++++++++++++-------- include/asm-i386/reboot.h | 20 ++++++++++++++++++ 3 files changed, 62 insertions(+), 10 deletions(-)
===================================================================
arch/i386/kernel/apm.c +1 -2
@@ -233,10 +233,9 @@#include <asm/desc.h> #include <asm/i8253.h> #include <asm/paravirt.h> +#include <asm/reboot.h> #include "io_ports.h" - -extern void machine_real_restart (unsigned char *,int );#if defined(CONFIG_APM_DISPLAY_BLANK ) && defined(CONFIG_VT )extern int (*console_blank_hook)(int );
===================================================================
arch/i386/kernel/reboot.c +41 -8
81 lines not on this page · raw message
===================================================================
include/asm-i386/reboot.h new file +20 -0
@@ -0,0 +1,20 @@ +#ifndef _ASM_REBOOT_H +#define _ASM_REBOOT_H + +struct pt_regs ; + +struct machine_ops +{ +void (*restart)(char *cmd); +void (*halt)(void ); +void (*power_off)(void ); +void (*shutdown)(void ); +void (*crash_shutdown)(struct pt_regs *); +void (*emergency_restart)(void ); +}; + +extern struct machine_ops machine_ops; + +void machine_real_restart (unsigned char *code,int length); + +#endif /* _ASM_REBOOT_H */
Re: [PATCH] Add machine_ops interface to abstract halting and rebooting
Quoted 4 lines · Jeremy Fitzhardinge
machine_opsis an interface for the machine_* functions defined in <linux/reboot.h>. This is intended to allow hypervisors to intercept the reboot process, but it could be used to implement other x86 subarchtecture reboots.
Both patches added thanks
-Andi
Re: [PATCH] Add machine_ops interface to abstract halting and rebooting
Quoted 10 lines · Andi Kleen
Quoted 5 lines · Jeremy Fitzhardinge
machine_opsis an interface for the machine_* functions defined in <linux/reboot.h>. This is intended to allow hypervisors to intercept the reboot process, but it could be used to implement other x86 subarchtecture reboots.Both patches added thanks
I presume you've also got the reboot-fixups cleanup patch?
J
Re: [PATCH] Add machine_ops interface to abstract halting and rebooting
Quoted 9 lines · Jeremy Fitzhardinge
Quoted 8 lines · Andi Kleen
Quoted 5 lines · Jeremy Fitzhardinge
machine_opsis an interface for the machine_* functions defined in <linux/reboot.h>. This is intended to allow hypervisors to intercept the reboot process, but it could be used to implement other x86 subarchtecture reboots.
Quoted 4 lines
Quoted 2 lines
Both patches added thanks
I presume you've also got the reboot-fixups cleanup patch?
No, please resend too
-Andi
PATCH 1/1 Clean up mach_reboot_fixups
Two cleanups:
- reboot_fixups.h is entirely i386-dependent, so put it in asm-i386
- use a weak version rather than ifdeffery
[ Andi - the machine_ops probably depends on this, but only in a minor
context-clash way. ]
--- arch/i386/kernel/reboot.c | 6 +++++- arch/i386/kernel/reboot_fixups.c | 2 +- include/asm-i386/reboot_fixups.h | 6 ++++++ include/linux/reboot_fixups.h | 10 ---------- 4 files changed, 12 insertions(+), 12 deletions(-)
===================================================================
arch/i386/kernel/reboot.c +5 -1
@@ -17,7 +17,7 @@#include <asm/apic.h> #include <asm/desc.h> #include "mach_reboot.h" -#include <linux/reboot_fixups.h> +#include <asm/reboot_fixups.h> /* * Power off function, if any
@@ -314,6 +314,10 @@ void machine_shutdown(void)#ifdef CONFIG_X86_IO_APIC disable_IO_APIC ();#endif +} + +void __attribute__((weak))mach_reboot_fixups (void ) +{ }void machine_emergency_restart (void )
===================================================================
arch/i386/kernel/reboot_fixups.c +1 -1
@@ -10,7 +10,7 @@#include <asm/delay.h> #include <linux/pci.h> -#include <linux/reboot_fixups.h> +#include <asm/reboot_fixups.h> static void cs5530a_warm_reset (struct pci_dev *dev) {
===================================================================
include/asm-i386/reboot_fixups.h new file +6 -0
@@ -0,0 +1,6 @@ +#ifndef _LINUX_REBOOT_FIXUPS_H +#define _LINUX_REBOOT_FIXUPS_H + +extern void mach_reboot_fixups (void ); + +#endif /* _LINUX_REBOOT_FIXUPS_H */
===================================================================
include/linux/reboot_fixups.h deleted +0 -10
@@ -1,10 +0,0 @@ -#ifndef _LINUX_REBOOT_FIXUPS_H -#define _LINUX_REBOOT_FIXUPS_H - -#ifdef CONFIG_X86_REBOOTFIXUPS -extern void mach_reboot_fixups (void ); -#else -#define mach_reboot_fixups () ((void)(0)) -#endif - -#endif /* _LINUX_REBOOT_FIXUPS_H */
Re: [PATCH] Clean up mach_reboot_fixups
Quoted 6 lines · Jeremy Fitzhardinge
Two cleanups:
-reboot_fixups.his entirely i386-dependent, so put it in asm-i386
- use a weak version rather than ifdeffery[ Andi - the
machine_opsprobably depends on this, but only in a minor
context-clash way. ]
Sorry I actually had it already, but forgot about it
-Andi