Skip to content

Commit

Permalink
x86, apic: untangle the send_IPI_*() jungle
Browse files Browse the repository at this point in the history
Our send_IPI_*() methods and definitions are a twisted mess: the same
symbol is defined to different things depending on .config details,
in a non-transparent way.

 - spread out the quirks into separately named per apic driver methods

 - prefix the standard PC methods with default_

 - get rid of wrapper macro obfuscation

 - clean up various details

Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Ingo Molnar committed Jan 28, 2009
1 parent debccb3 commit dac5f41
Show file tree
Hide file tree
Showing 26 changed files with 178 additions and 180 deletions.
16 changes: 8 additions & 8 deletions arch/x86/include/asm/bigsmp/ipi.h
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
#ifndef __ASM_MACH_IPI_H
#define __ASM_MACH_IPI_H

void send_IPI_mask_sequence(const struct cpumask *mask, int vector);
void send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
void default_send_IPI_mask_sequence(const struct cpumask *mask, int vector);
void default_send_IPI_mask_allbutself(const struct cpumask *mask, int vector);

static inline void send_IPI_mask(const struct cpumask *mask, int vector)
static inline void default_send_IPI_mask(const struct cpumask *mask, int vector)
{
send_IPI_mask_sequence(mask, vector);
default_send_IPI_mask_sequence(mask, vector);
}

static inline void send_IPI_allbutself(int vector)
static inline void bigsmp_send_IPI_allbutself(int vector)
{
send_IPI_mask_allbutself(cpu_online_mask, vector);
default_send_IPI_mask_allbutself(cpu_online_mask, vector);
}

static inline void send_IPI_all(int vector)
static inline void bigsmp_send_IPI_all(int vector)
{
send_IPI_mask(cpu_online_mask, vector);
default_send_IPI_mask(cpu_online_mask, vector);
}

#endif /* __ASM_MACH_IPI_H */
16 changes: 8 additions & 8 deletions arch/x86/include/asm/es7000/ipi.h
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
#ifndef __ASM_ES7000_IPI_H
#define __ASM_ES7000_IPI_H

void send_IPI_mask_sequence(const struct cpumask *mask, int vector);
void send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
void default_send_IPI_mask_sequence(const struct cpumask *mask, int vector);
void default_send_IPI_mask_allbutself(const struct cpumask *mask, int vector);

static inline void send_IPI_mask(const struct cpumask *mask, int vector)
static inline void es7000_send_IPI_mask(const struct cpumask *mask, int vector)
{
send_IPI_mask_sequence(mask, vector);
default_send_IPI_mask_sequence(mask, vector);
}

static inline void send_IPI_allbutself(int vector)
static inline void es7000_send_IPI_allbutself(int vector)
{
send_IPI_mask_allbutself(cpu_online_mask, vector);
default_send_IPI_mask_allbutself(cpu_online_mask, vector);
}

static inline void send_IPI_all(int vector)
static inline void es7000_send_IPI_all(int vector)
{
send_IPI_mask(cpu_online_mask, vector);
es7000_send_IPI_mask(cpu_online_mask, vector);
}

#endif /* __ASM_ES7000_IPI_H */
4 changes: 2 additions & 2 deletions arch/x86/include/asm/hw_irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ extern void enable_IO_APIC(void);

/* IPI functions */
#ifdef CONFIG_X86_32
extern void send_IPI_self(int vector);
extern void default_send_IPI_self(int vector);
#endif
extern void send_IPI(int dest, int vector);
extern void default_send_IPI(int dest, int vector);

/* Statistics */
extern atomic_t irq_err_count;
Expand Down
38 changes: 20 additions & 18 deletions arch/x86/include/asm/ipi.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,9 @@ static inline void __xapic_wait_icr_idle(void)
cpu_relax();
}

static inline void __send_IPI_shortcut(unsigned int shortcut, int vector,
unsigned int dest)
static inline void
__default_send_IPI_shortcut(unsigned int shortcut,
int vector, unsigned int dest)
{
/*
* Subtle. In the case of the 'never do double writes' workaround
Expand Down Expand Up @@ -87,8 +88,8 @@ static inline void __send_IPI_shortcut(unsigned int shortcut, int vector,
* This is used to send an IPI with no shorthand notation (the destination is
* specified in bits 56 to 63 of the ICR).
*/
static inline void __send_IPI_dest_field(unsigned int mask, int vector,
unsigned int dest)
static inline void
__default_send_IPI_dest_field(unsigned int mask, int vector, unsigned int dest)
{
unsigned long cfg;

Expand Down Expand Up @@ -117,11 +118,11 @@ static inline void __send_IPI_dest_field(unsigned int mask, int vector,
native_apic_mem_write(APIC_ICR, cfg);
}

static inline void send_IPI_mask_sequence(const struct cpumask *mask,
int vector)
static inline void
default_send_IPI_mask_sequence(const struct cpumask *mask, int vector)
{
unsigned long flags;
unsigned long query_cpu;
unsigned long flags;

/*
* Hack. The clustered APIC addressing mode doesn't allow us to send
Expand All @@ -130,27 +131,28 @@ static inline void send_IPI_mask_sequence(const struct cpumask *mask,
*/
local_irq_save(flags);
for_each_cpu(query_cpu, mask) {
__send_IPI_dest_field(per_cpu(x86_cpu_to_apicid, query_cpu),
vector, APIC_DEST_PHYSICAL);
__default_send_IPI_dest_field(per_cpu(x86_cpu_to_apicid,
query_cpu), vector, APIC_DEST_PHYSICAL);
}
local_irq_restore(flags);
}

static inline void send_IPI_mask_allbutself(const struct cpumask *mask,
int vector)
static inline void
default_send_IPI_mask_allbutself(const struct cpumask *mask, int vector)
{
unsigned long flags;
unsigned int query_cpu;
unsigned int this_cpu = smp_processor_id();
unsigned int query_cpu;
unsigned long flags;

/* See Hack comment above */

local_irq_save(flags);
for_each_cpu(query_cpu, mask)
if (query_cpu != this_cpu)
__send_IPI_dest_field(
per_cpu(x86_cpu_to_apicid, query_cpu),
vector, APIC_DEST_PHYSICAL);
for_each_cpu(query_cpu, mask) {
if (query_cpu == this_cpu)
continue;
__default_send_IPI_dest_field(per_cpu(x86_cpu_to_apicid,
query_cpu), vector, APIC_DEST_PHYSICAL);
}
local_irq_restore(flags);
}

Expand Down
1 change: 0 additions & 1 deletion arch/x86/include/asm/mach-default/mach_apic.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ static inline const struct cpumask *default_target_cpus(void)
#ifdef CONFIG_X86_64
#include <asm/genapic.h>
#define read_apic_id() (apic->get_apic_id(apic_read(APIC_ID)))
#define send_IPI_self (apic->send_IPI_self)
#define wakeup_secondary_cpu (apic->wakeup_cpu)
extern void default_setup_apic_routing(void);
#else
Expand Down
40 changes: 17 additions & 23 deletions arch/x86/include/asm/mach-default/mach_ipi.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,45 +4,40 @@
/* Avoid include hell */
#define NMI_VECTOR 0x02

void send_IPI_mask_bitmask(const struct cpumask *mask, int vector);
void send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
void __send_IPI_shortcut(unsigned int shortcut, int vector);
void default_send_IPI_mask_bitmask(const struct cpumask *mask, int vector);
void default_send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
void __default_send_IPI_shortcut(unsigned int shortcut, int vector);

extern int no_broadcast;

#ifdef CONFIG_X86_64
#include <asm/genapic.h>
#define send_IPI_mask (apic->send_IPI_mask)
#define send_IPI_mask_allbutself (apic->send_IPI_mask_allbutself)
#else
static inline void send_IPI_mask(const struct cpumask *mask, int vector)
static inline void default_send_IPI_mask(const struct cpumask *mask, int vector)
{
send_IPI_mask_bitmask(mask, vector);
default_send_IPI_mask_bitmask(mask, vector);
}
void send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
void default_send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
#endif

static inline void __local_send_IPI_allbutself(int vector)
static inline void __default_local_send_IPI_allbutself(int vector)
{
if (no_broadcast || vector == NMI_VECTOR)
send_IPI_mask_allbutself(cpu_online_mask, vector);
apic->send_IPI_mask_allbutself(cpu_online_mask, vector);
else
__send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
__default_send_IPI_shortcut(APIC_DEST_ALLBUT, vector);
}

static inline void __local_send_IPI_all(int vector)
static inline void __default_local_send_IPI_all(int vector)
{
if (no_broadcast || vector == NMI_VECTOR)
send_IPI_mask(cpu_online_mask, vector);
apic->send_IPI_mask(cpu_online_mask, vector);
else
__send_IPI_shortcut(APIC_DEST_ALLINC, vector);
__default_send_IPI_shortcut(APIC_DEST_ALLINC, vector);
}

#ifdef CONFIG_X86_64
#define send_IPI_allbutself (apic->send_IPI_allbutself)
#define send_IPI_all (apic->send_IPI_all)
#else
static inline void send_IPI_allbutself(int vector)
#ifdef CONFIG_X86_32
static inline void default_send_IPI_allbutself(int vector)
{
/*
* if there are no other CPUs in the system then we get an APIC send
Expand All @@ -51,13 +46,12 @@ static inline void send_IPI_allbutself(int vector)
if (!(num_online_cpus() > 1))
return;

__local_send_IPI_allbutself(vector);
return;
__default_local_send_IPI_allbutself(vector);
}

static inline void send_IPI_all(int vector)
static inline void default_send_IPI_all(int vector)
{
__local_send_IPI_all(vector);
__default_local_send_IPI_all(vector);
}
#endif

Expand Down
4 changes: 0 additions & 4 deletions arch/x86/include/asm/mach-generic/mach_ipi.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,4 @@

#include <asm/genapic.h>

#define send_IPI_mask (apic->send_IPI_mask)
#define send_IPI_allbutself (apic->send_IPI_allbutself)
#define send_IPI_all (apic->send_IPI_all)

#endif /* _ASM_X86_MACH_GENERIC_MACH_IPI_H */
16 changes: 8 additions & 8 deletions arch/x86/include/asm/numaq/ipi.h
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
#ifndef __ASM_NUMAQ_IPI_H
#define __ASM_NUMAQ_IPI_H

void send_IPI_mask_sequence(const struct cpumask *mask, int vector);
void send_IPI_mask_allbutself(const struct cpumask *mask, int vector);
void default_send_IPI_mask_sequence(const struct cpumask *mask, int vector);
void default_send_IPI_mask_allbutself(const struct cpumask *mask, int vector);

static inline void send_IPI_mask(const struct cpumask *mask, int vector)
static inline void numaq_send_IPI_mask(const struct cpumask *mask, int vector)
{
send_IPI_mask_sequence(mask, vector);
default_send_IPI_mask_sequence(mask, vector);
}

static inline void send_IPI_allbutself(int vector)
static inline void numaq_send_IPI_allbutself(int vector)
{
send_IPI_mask_allbutself(cpu_online_mask, vector);
default_send_IPI_mask_allbutself(cpu_online_mask, vector);
}

static inline void send_IPI_all(int vector)
static inline void numaq_send_IPI_all(int vector)
{
send_IPI_mask(cpu_online_mask, vector);
numaq_send_IPI_mask(cpu_online_mask, vector);
}

#endif /* __ASM_NUMAQ_IPI_H */
16 changes: 8 additions & 8 deletions arch/x86/include/asm/summit/ipi.h
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
#ifndef __ASM_SUMMIT_IPI_H
#define __ASM_SUMMIT_IPI_H

void send_IPI_mask_sequence(const cpumask_t *mask, int vector);
void send_IPI_mask_allbutself(const cpumask_t *mask, int vector);
void default_send_IPI_mask_sequence(const cpumask_t *mask, int vector);
void default_send_IPI_mask_allbutself(const cpumask_t *mask, int vector);

static inline void send_IPI_mask(const cpumask_t *mask, int vector)
static inline void summit_send_IPI_mask(const cpumask_t *mask, int vector)
{
send_IPI_mask_sequence(mask, vector);
default_send_IPI_mask_sequence(mask, vector);
}

static inline void send_IPI_allbutself(int vector)
static inline void summit_send_IPI_allbutself(int vector)
{
cpumask_t mask = cpu_online_map;
cpu_clear(smp_processor_id(), mask);

if (!cpus_empty(mask))
send_IPI_mask(&mask, vector);
summit_send_IPI_mask(&mask, vector);
}

static inline void send_IPI_all(int vector)
static inline void summit_send_IPI_all(int vector)
{
send_IPI_mask(&cpu_online_map, vector);
summit_send_IPI_mask(&cpu_online_map, vector);
}

#endif /* __ASM_SUMMIT_IPI_H */
2 changes: 1 addition & 1 deletion arch/x86/kernel/apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ static void lapic_timer_setup(enum clock_event_mode mode,
static void lapic_timer_broadcast(const struct cpumask *mask)
{
#ifdef CONFIG_SMP
send_IPI_mask(mask, LOCAL_TIMER_VECTOR);
apic->send_IPI_mask(mask, LOCAL_TIMER_VECTOR);
#endif
}

Expand Down
2 changes: 1 addition & 1 deletion arch/x86/kernel/genapic_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ void __init default_setup_apic_routing(void)

void apic_send_IPI_self(int vector)
{
__send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL);
__default_send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL);
}

int __init default_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
Expand Down
Loading

0 comments on commit dac5f41

Please sign in to comment.