Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dac5f412 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

x86, apic: untangle the send_IPI_*() jungle



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: default avatarIngo Molnar <mingo@elte.hu>
parent debccb3e
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
#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 */
+8 −8
Original line number Diff line number Diff line
#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 */
+2 −2
Original line number Diff line number Diff line
@@ -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;
+20 −18
Original line number Diff line number Diff line
@@ -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
@@ -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;

@@ -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
@@ -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);
}

+0 −1
Original line number Diff line number Diff line
@@ -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
Loading