Re: [Xen-devel] [PATCH v3 5/9] x86/genapic: remove indirection from genapic hook accesses

2018-09-21 Thread Wei Liu
On Tue, Sep 11, 2018 at 07:35:04AM -0600, Jan Beulich wrote:
> 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 

Reviewed-by: Wei Liu 

___
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

[Xen-devel] [PATCH v3 5/9] x86/genapic: remove indirection from genapic hook accesses

2018-09-11 Thread Jan Beulich
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 

--- a/xen/arch/x86/apic.c
+++ b/xen/arch/x86/apic.c
@@ -943,8 +943,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 )
 {
--- 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
 };
--- 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
 };
--- a/xen/arch/x86/genapic/probe.c
+++ b/xen/arch/x86/genapic/probe.c
@@ -15,11 +15,9 @@
 #include 
 #include 
 
-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[] = {
_bigsmp, 
_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 == _default)
+   if (!cmdline_apic && genapic.name == apic_default.name)
if (apic_bigsmp.probe()) {
-   genapic = _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(con
 
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 = _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_confi
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
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;
} 
--- 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
 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 =