Commit 43931d35 authored by Thomas Gleixner's avatar Thomas Gleixner

x86/apic/x2apic: Implement IPI shorthands support

All callers of apic->send_IPI_all() and apic->send_IPI_allbutself() contain
the decision logic for shorthand invocation already and invoke
send_IPI_mask() if the prereqisites are not satisfied.

Implement shorthand support for x2apic.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20190722105221.134696837@linutronix.de
parent 2510d09e
...@@ -23,6 +23,7 @@ unsigned int x2apic_get_apic_id(unsigned long id); ...@@ -23,6 +23,7 @@ unsigned int x2apic_get_apic_id(unsigned long id);
u32 x2apic_set_apic_id(unsigned int id); u32 x2apic_set_apic_id(unsigned int id);
int x2apic_phys_pkg_id(int initial_apicid, int index_msb); int x2apic_phys_pkg_id(int initial_apicid, int index_msb);
void x2apic_send_IPI_self(int vector); void x2apic_send_IPI_self(int vector);
void __x2apic_send_IPI_shorthand(int vector, u32 which);
/* IPI */ /* IPI */
......
...@@ -82,12 +82,12 @@ x2apic_send_IPI_mask_allbutself(const struct cpumask *mask, int vector) ...@@ -82,12 +82,12 @@ x2apic_send_IPI_mask_allbutself(const struct cpumask *mask, int vector)
static void x2apic_send_IPI_allbutself(int vector) static void x2apic_send_IPI_allbutself(int vector)
{ {
__x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLBUT); __x2apic_send_IPI_shorthand(vector, APIC_DEST_ALLBUT);
} }
static void x2apic_send_IPI_all(int vector) static void x2apic_send_IPI_all(int vector)
{ {
__x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLINC); __x2apic_send_IPI_shorthand(vector, APIC_DEST_ALLINC);
} }
static u32 x2apic_calc_apicid(unsigned int cpu) static u32 x2apic_calc_apicid(unsigned int cpu)
......
...@@ -75,12 +75,12 @@ static void ...@@ -75,12 +75,12 @@ static void
static void x2apic_send_IPI_allbutself(int vector) static void x2apic_send_IPI_allbutself(int vector)
{ {
__x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLBUT); __x2apic_send_IPI_shorthand(vector, APIC_DEST_ALLBUT);
} }
static void x2apic_send_IPI_all(int vector) static void x2apic_send_IPI_all(int vector)
{ {
__x2apic_send_IPI_mask(cpu_online_mask, vector, APIC_DEST_ALLINC); __x2apic_send_IPI_shorthand(vector, APIC_DEST_ALLINC);
} }
static void init_x2apic_ldr(void) static void init_x2apic_ldr(void)
...@@ -112,6 +112,14 @@ void __x2apic_send_IPI_dest(unsigned int apicid, int vector, unsigned int dest) ...@@ -112,6 +112,14 @@ void __x2apic_send_IPI_dest(unsigned int apicid, int vector, unsigned int dest)
native_x2apic_icr_write(cfg, apicid); native_x2apic_icr_write(cfg, apicid);
} }
void __x2apic_send_IPI_shorthand(int vector, u32 which)
{
unsigned long cfg = __prepare_ICR(which, vector, 0);
x2apic_wrmsr_fence();
native_x2apic_icr_write(cfg, 0);
}
unsigned int x2apic_get_apic_id(unsigned long id) unsigned int x2apic_get_apic_id(unsigned long id)
{ {
return id; return id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment