Discussion:
[Xen-changelog] [xen staging] x86/genapic: remove indirection from genapic hook accesses
p***@xen.org
2018-11-08 15:11:04 UTC
Permalink
commit c0bb0d88436581f589946b3f76d19fc26546ff66
Author: Jan Beulich <***@suse.com>
AuthorDate: Thu Nov 8 15:59:14 2018 +0100
Commit: Jan Beulich <***@suse.com>
CommitDate: Thu Nov 8 15:59:14 2018 +0100

x86/genapic: remove indirection from genapic hook accesses

Instead of loading a pointer at each use site, have a single runtime
instance of struct genapic, copying into it from the individual
instances. The individual instances can this way also be moved to .init
(also adjust apic_probe[] at this occasion).

Signed-off-by: Jan Beulich <***@suse.com>
Reviewed-by: Wei Liu <***@citrix.com>
Acked-by: Andrew Cooper <***@citrix.com>
---
xen/arch/x86/apic.c | 4 ++--
xen/arch/x86/genapic/bigsmp.c | 2 +-
xen/arch/x86/genapic/default.c | 2 +-
xen/arch/x86/genapic/probe.c | 30 +++++++++++++---------------
xen/arch/x86/genapic/x2apic.c | 6 +++---
xen/arch/x86/mpparse.c | 3 ++-
xen/arch/x86/smp.c | 4 ++--
xen/include/asm-x86/genapic.h | 3 ++-
xen/include/asm-x86/mach-generic/mach_apic.h | 12 +++++------
9 files changed, 33 insertions(+), 33 deletions(-)

diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c
index df6aea75ab..7120107b0c 100644
--- a/xen/arch/x86/apic.c
+++ b/xen/arch/x86/apic.c
@@ -944,8 +944,8 @@ void __init x2apic_bsp_setup(void)

force_iommu = 1;

- genapic = apic_x2apic_probe();
- printk("Switched to APIC driver %s.\n", genapic->name);
+ genapic = *apic_x2apic_probe();
+ printk("Switched to APIC driver %s.\n", genapic.name);

if ( !x2apic_enabled )
{
diff --git a/xen/arch/x86/genapic/bigsmp.c b/xen/arch/x86/genapic/bigsmp.c
index 294902ba85..91a973ac16 100644
--- a/xen/arch/x86/genapic/bigsmp.c
+++ b/xen/arch/x86/genapic/bigsmp.c
@@ -42,7 +42,7 @@ static __init int probe_bigsmp(void)
return def_to_bigsmp;
}

-const struct genapic apic_bigsmp = {
+const struct genapic __initconstrel apic_bigsmp = {
APIC_INIT("bigsmp", probe_bigsmp),
GENAPIC_PHYS
};
diff --git a/xen/arch/x86/genapic/default.c b/xen/arch/x86/genapic/default.c
index 4d1a06fb82..53ebf20a3f 100644
--- a/xen/arch/x86/genapic/default.c
+++ b/xen/arch/x86/genapic/default.c
@@ -20,7 +20,7 @@ static __init int probe_default(void)
return 1;
}

-const struct genapic apic_default = {
+const struct genapic __initconstrel apic_default = {
APIC_INIT("default", probe_default),
GENAPIC_FLAT
};
diff --git a/xen/arch/x86/genapic/probe.c b/xen/arch/x86/genapic/probe.c
index af3745aa21..6aa7eb7b1c 100644
--- a/xen/arch/x86/genapic/probe.c
+++ b/xen/arch/x86/genapic/probe.c
@@ -15,11 +15,9 @@
#include <asm/mach-generic/mach_apic.h>
#include <asm/setup.h>

-extern const struct genapic apic_bigsmp;
+struct genapic __read_mostly genapic;

-const struct genapic *__read_mostly genapic;
-
-const struct genapic *apic_probe[] __initdata = {
+const struct genapic *const __initconstrel apic_probe[] = {
&apic_bigsmp,
&apic_default, /* must be last */
NULL,
@@ -36,11 +34,11 @@ void __init generic_bigsmp_probe(void)
* - we find more than 8 CPUs in acpi LAPIC listing with xAPIC support
*/

- if (!cmdline_apic && genapic == &apic_default)
+ if (!cmdline_apic && genapic.name == apic_default.name)
if (apic_bigsmp.probe()) {
- genapic = &apic_bigsmp;
+ genapic = apic_bigsmp;
printk(KERN_INFO "Overriding APIC driver with %s\n",
- genapic->name);
+ genapic.name);
}
}

@@ -50,7 +48,7 @@ static int __init genapic_apic_force(const char *str)

for (i = 0; apic_probe[i]; i++)
if (!strcmp(apic_probe[i]->name, str)) {
- genapic = apic_probe[i];
+ genapic = *apic_probe[i];
rc = 0;
}

@@ -66,18 +64,18 @@ void __init generic_apic_probe(void)
record_boot_APIC_mode();

check_x2apic_preenabled();
- cmdline_apic = changed = (genapic != NULL);
+ cmdline_apic = changed = !!genapic.name;

for (i = 0; !changed && apic_probe[i]; i++) {
if (apic_probe[i]->probe()) {
changed = 1;
- genapic = apic_probe[i];
+ genapic = *apic_probe[i];
}
}
if (!changed)
- genapic = &apic_default;
+ genapic = apic_default;

- printk(KERN_INFO "Using APIC driver %s\n", genapic->name);
+ printk(KERN_INFO "Using APIC driver %s\n", genapic.name);
}

/* These functions can switch the APIC even after the initial ->probe() */
@@ -88,9 +86,9 @@ int __init mps_oem_check(struct mp_config_table *mpc, char *oem, char *productid
for (i = 0; apic_probe[i]; ++i) {
if (apic_probe[i]->mps_oem_check(mpc,oem,productid)) {
if (!cmdline_apic) {
- genapic = apic_probe[i];
+ genapic = *apic_probe[i];
printk(KERN_INFO "Switched to APIC driver `%s'.\n",
- genapic->name);
+ genapic.name);
}
return 1;
}
@@ -104,9 +102,9 @@ int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
for (i = 0; apic_probe[i]; ++i) {
if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) {
if (!cmdline_apic) {
- genapic = apic_probe[i];
+ genapic = *apic_probe[i];
printk(KERN_INFO "Switched to APIC driver `%s'.\n",
- genapic->name);
+ genapic.name);
}
return 1;
}
diff --git a/xen/arch/x86/genapic/x2apic.c b/xen/arch/x86/genapic/x2apic.c
index 5df70b0cf6..7e2e89d881 100644
--- a/xen/arch/x86/genapic/x2apic.c
+++ b/xen/arch/x86/genapic/x2apic.c
@@ -163,7 +163,7 @@ static void send_IPI_mask_x2apic_cluster(const cpumask_t *cpumask, int vector)
local_irq_restore(flags);
}

-static const struct genapic apic_x2apic_phys = {
+static const struct genapic __initconstrel apic_x2apic_phys = {
APIC_INIT("x2apic_phys", NULL),
.int_delivery_mode = dest_Fixed,
.int_dest_mode = 0 /* physical delivery */,
@@ -175,7 +175,7 @@ static const struct genapic apic_x2apic_phys = {
.send_IPI_self = send_IPI_self_x2apic
};

-static const struct genapic apic_x2apic_cluster = {
+static const struct genapic __initconstrel apic_x2apic_cluster = {
APIC_INIT("x2apic_cluster", NULL),
.int_delivery_mode = dest_LowestPrio,
.int_dest_mode = 1 /* logical delivery */,
@@ -259,6 +259,6 @@ void __init check_x2apic_preenabled(void)
{
printk("x2APIC mode is already enabled by BIOS.\n");
x2apic_enabled = 1;
- genapic = apic_x2apic_probe();
+ genapic = *apic_x2apic_probe();
}
}
diff --git a/xen/arch/x86/mpparse.c b/xen/arch/x86/mpparse.c
index f2b6d6bdab..16c93a935d 100644
--- a/xen/arch/x86/mpparse.c
+++ b/xen/arch/x86/mpparse.c
@@ -162,7 +162,8 @@ static int MP_processor_info_x(struct mpc_config_processor *m,
return -ENOSPC;
}

- if (num_processors >= 8 && hotplug && genapic == &apic_default) {
+ if (num_processors >= 8 && hotplug
+ && genapic.name == apic_default.name) {
printk(KERN_WARNING "WARNING: CPUs limit of 8 reached."
" Processor ignored.\n");
return -ENOSPC;
diff --git a/xen/arch/x86/smp.c b/xen/arch/x86/smp.c
index 63e819ca38..b15d4f05df 100644
--- a/xen/arch/x86/smp.c
+++ b/xen/arch/x86/smp.c
@@ -29,12 +29,12 @@

void send_IPI_mask(const cpumask_t *mask, int vector)
{
- genapic->send_IPI_mask(mask, vector);
+ genapic.send_IPI_mask(mask, vector);
}

void send_IPI_self(int vector)
{
- genapic->send_IPI_self(vector);
+ genapic.send_IPI_self(vector);
}

/*
diff --git a/xen/include/asm-x86/genapic.h b/xen/include/asm-x86/genapic.h
index 8aeb28ecda..5aa35ceb5f 100644
--- a/xen/include/asm-x86/genapic.h
+++ b/xen/include/asm-x86/genapic.h
@@ -47,8 +47,9 @@ struct genapic {
APICFUNC(mps_oem_check), \
APICFUNC(acpi_madt_oem_check)

-extern const struct genapic *genapic;
+extern struct genapic genapic;
extern const struct genapic apic_default;
+extern const struct genapic apic_bigsmp;

void send_IPI_self_legacy(uint8_t vector);

diff --git a/xen/include/asm-x86/mach-generic/mach_apic.h b/xen/include/asm-x86/mach-generic/mach_apic.h
index 3fed22c81a..0984554d36 100644
--- a/xen/include/asm-x86/mach-generic/mach_apic.h
+++ b/xen/include/asm-x86/mach-generic/mach_apic.h
@@ -10,13 +10,13 @@
#define esr_disable (0)

/* The following are dependent on APIC delivery mode (logical vs. physical). */
-#define INT_DELIVERY_MODE (genapic->int_delivery_mode)
-#define INT_DEST_MODE (genapic->int_dest_mode)
+#define INT_DELIVERY_MODE (genapic.int_delivery_mode)
+#define INT_DEST_MODE (genapic.int_dest_mode)
#define TARGET_CPUS ((const typeof(cpu_online_map) *)&cpu_online_map)
-#define init_apic_ldr (genapic->init_apic_ldr)
-#define clustered_apic_check (genapic->clustered_apic_check)
-#define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid)
-#define vector_allocation_cpumask(cpu) (genapic->vector_allocation_cpumask(cpu))
+#define init_apic_ldr (genapic.init_apic_ldr)
+#define clustered_apic_check (genapic.clustered_apic_check)
+#define cpu_mask_to_apicid (genapic.cpu_mask_to_apicid)
+#define vector_allocation_cpumask(cpu) (genapic.vector_allocation_cpumask(cpu))

static inline void enable_apic_mode(void)
{
--
generated by git-patchbot for /home/xen/git/xen.git#staging

Loading...