OSDN Git Service

x86/apic: Reorganize struct apic
authorThomas Gleixner <tglx@linutronix.de>
Wed, 13 Sep 2017 21:29:23 +0000 (23:29 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 25 Sep 2017 18:51:51 +0000 (20:51 +0200)
struct apic has just grown over time by adding function pointers in random
places. Reorganize it so it becomes more cache line friendly.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Juergen Gross <jgross@suse.com>
Tested-by: Yu Chen <yu.c.chen@intel.com>
Acked-by: Juergen Gross <jgross@suse.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Alok Kataria <akataria@vmware.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Rui Zhang <rui.zhang@intel.com>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Len Brown <lenb@kernel.org>
Link: https://lkml.kernel.org/r/20170913213153.913642524@linutronix.de
arch/x86/include/asm/apic.h

index 1081cfb..e3e0883 100644 (file)
@@ -274,73 +274,63 @@ struct irq_data;
  * James Cleverdon.
  */
 struct apic {
-       char *name;
-
-       int (*probe)(void);
-       int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
-       int (*apic_id_valid)(int apicid);
-       int (*apic_id_registered)(void);
-
-       u32 irq_delivery_mode;
-       u32 irq_dest_mode;
-
+       /* Hotpath functions first */
+       void    (*eoi_write)(u32 reg, u32 v);
+       void    (*native_eoi_write)(u32 reg, u32 v);
+       void    (*write)(u32 reg, u32 v);
+       u32     (*read)(u32 reg);
+
+       /* IPI related functions */
+       void    (*wait_icr_idle)(void);
+       u32     (*safe_wait_icr_idle)(void);
+
+       void    (*send_IPI)(int cpu, int vector);
+       void    (*send_IPI_mask)(const struct cpumask *mask, int vector);
+       void    (*send_IPI_mask_allbutself)(const struct cpumask *msk, int vec);
+       void    (*send_IPI_allbutself)(int vector);
+       void    (*send_IPI_all)(int vector);
+       void    (*send_IPI_self)(int vector);
+
+       /* dest_logical is used by the IPI functions */
+       u32     dest_logical;
+       u32     disable_esr;
+       u32     irq_delivery_mode;
+       u32     irq_dest_mode;
+
+       /* Functions and data related to vector allocation */
        const struct cpumask *(*target_cpus)(void);
+       void    (*vector_allocation_domain)(int cpu, struct cpumask *retmask,
+                                           const struct cpumask *mask);
+       int     (*cpu_mask_to_apicid)(const struct cpumask *cpumask,
+                                     struct irq_data *irqdata,
+                                     unsigned int *apicid);
 
-       int disable_esr;
-
-       int dest_logical;
-       bool (*check_apicid_used)(physid_mask_t *map, int apicid);
-
-       void (*vector_allocation_domain)(int cpu, struct cpumask *retmask,
-                                        const struct cpumask *mask);
-       void (*init_apic_ldr)(void);
-
-       void (*ioapic_phys_id_map)(physid_mask_t *phys_map, physid_mask_t *retmap);
-
-       void (*setup_apic_routing)(void);
-       int (*cpu_present_to_apicid)(int mps_cpu);
-       void (*apicid_to_cpu_present)(int phys_apicid, physid_mask_t *retmap);
-       int (*check_phys_apicid_present)(int phys_apicid);
-       int (*phys_pkg_id)(int cpuid_apic, int index_msb);
+       /* ICR related functions */
+       u64     (*icr_read)(void);
+       void    (*icr_write)(u32 low, u32 high);
 
-       unsigned int (*get_apic_id)(unsigned long x);
-       /* Can't be NULL on 64-bit */
-       u32 (*set_apic_id)(unsigned int id);
+       /* Probe, setup and smpboot functions */
+       int     (*probe)(void);
+       int     (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
+       int     (*apic_id_valid)(int apicid);
+       int     (*apic_id_registered)(void);
 
-       int (*cpu_mask_to_apicid)(const struct cpumask *cpumask,
-                                 struct irq_data *irqdata,
-                                 unsigned int *apicid);
+       bool    (*check_apicid_used)(physid_mask_t *map, int apicid);
+       void    (*init_apic_ldr)(void);
+       void    (*ioapic_phys_id_map)(physid_mask_t *phys_map, physid_mask_t *retmap);
+       void    (*setup_apic_routing)(void);
+       int     (*cpu_present_to_apicid)(int mps_cpu);
+       void    (*apicid_to_cpu_present)(int phys_apicid, physid_mask_t *retmap);
+       int     (*check_phys_apicid_present)(int phys_apicid);
+       int     (*phys_pkg_id)(int cpuid_apic, int index_msb);
 
-       /* ipi */
-       void (*send_IPI)(int cpu, int vector);
-       void (*send_IPI_mask)(const struct cpumask *mask, int vector);
-       void (*send_IPI_mask_allbutself)(const struct cpumask *mask,
-                                        int vector);
-       void (*send_IPI_allbutself)(int vector);
-       void (*send_IPI_all)(int vector);
-       void (*send_IPI_self)(int vector);
+       u32     (*get_apic_id)(unsigned long x);
+       u32     (*set_apic_id)(unsigned int id);
 
        /* wakeup_secondary_cpu */
-       int (*wakeup_secondary_cpu)(int apicid, unsigned long start_eip);
-
-       void (*inquire_remote_apic)(int apicid);
+       int     (*wakeup_secondary_cpu)(int apicid, unsigned long start_eip);
 
-       /* apic ops */
-       u32 (*read)(u32 reg);
-       void (*write)(u32 reg, u32 v);
-       /*
-        * ->eoi_write() has the same signature as ->write().
-        *
-        * Drivers can support both ->eoi_write() and ->write() by passing the same
-        * callback value. Kernel can override ->eoi_write() and fall back
-        * on write for EOI.
-        */
-       void (*eoi_write)(u32 reg, u32 v);
-       void (*native_eoi_write)(u32 reg, u32 v);
-       u64 (*icr_read)(void);
-       void (*icr_write)(u32 low, u32 high);
-       void (*wait_icr_idle)(void);
-       u32 (*safe_wait_icr_idle)(void);
+       void    (*inquire_remote_apic)(int apicid);
 
 #ifdef CONFIG_X86_32
        /*
@@ -355,6 +345,7 @@ struct apic {
         */
        int (*x86_32_early_logical_apicid)(int cpu);
 #endif
+       char    *name;
 };
 
 /*