Enable hierarchy irqdomian on x86 platforms
Subsystems (8)
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Clean up unused forward declarations in x86_init.h
In reply to Jiang Liux86/irq: Clean up unused forward declarations in x86_init.h
Commit-ID: 3dd786ea3a0753bb19a5fd5103739a7cb9ec92c1 Gitweb: http://git.kernel.org/tip/3dd786ea3a0753bb19a5fd5103739a7cb9ec92c1 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:45 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:52 +0200
x86/irq: Clean up unused forward declarations in x86_init.h
Clean up unused forward declarations in x86_init.h.
--- arch/x86/include/asm/x86_init.h | 6 ------ 1 file changed, 6 deletions(-)
arch/x86/include/asm/x86_init.h +0 -6
@@ -171,7 +171,6 @@ struct x86_platform_ops { };struct pci_dev ; -struct msi_msg ;struct x86_msi_ops {int (*setup_msi_irqs)(struct pci_dev *dev,int nvec,int type);
@@ -180,11 +179,6 @@ struct x86_msi_ops {void (*restore_msi_irqs)(struct pci_dev *dev); }; -struct IO_APIC_route_entry ; -struct io_apic_irq_attr ; -struct irq_data ; -struct cpumask ; -struct x86_io_apic_ops {void (*init) (void );unsigned int (*read) (unsigned int apic,unsigned int reg);
PATCH v5 9/33 irq_remapping: Clean up unsued code to support IOAPIC
In reply to Jiang LiuNow we have converted to hierarchy irqdomain, so clean up unused code.
--- arch/x86/include/asm/irq_remapping.h | 23 ----------------------- arch/x86/kernel/apic/vector.c | 1 - drivers/iommu/irq_remapping.c | 33 --------------------------------- 3 files changed, 57 deletions(-)
arch/x86/include/asm/irq_remapping.h +0 -23
@@ -26,12 +26,7 @@#include <asm/hw_irq.h> #include <asm/io_apic.h> -struct IO_APIC_route_entry ; -struct io_apic_irq_attr ; -struct irq_chip ;struct msi_msg ; -struct pci_dev ; -struct irq_cfg ;struct irq_alloc_info ;#ifdef CONFIG_IRQ_REMAP
@@ -42,13 +37,7 @@ extern int irq_remapping_enable(void);extern void irq_remapping_disable (void );extern int irq_remapping_reenable (int );extern int irq_remap_enable_fault_handling (void ); -extern void free_remapped_irq (int irq);extern void panic_if_irq_remap (const char *msg); -extern bool setup_remapped_irq (int irq, -struct irq_cfg *cfg, -struct irq_chip *chip); - -void irq_remap_modify_chip_defaults (struct irq_chip *chip);extern struct irq_domain *irq_remapping_get_ir_irq_domain (struct irq_alloc_info *info);
@@ -72,23 +61,11 @@ static inline int irq_remapping_enable(void) { return -ENODEV; }static inline void irq_remapping_disable (void ) { }static inline int irq_remapping_reenable (int eim) {return -ENODEV ; }static inline int irq_remap_enable_fault_handling (void ) {return -ENODEV ; } -static inline void free_remapped_irq (int irq) { }static inline void panic_if_irq_remap (const char *msg) { } -static inline void irq_remap_modify_chip_defaults (struct irq_chip *chip) -{ -} - -static inline bool setup_remapped_irq (int irq, -struct irq_cfg *cfg, -struct irq_chip *chip) -{ -return false; -} -static inline struct irq_domain *irq_remapping_get_ir_irq_domain (struct irq_alloc_info *info) {
arch/x86/kernel/apic/vector.c +0 -1
@@ -283,7 +283,6 @@ static void x86_vector_free_irqs(struct irq_domain *domain,for (i =0 ; i < nr_irqs; i++) { irq_data =irq_domain_get_irq_data (x86_vector_domain, virq + i);if (irq_data && irq_data->chip_data) { -free_remapped_irq (virq);clear_irq_vector (virq + i, irq_data->chip_data);free_irq_cfg (irq_data->chip_data);#ifdef CONFIG_X86_IO_APIC
drivers/iommu/irq_remapping.c +0 -33
@@ -25,11 +25,6 @@ int no_x2apic_optout;static int disable_irq_remap;static struct irq_remap_ops *remap_ops; -static bool irq_remapped (struct irq_cfg *cfg) -{ -return (cfg->remapped ==1 ); -} -static void irq_remapping_disable_io_apic (void ) {/*
@@ -140,14 +135,6 @@ int __init irq_remap_enable_fault_handling(void)return remap_ops->enable_faulting (); } -void free_remapped_irq (int irq) -{ -struct irq_cfg *cfg =irq_cfg (irq); - -if (irq_remapped (cfg) && remap_ops->free_irq) - remap_ops->free_irq (irq); -} -void panic_if_irq_remap (const char *msg) {if (irq_remapping_enabled)
@@ -159,26 +146,6 @@ void ir_ack_apic_edge(struct irq_data *data)ack_APIC_irq (); } -static void ir_print_prefix (struct irq_data *data,struct seq_file *p) -{ -seq_printf (p," IR-%s" , data->chip->name); -} - -void irq_remap_modify_chip_defaults (struct irq_chip *chip) -{ - chip->irq_print_chip = ir_print_prefix; - chip->irq_ack = ir_ack_apic_edge; -} - -bool setup_remapped_irq (int irq,struct irq_cfg *cfg,struct irq_chip *chip) -{ -if (!irq_remapped (cfg)) -return false; -irq_set_status_flags (irq,IRQ_MOVE_PCNTXT ); -irq_remap_modify_chip_defaults (chip); -return true; -} -/** * irq_remapping_get_ir_irq_domain - Get the irqdomain associated with the IOMMU * device serving request @info
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] irq_remapping: Clean up unsued code to support IOAPIC
irq_remapping: Clean up unsued code to support IOAPIC
Commit-ID: 9880534989ba96faad26aebc01dcdb2c1b5793aa Gitweb: http://git.kernel.org/tip/9880534989ba96faad26aebc01dcdb2c1b5793aa Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:46 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:52 +0200
irq_remapping: Clean up unsued code to support IOAPIC
Now we have converted to hierarchical irqdomains, so clean up unused code.
--- arch/x86/include/asm/irq_remapping.h | 23 ----------------------- arch/x86/kernel/apic/vector.c | 1 - drivers/iommu/irq_remapping.c | 33 --------------------------------- 3 files changed, 57 deletions(-)
arch/x86/include/asm/irq_remapping.h +0 -23
@@ -26,12 +26,7 @@#include <asm/hw_irq.h> #include <asm/io_apic.h> -struct IO_APIC_route_entry ; -struct io_apic_irq_attr ; -struct irq_chip ;struct msi_msg ; -struct pci_dev ; -struct irq_cfg ;struct irq_alloc_info ;#ifdef CONFIG_IRQ_REMAP
@@ -42,13 +37,7 @@ extern int irq_remapping_enable(void);extern void irq_remapping_disable (void );extern int irq_remapping_reenable (int );extern int irq_remap_enable_fault_handling (void ); -extern void free_remapped_irq (int irq);extern void panic_if_irq_remap (const char *msg); -extern bool setup_remapped_irq (int irq, -struct irq_cfg *cfg, -struct irq_chip *chip); - -void irq_remap_modify_chip_defaults (struct irq_chip *chip);extern struct irq_domain *irq_remapping_get_ir_irq_domain (struct irq_alloc_info *info);
@@ -72,23 +61,11 @@ static inline int irq_remapping_enable(void) { return -ENODEV; }static inline void irq_remapping_disable (void ) { }static inline int irq_remapping_reenable (int eim) {return -ENODEV ; }static inline int irq_remap_enable_fault_handling (void ) {return -ENODEV ; } -static inline void free_remapped_irq (int irq) { }static inline void panic_if_irq_remap (const char *msg) { } -static inline void irq_remap_modify_chip_defaults (struct irq_chip *chip) -{ -} - -static inline bool setup_remapped_irq (int irq, -struct irq_cfg *cfg, -struct irq_chip *chip) -{ -return false; -} -static inline struct irq_domain *irq_remapping_get_ir_irq_domain (struct irq_alloc_info *info) {
arch/x86/kernel/apic/vector.c +0 -1
@@ -283,7 +283,6 @@ static void x86_vector_free_irqs(struct irq_domain *domain,for (i =0 ; i < nr_irqs; i++) { irq_data =irq_domain_get_irq_data (x86_vector_domain, virq + i);if (irq_data && irq_data->chip_data) { -free_remapped_irq (virq);clear_irq_vector (virq + i, irq_data->chip_data);free_irq_cfg (irq_data->chip_data);#ifdef CONFIG_X86_IO_APIC
drivers/iommu/irq_remapping.c +0 -33
@@ -25,11 +25,6 @@ int no_x2apic_optout;static int disable_irq_remap;static struct irq_remap_ops *remap_ops; -static bool irq_remapped (struct irq_cfg *cfg) -{ -return (cfg->remapped ==1 ); -} -static void irq_remapping_disable_io_apic (void ) {/*
@@ -140,14 +135,6 @@ int __init irq_remap_enable_fault_handling(void)return remap_ops->enable_faulting (); } -void free_remapped_irq (int irq) -{ -struct irq_cfg *cfg =irq_cfg (irq); - -if (irq_remapped (cfg) && remap_ops->free_irq) - remap_ops->free_irq (irq); -} -void panic_if_irq_remap (const char *msg) {if (irq_remapping_enabled)
@@ -159,26 +146,6 @@ void ir_ack_apic_edge(struct irq_data *data)ack_APIC_irq (); } -static void ir_print_prefix (struct irq_data *data,struct seq_file *p) -{ -seq_printf (p," IR-%s" , data->chip->name); -} - -void irq_remap_modify_chip_defaults (struct irq_chip *chip) -{ - chip->irq_print_chip = ir_print_prefix; - chip->irq_ack = ir_ack_apic_edge; -} - -bool setup_remapped_irq (int irq,struct irq_cfg *cfg,struct irq_chip *chip) -{ -if (!irq_remapped (cfg)) -return false; -irq_set_status_flags (irq,IRQ_MOVE_PCNTXT ); -irq_remap_modify_chip_defaults (chip); -return true; -} -/** * irq_remapping_get_ir_irq_domain - Get the irqdomain associated with the IOMMU * device serving request @info
PATCH v5 10/33 irq_remapping/vt-d: Clean up unsued code
In reply to Jiang LiuNow we have converted to hierarchy irqdomain, so clean up unused code.
--- drivers/iommu/intel_irq_remapping.c | 187 +---------------------------------- 1 file changed, 1 insertion(+), 186 deletions(-)
drivers/iommu/intel_irq_remapping.c +1 -186
@@ -63,35 +63,6 @@ static struct irq_domain_ops intel_ir_domain_ops;static int __init parse_ioapics_under_ir (void ); -static struct irq_2_iommu *irq_2_iommu (unsigned int irq) -{ -struct irq_cfg *cfg =irq_cfg (irq); -return cfg ? &cfg->irq_2_iommu :NULL ; -} - -static int get_irte (int irq,struct irte *entry) -{ -struct irq_2_iommu *irq_iommu =irq_2_iommu (irq); -unsigned long flags; -int index; - -if (!entry || !irq_iommu) -return -1 ; - -raw_spin_lock_irqsave (&irq_2_ir_lock, flags); - -if (unlikely (!irq_iommu->iommu)) { -raw_spin_unlock_irqrestore (&irq_2_ir_lock, flags); -return -1 ; - } - - index = irq_iommu->irte_index + irq_iommu->sub_handle; - *entry = *(irq_iommu->iommu->ir_table->base + index); - -raw_spin_unlock_irqrestore (&irq_2_ir_lock, flags); -return 0 ; -} -static int alloc_irte (struct intel_iommu *iommu,int irq,struct irq_2_iommu *irq_iommu,u16 count) {
@@ -229,29 +200,6 @@ static int clear_entries(struct irq_2_iommu *irq_iommu)return qi_flush_iec (iommu, index, irq_iommu->irte_mask); } -static int free_irte (int irq) -{ -struct irq_2_iommu *irq_iommu =irq_2_iommu (irq); -unsigned long flags; -int rc; - -if (!irq_iommu || irq_iommu->iommu ==NULL ) -return -1 ; - -raw_spin_lock_irqsave (&irq_2_ir_lock, flags); - - rc =clear_entries (irq_iommu); - - irq_iommu->iommu =NULL ; - irq_iommu->irte_index =0 ; - irq_iommu->sub_handle =0 ; - irq_iommu->irte_mask =0 ; - -raw_spin_unlock_irqrestore (&irq_2_ir_lock, flags); - -return rc; -} -/* * source validation type */
@@ -932,8 +880,7 @@ error:return -1 ; } -static void prepare_irte (struct irte *irte,int vector, -unsigned int dest) +static void prepare_irte (struct irte *irte,int vector,unsigned int dest) {memset (irte,0 ,sizeof (*irte));
@@ -953,135 +900,6 @@ static void prepare_irte(struct irte *irte, int vector, irte->redir_hint =1 ; } -static int intel_setup_ioapic_entry (int irq, -struct IO_APIC_route_entry *route_entry, -unsigned int destination,int vector, -struct io_apic_irq_attr *attr) -{ -int ioapic_id =mpc_ioapic_id (attr->ioapic); -struct intel_iommu *iommu; -struct IR_IO_APIC_route_entry *entry; -struct irte irte; -int index; - -down_read (&dmar_global_lock); - iommu =map_ioapic_to_ir (ioapic_id); -if (!iommu) { -pr_warn ("No mapping iommu for ioapic %d\n" , ioapic_id); - index = -ENODEV ; - }else { - index =alloc_irte (iommu, irq,irq_2_iommu (irq),1 ); -if (index <0 ) { -pr_warn ("Failed to allocate IRTE for ioapic %d\n" , - ioapic_id); - index = -ENOMEM ; - } - } -up_read (&dmar_global_lock); -if (index <0 ) -return index; - -prepare_irte (&irte, vector, destination); - -/* Set source-id of interrupt request */ -set_ioapic_sid (&irte, ioapic_id); - -modify_irte (irq_2_iommu (irq), &irte); - -apic_printk (APIC_VERBOSE ,KERN_DEBUG "IOAPIC[%d]: " -"Set IRTE entry (P:%d FPD:%d Dst_Mode:%d " -"Redir_hint:%d Trig_Mode:%d Dlvry_Mode:%X " -"Avail:%X Vector:%02X Dest:%08X " -"SID:%04X SQ:%X SVT:%X)\n" , - attr->ioapic, irte.present, irte.fpd, irte.dst_mode, - irte.redir_hint, irte.trigger_mode, irte.dlvry_mode, - irte.avail, irte.vector, irte.dest_id, - irte.sid, irte.sq, irte.svt); - - entry = (struct IR_IO_APIC_route_entry *)route_entry; -memset (entry,0 ,sizeof (*entry)); - - entry->index2 = (index >>15 ) &0x1 ; - entry->zero =0 ; - entry->format =1 ; - entry->index = (index &0x7fff ); -/* -* IO-APIC RTE will be configured with virtual vector. -* irq handler will do the explicit EOI to the io-apic. -*/ - entry->vector = attr->ioapic_pin; - entry->mask =0 ;/* enable IRQ */ - entry->trigger = attr->trigger; - entry->polarity = attr->polarity; - -/* Mask level triggered irqs. -* Use IRQ_DELAYED_DISABLE for edge triggered irqs. -*/ -if (attr->trigger) - entry->mask =1 ; - -return 0 ; -} - -/* -* Migrate the IO-APIC irq in the presence of intr-remapping. -* -* For both level and edge triggered, irq migration is a simple atomic -* update(of vector and cpu destination) of IRTE and flush the hardware cache. -* -* For level triggered, we eliminate the io-apic RTE modification (with the -* updated vector information), by using a virtual vector (io-apic pin number). -* Real vector that is used for interrupting cpu will be coming from -* the interrupt-remapping table entry. -* -* As the migration is a simple atomic update of IRTE, the same mechanism -* is used to migrate MSI irq's in the presence of interrupt-remapping. -*/ -static int -intel_ioapic_set_affinity (struct irq_data *data,const struct cpumask *mask, -bool force) -{ -struct irq_cfg *cfg =irqd_cfg (data); -unsigned int dest, irq = data->irq; -struct irte irte; -int err; - -if (get_irte (irq, &irte)) -return -EBUSY ; - - err =assign_irq_vector (irq, cfg, mask); -if (err) -return err; - - err = apic->cpu_mask_to_apicid_and (cfg->domain, mask, &dest); -if (err) { -if (assign_irq_vector (irq, cfg, data->affinity)) -pr_err ("Failed to recover vector for irq %d\n" , irq); -return err; - } - - irte.vector = cfg->vector; - irte.dest_id =IRTE_DEST (dest); - -/* -* Atomically updates the IRTE with the new destination, vector -* and flushes the interrupt entry cache. -*/ -modify_irte (irq_2_iommu (irq), &irte); - -/* -* After this point, all the interrupts will start arriving -* at the new destination. So, time to cleanup the previous -* vector allocation. -*/ -if (cfg->move_in_progress) -send_cleanup_vector (cfg); - -cpumask_copy (data->affinity, mask); - -return 0 ; -} -static struct irq_domain *intel_get_ir_irq_domain (struct irq_alloc_info *info) {struct intel_iommu *iommu =NULL ;
@@ -1135,9 +953,6 @@ struct irq_remap_ops intel_irq_remap_ops = { .disable = disable_irq_remapping, .reenable = reenable_irq_remapping, .enable_faulting = enable_drhd_fault_handling, - .setup_ioapic_entry = intel_setup_ioapic_entry, - .set_affinity = intel_ioapic_set_affinity, - .free_irq = free_irte, .get_ir_irq_domain = intel_get_ir_irq_domain, .get_irq_domain = intel_get_irq_domain, };
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] irq_remapping/vt-d: Clean up unsued code
irq_remapping/vt-d: Clean up unsued code
Commit-ID: 3c6e567509ed4e60593b1683a1e557c34e503be6 Gitweb: http://git.kernel.org/tip/3c6e567509ed4e60593b1683a1e557c34e503be6 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:47 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:53 +0200
irq_remapping/vt-d: Clean up unsued code
Now we have converted to hierarchical irqdomains, so clean up unused code.
--- drivers/iommu/intel_irq_remapping.c | 187 +----------------------------------- 1 file changed, 1 insertion(+), 186 deletions(-)
drivers/iommu/intel_irq_remapping.c +1 -186
@@ -63,35 +63,6 @@ static struct irq_domain_ops intel_ir_domain_ops;static int __init parse_ioapics_under_ir (void ); -static struct irq_2_iommu *irq_2_iommu (unsigned int irq) -{ -struct irq_cfg *cfg =irq_cfg (irq); -return cfg ? &cfg->irq_2_iommu :NULL ; -} - -static int get_irte (int irq,struct irte *entry) -{ -struct irq_2_iommu *irq_iommu =irq_2_iommu (irq); -unsigned long flags; -int index; - -if (!entry || !irq_iommu) -return -1 ; - -raw_spin_lock_irqsave (&irq_2_ir_lock, flags); - -if (unlikely (!irq_iommu->iommu)) { -raw_spin_unlock_irqrestore (&irq_2_ir_lock, flags); -return -1 ; - } - - index = irq_iommu->irte_index + irq_iommu->sub_handle; - *entry = *(irq_iommu->iommu->ir_table->base + index); - -raw_spin_unlock_irqrestore (&irq_2_ir_lock, flags); -return 0 ; -} -static int alloc_irte (struct intel_iommu *iommu,int irq,struct irq_2_iommu *irq_iommu,u16 count) {
@@ -229,29 +200,6 @@ static int clear_entries(struct irq_2_iommu *irq_iommu)return qi_flush_iec (iommu, index, irq_iommu->irte_mask); } -static int free_irte (int irq) -{ -struct irq_2_iommu *irq_iommu =irq_2_iommu (irq); -unsigned long flags; -int rc; - -if (!irq_iommu || irq_iommu->iommu ==NULL ) -return -1 ; - -raw_spin_lock_irqsave (&irq_2_ir_lock, flags); - - rc =clear_entries (irq_iommu); - - irq_iommu->iommu =NULL ; - irq_iommu->irte_index =0 ; - irq_iommu->sub_handle =0 ; - irq_iommu->irte_mask =0 ; - -raw_spin_unlock_irqrestore (&irq_2_ir_lock, flags); - -return rc; -} -/* * source validation type */
@@ -932,8 +880,7 @@ error:return -1 ; } -static void prepare_irte (struct irte *irte,int vector, -unsigned int dest) +static void prepare_irte (struct irte *irte,int vector,unsigned int dest) {memset (irte,0 ,sizeof (*irte));
@@ -953,135 +900,6 @@ static void prepare_irte(struct irte *irte, int vector, irte->redir_hint =1 ; } -static int intel_setup_ioapic_entry (int irq, -struct IO_APIC_route_entry *route_entry, -unsigned int destination,int vector, -struct io_apic_irq_attr *attr) -{ -int ioapic_id =mpc_ioapic_id (attr->ioapic); -struct intel_iommu *iommu; -struct IR_IO_APIC_route_entry *entry; -struct irte irte; -int index; - -down_read (&dmar_global_lock); - iommu =map_ioapic_to_ir (ioapic_id); -if (!iommu) { -pr_warn ("No mapping iommu for ioapic %d\n" , ioapic_id); - index = -ENODEV ; - }else { - index =alloc_irte (iommu, irq,irq_2_iommu (irq),1 ); -if (index <0 ) { -pr_warn ("Failed to allocate IRTE for ioapic %d\n" , - ioapic_id); - index = -ENOMEM ; - } - } -up_read (&dmar_global_lock); -if (index <0 ) -return index; - -prepare_irte (&irte, vector, destination); - -/* Set source-id of interrupt request */ -set_ioapic_sid (&irte, ioapic_id); - -modify_irte (irq_2_iommu (irq), &irte); - -apic_printk (APIC_VERBOSE ,KERN_DEBUG "IOAPIC[%d]: " -"Set IRTE entry (P:%d FPD:%d Dst_Mode:%d " -"Redir_hint:%d Trig_Mode:%d Dlvry_Mode:%X " -"Avail:%X Vector:%02X Dest:%08X " -"SID:%04X SQ:%X SVT:%X)\n" , - attr->ioapic, irte.present, irte.fpd, irte.dst_mode, - irte.redir_hint, irte.trigger_mode, irte.dlvry_mode, - irte.avail, irte.vector, irte.dest_id, - irte.sid, irte.sq, irte.svt); - - entry = (struct IR_IO_APIC_route_entry *)route_entry; -memset (entry,0 ,sizeof (*entry)); - - entry->index2 = (index >>15 ) &0x1 ; - entry->zero =0 ; - entry->format =1 ; - entry->index = (index &0x7fff ); -/* -* IO-APIC RTE will be configured with virtual vector. -* irq handler will do the explicit EOI to the io-apic. -*/ - entry->vector = attr->ioapic_pin; - entry->mask =0 ;/* enable IRQ */ - entry->trigger = attr->trigger; - entry->polarity = attr->polarity; - -/* Mask level triggered irqs. -* Use IRQ_DELAYED_DISABLE for edge triggered irqs. -*/ -if (attr->trigger) - entry->mask =1 ; - -return 0 ; -} - -/* -* Migrate the IO-APIC irq in the presence of intr-remapping. -* -* For both level and edge triggered, irq migration is a simple atomic -* update(of vector and cpu destination) of IRTE and flush the hardware cache. -* -* For level triggered, we eliminate the io-apic RTE modification (with the -* updated vector information), by using a virtual vector (io-apic pin number). -* Real vector that is used for interrupting cpu will be coming from -* the interrupt-remapping table entry. -* -* As the migration is a simple atomic update of IRTE, the same mechanism -* is used to migrate MSI irq's in the presence of interrupt-remapping. -*/ -static int -intel_ioapic_set_affinity (struct irq_data *data,const struct cpumask *mask, -bool force) -{ -struct irq_cfg *cfg =irqd_cfg (data); -unsigned int dest, irq = data->irq; -struct irte irte; -int err; - -if (get_irte (irq, &irte)) -return -EBUSY ; - - err =assign_irq_vector (irq, cfg, mask); -if (err) -return err; - - err = apic->cpu_mask_to_apicid_and (cfg->domain, mask, &dest); -if (err) { -if (assign_irq_vector (irq, cfg, data->affinity)) -pr_err ("Failed to recover vector for irq %d\n" , irq); -return err; - } - - irte.vector = cfg->vector; - irte.dest_id =IRTE_DEST (dest); - -/* -* Atomically updates the IRTE with the new destination, vector -* and flushes the interrupt entry cache. -*/ -modify_irte (irq_2_iommu (irq), &irte); - -/* -* After this point, all the interrupts will start arriving -* at the new destination. So, time to cleanup the previous -* vector allocation. -*/ -if (cfg->move_in_progress) -send_cleanup_vector (cfg); - -cpumask_copy (data->affinity, mask); - -return 0 ; -} -static struct irq_domain *intel_get_ir_irq_domain (struct irq_alloc_info *info) {struct intel_iommu *iommu =NULL ;
@@ -1135,9 +953,6 @@ struct irq_remap_ops intel_irq_remap_ops = { .disable = disable_irq_remapping, .reenable = reenable_irq_remapping, .enable_faulting = enable_drhd_fault_handling, - .setup_ioapic_entry = intel_setup_ioapic_entry, - .set_affinity = intel_ioapic_set_affinity, - .free_irq = free_irte, .get_ir_irq_domain = intel_get_ir_irq_domain, .get_irq_domain = intel_get_irq_domain, };
PATCH v5 11/33 irq_remapping/amd: Clean up unsued code
In reply to Jiang LiuNow we have converted to hierarchy irqdomain, so clean up unused code.
--- drivers/iommu/amd_iommu.c | 144 --------------------------------------------- 1 file changed, 144 deletions(-)
drivers/iommu/amd_iommu.c +0 -144
@@ -3999,22 +3999,6 @@ out:return index; } -static int get_irte (u16 devid,int index,union irte *irte) -{ -struct irq_remap_table *table; -unsigned long flags; - - table =get_irq_table (devid, false); -if (!table) -return -ENOMEM ; - -spin_lock_irqsave (&table->lock, flags); - irte->val = table->table[index]; -spin_unlock_irqrestore (&table->lock, flags); - -return 0 ; -} -static int modify_irte (u16 devid,int index,union irte irte) {struct irq_remap_table *table;
@@ -4061,131 +4045,6 @@ static void free_irte(u16 devid, int index)iommu_completion_wait (iommu); } -static int setup_ioapic_entry (int irq,struct IO_APIC_route_entry *entry, -unsigned int destination,int vector, -struct io_apic_irq_attr *attr) -{ -struct irq_remap_table *table; -struct irq_2_irte *irte_info; -struct irq_cfg *cfg; -union irte irte; -int ioapic_id; -int index; -int devid; -int ret; - - cfg =irq_cfg (irq); -if (!cfg) -return -EINVAL ; - - irte_info = &cfg->irq_2_irte; - ioapic_id =mpc_ioapic_id (attr->ioapic); - devid =get_ioapic_devid (ioapic_id); - -if (devid <0 ) -return devid; - - table =get_irq_table (devid, true); -if (table ==NULL ) -return -ENOMEM ; - - index = attr->ioapic_pin; - -/* Setup IRQ remapping info */ - cfg->remapped =1 ; - irte_info->devid = devid; - irte_info->index = index; - -/* Setup IRTE for IOMMU */ - irte.val =0 ; - irte.fields.vector = vector; - irte.fields.int_type = apic->irq_delivery_mode; - irte.fields.destination = destination; - irte.fields.dm = apic->irq_dest_mode; - irte.fields.valid =1 ; - - ret =modify_irte (devid, index, irte); -if (ret) -return ret; - -/* Setup IOAPIC entry */ -memset (entry,0 ,sizeof (*entry)); - - entry->vector = index; - entry->mask =0 ; - entry->trigger = attr->trigger; - entry->polarity = attr->polarity; - -/* -* Mask level triggered irqs. -*/ -if (attr->trigger) - entry->mask =1 ; - -return 0 ; -} - -static int set_affinity (struct irq_data *data,const struct cpumask *mask, -bool force) -{ -struct irq_2_irte *irte_info; -unsigned int dest, irq; -struct irq_cfg *cfg; -union irte irte; -int err; - -if (!config_enabled (CONFIG_SMP )) -return -1 ; - - cfg =irqd_cfg (data); - irq = data->irq; - irte_info = &cfg->irq_2_irte; - -if (!cpumask_intersects (mask, cpu_online_mask)) -return -EINVAL ; - -if (get_irte (irte_info->devid, irte_info->index, &irte)) -return -EBUSY ; - -if (assign_irq_vector (irq, cfg, mask)) -return -EBUSY ; - - err = apic->cpu_mask_to_apicid_and (cfg->domain, mask, &dest); -if (err) { -if (assign_irq_vector (irq, cfg, data->affinity)) -pr_err ("AMD-Vi: Failed to recover vector for irq %d\n" , irq); -return err; - } - - irte.fields.vector = cfg->vector; - irte.fields.destination = dest; - -modify_irte (irte_info->devid, irte_info->index, irte); - -if (cfg->move_in_progress) -send_cleanup_vector (cfg); - -cpumask_copy (data->affinity, mask); - -return 0 ; -} - -static int free_irq (int irq) -{ -struct irq_2_irte *irte_info; -struct irq_cfg *cfg; - - cfg =irq_cfg (irq); -if (!cfg) -return -EINVAL ; - - irte_info = &cfg->irq_2_irte; - -free_irte (irte_info->devid, irte_info->index); - -return 0 ; -} -static int get_devid (struct irq_alloc_info *info) {int devid =-1 ;
@@ -4258,9 +4117,6 @@ struct irq_remap_ops amd_iommu_irq_ops = { .disable = amd_iommu_disable, .reenable = amd_iommu_reenable, .enable_faulting = amd_iommu_enable_faulting, - .setup_ioapic_entry = setup_ioapic_entry, - .set_affinity = set_affinity, - .free_irq = free_irq, .get_ir_irq_domain = get_ir_irq_domain, .get_irq_domain = get_irq_domain, };
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] irq_remapping/amd: Clean up unsued code
irq_remapping/amd: Clean up unsued code
Commit-ID: 494b89749f3857d4e726c0715fe2db6cf40cc82c Gitweb: http://git.kernel.org/tip/494b89749f3857d4e726c0715fe2db6cf40cc82c Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:48 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:53 +0200
irq_remapping/amd: Clean up unsued code
Now we have converted to hierarchical irqdomains, so clean up unused code.
--- drivers/iommu/amd_iommu.c | 144 ---------------------------------------------- 1 file changed, 144 deletions(-)
drivers/iommu/amd_iommu.c +0 -144
@@ -3993,22 +3993,6 @@ out:return index; } -static int get_irte (u16 devid,int index,union irte *irte) -{ -struct irq_remap_table *table; -unsigned long flags; - - table =get_irq_table (devid, false); -if (!table) -return -ENOMEM ; - -spin_lock_irqsave (&table->lock, flags); - irte->val = table->table[index]; -spin_unlock_irqrestore (&table->lock, flags); - -return 0 ; -} -static int modify_irte (u16 devid,int index,union irte irte) {struct irq_remap_table *table;
@@ -4055,131 +4039,6 @@ static void free_irte(u16 devid, int index)iommu_completion_wait (iommu); } -static int setup_ioapic_entry (int irq,struct IO_APIC_route_entry *entry, -unsigned int destination,int vector, -struct io_apic_irq_attr *attr) -{ -struct irq_remap_table *table; -struct irq_2_irte *irte_info; -struct irq_cfg *cfg; -union irte irte; -int ioapic_id; -int index; -int devid; -int ret; - - cfg =irq_cfg (irq); -if (!cfg) -return -EINVAL ; - - irte_info = &cfg->irq_2_irte; - ioapic_id =mpc_ioapic_id (attr->ioapic); - devid =get_ioapic_devid (ioapic_id); - -if (devid <0 ) -return devid; - - table =get_irq_table (devid, true); -if (table ==NULL ) -return -ENOMEM ; - - index = attr->ioapic_pin; - -/* Setup IRQ remapping info */ - cfg->remapped =1 ; - irte_info->devid = devid; - irte_info->index = index; - -/* Setup IRTE for IOMMU */ - irte.val =0 ; - irte.fields.vector = vector; - irte.fields.int_type = apic->irq_delivery_mode; - irte.fields.destination = destination; - irte.fields.dm = apic->irq_dest_mode; - irte.fields.valid =1 ; - - ret =modify_irte (devid, index, irte); -if (ret) -return ret; - -/* Setup IOAPIC entry */ -memset (entry,0 ,sizeof (*entry)); - - entry->vector = index; - entry->mask =0 ; - entry->trigger = attr->trigger; - entry->polarity = attr->polarity; - -/* -* Mask level triggered irqs. -*/ -if (attr->trigger) - entry->mask =1 ; - -return 0 ; -} - -static int set_affinity (struct irq_data *data,const struct cpumask *mask, -bool force) -{ -struct irq_2_irte *irte_info; -unsigned int dest, irq; -struct irq_cfg *cfg; -union irte irte; -int err; - -if (!config_enabled (CONFIG_SMP )) -return -1 ; - - cfg =irqd_cfg (data); - irq = data->irq; - irte_info = &cfg->irq_2_irte; - -if (!cpumask_intersects (mask, cpu_online_mask)) -return -EINVAL ; - -if (get_irte (irte_info->devid, irte_info->index, &irte)) -return -EBUSY ; - -if (assign_irq_vector (irq, cfg, mask)) -return -EBUSY ; - - err = apic->cpu_mask_to_apicid_and (cfg->domain, mask, &dest); -if (err) { -if (assign_irq_vector (irq, cfg, data->affinity)) -pr_err ("AMD-Vi: Failed to recover vector for irq %d\n" , irq); -return err; - } - - irte.fields.vector = cfg->vector; - irte.fields.destination = dest; - -modify_irte (irte_info->devid, irte_info->index, irte); - -if (cfg->move_in_progress) -send_cleanup_vector (cfg); - -cpumask_copy (data->affinity, mask); - -return 0 ; -} - -static int free_irq (int irq) -{ -struct irq_2_irte *irte_info; -struct irq_cfg *cfg; - - cfg =irq_cfg (irq); -if (!cfg) -return -EINVAL ; - - irte_info = &cfg->irq_2_irte; - -free_irte (irte_info->devid, irte_info->index); - -return 0 ; -} -static int get_devid (struct irq_alloc_info *info) {int devid =-1 ;
@@ -4252,9 +4111,6 @@ struct irq_remap_ops amd_iommu_irq_ops = { .disable = amd_iommu_disable, .reenable = amd_iommu_reenable, .enable_faulting = amd_iommu_enable_faulting, - .setup_ioapic_entry = setup_ioapic_entry, - .set_affinity = set_affinity, - .free_irq = free_irq, .get_ir_irq_domain = get_ir_irq_domain, .get_irq_domain = get_irq_domain, };
PATCH v5 12/33 irq_remapping: Clean up unused interfaces
In reply to Jiang LiuNow we have converted to hierarchy irqdomain, so clean up unused interfaces.
--- drivers/iommu/irq_remapping.h | 16 ---------------- 1 file changed, 16 deletions(-)
drivers/iommu/irq_remapping.h +0 -16
@@ -24,11 +24,7 @@#ifdef CONFIG_IRQ_REMAP -struct IO_APIC_route_entry ; -struct io_apic_irq_attr ;struct irq_data ; -struct cpumask ; -struct pci_dev ;struct msi_msg ;struct irq_domain ;struct irq_alloc_info ;
@@ -54,18 +50,6 @@ struct irq_remap_ops {/* Enable fault handling */ int (*enable_faulting)(void ); -/* IO-APIC setup routine */ -int (*setup_ioapic_entry)(int irq,struct IO_APIC_route_entry *, -unsigned int ,int , -struct io_apic_irq_attr *); - -/* Set the CPU affinity of a remapped interrupt */ -int (*set_affinity)(struct irq_data *data,const struct cpumask *mask, -bool force); - -/* Free an IRQ */ -int (*free_irq)(int ); -/* Get the irqdomain associated the IOMMU device */ struct irq_domain *(*get_ir_irq_domain)(struct irq_alloc_info *);
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] irq_remapping: Clean up unused interfaces
irq_remapping: Clean up unused interfaces
Commit-ID: 4c77c983868ef652bcfc207b40054620219ac2a3 Gitweb: http://git.kernel.org/tip/4c77c983868ef652bcfc207b40054620219ac2a3 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:49 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:53 +0200
irq_remapping: Clean up unused interfaces
Now we have converted to hierarchical irqdomains, so clean up unused interfaces.
--- drivers/iommu/irq_remapping.h | 16 ---------------- 1 file changed, 16 deletions(-)
drivers/iommu/irq_remapping.h +0 -16
@@ -24,11 +24,7 @@#ifdef CONFIG_IRQ_REMAP -struct IO_APIC_route_entry ; -struct io_apic_irq_attr ;struct irq_data ; -struct cpumask ; -struct pci_dev ;struct msi_msg ;struct irq_domain ;struct irq_alloc_info ;
@@ -54,18 +50,6 @@ struct irq_remap_ops {/* Enable fault handling */ int (*enable_faulting)(void ); -/* IO-APIC setup routine */ -int (*setup_ioapic_entry)(int irq,struct IO_APIC_route_entry *, -unsigned int ,int , -struct io_apic_irq_attr *); - -/* Set the CPU affinity of a remapped interrupt */ -int (*set_affinity)(struct irq_data *data,const struct cpumask *mask, -bool force); - -/* Free an IRQ */ -int (*free_irq)(int ); -/* Get the irqdomain associated the IOMMU device */ struct irq_domain *(*get_ir_irq_domain)(struct irq_alloc_info *);
PATCH v5 13/33 x86/irq: Kill irq_cfg.irq_remapped
In reply to Jiang LiuNow there is no user of irq_cfg.irq_remapped, so kill it.
--- arch/x86/include/asm/hw_irq.h | 1 - drivers/iommu/amd_iommu.c | 1 - drivers/iommu/intel_irq_remapping.c | 2 -- 3 files changed, 4 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -1
@@ -193,7 +193,6 @@ struct irq_cfg {u8 vector; u8 move_in_progress : 1; #ifdef CONFIG_IRQ_REMAP - u8 remapped : 1; union { struct irq_2_iommu irq_2_iommu; struct irq_2_irte irq_2_irte;
drivers/iommu/amd_iommu.c +0 -1
@@ -4131,7 +4131,6 @@ static void irq_remapping_prepare_irte(struct amd_ir_data *data,struct msi_msg *msg = &data->msi_entry;struct IO_APIC_route_entry *entry; - irq_cfg->remapped =1 ; data->irq_2_irte.devid = devid; data->irq_2_irte.index = index + sub_handle;
drivers/iommu/intel_irq_remapping.c +0 -2
@@ -67,7 +67,6 @@ static int alloc_irte(struct intel_iommu *iommu, int irq, struct irq_2_iommu *irq_iommu, u16 count) {struct ir_table *table = iommu->ir_table; -struct irq_cfg *cfg =irq_cfg (irq);unsigned int mask =0 ;unsigned long flags;int index;
@@ -94,7 +93,6 @@ static int alloc_irte(struct intel_iommu *iommu, int irq,if (index <0 ) {pr_warn ("IR%d: can't allocate an IRTE\n" , iommu->seq_id); }else { - cfg->remapped =1 ; irq_iommu->iommu = iommu; irq_iommu->irte_index = index; irq_iommu->sub_handle =0 ;
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Remove irq_cfg.irq_remapped
x86/irq: Remove irq_cfg.irq_remapped
Commit-ID: bac4f90784efb858cfafdd7401dede6ef9563818 Gitweb: http://git.kernel.org/tip/bac4f90784efb858cfafdd7401dede6ef9563818 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:50 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:53 +0200
x86/irq: Remove irq_cfg.irq_remapped
Now there is no user of irq_cfg.irq_remapped, so remove it.
--- arch/x86/include/asm/hw_irq.h | 1 - drivers/iommu/amd_iommu.c | 1 - drivers/iommu/intel_irq_remapping.c | 2 -- 3 files changed, 4 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -1
@@ -193,7 +193,6 @@ struct irq_cfg {u8 vector; u8 move_in_progress : 1; #ifdef CONFIG_IRQ_REMAP - u8 remapped : 1; union { struct irq_2_iommu irq_2_iommu; struct irq_2_irte irq_2_irte;
drivers/iommu/amd_iommu.c +0 -1
@@ -4125,7 +4125,6 @@ static void irq_remapping_prepare_irte(struct amd_ir_data *data,union irte *irte = &data->irte_entry;struct IO_APIC_route_entry *entry; - irq_cfg->remapped =1 ; data->irq_2_irte.devid = devid; data->irq_2_irte.index = index + sub_handle;
drivers/iommu/intel_irq_remapping.c +0 -2
@@ -67,7 +67,6 @@ static int alloc_irte(struct intel_iommu *iommu, int irq, struct irq_2_iommu *irq_iommu, u16 count) {struct ir_table *table = iommu->ir_table; -struct irq_cfg *cfg =irq_cfg (irq);unsigned int mask =0 ;unsigned long flags;int index;
@@ -94,7 +93,6 @@ static int alloc_irte(struct intel_iommu *iommu, int irq,if (index <0 ) {pr_warn ("IR%d: can't allocate an IRTE\n" , iommu->seq_id); }else { - cfg->remapped =1 ; irq_iommu->iommu = iommu; irq_iommu->irte_index = index; irq_iommu->sub_handle =0 ;
PATCH v5 14/33 irq_remapping/vt-d: Move struct irq_2_iommu into intel_irq_remapping.c
In reply to Jiang LiuNow only intel_irq_remapping.c access irq_2_iommu, so move it from hw_irq.h into intel_irq_remapping.c.
--- arch/x86/include/asm/hw_irq.h | 9 --------- drivers/iommu/intel_irq_remapping.c | 7 +++++++ 2 files changed, 7 insertions(+), 9 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -9
@@ -95,14 +95,6 @@ extern void trace_call_function_single_interrupt(void);#endif /* CONFIG_TRACING */ #ifdef CONFIG_IRQ_REMAP -/* Intel specific interrupt remapping information */ -struct irq_2_iommu { - struct intel_iommu *iommu; - u16 irte_index; - u16 sub_handle; - u8 irte_mask; -}; - /* AMD specific interrupt remapping information */ struct irq_2_irte { u16 devid; /* Device ID for IRTE table */
@@ -194,7 +186,6 @@ struct irq_cfg { u8 move_in_progress : 1;#ifdef CONFIG_IRQ_REMAP union { -struct irq_2_iommu irq_2_iommu;struct irq_2_irte irq_2_irte; };#endif
drivers/iommu/intel_irq_remapping.c +7 -0
@@ -32,6 +32,13 @@ struct hpet_scope {unsigned int devfn; }; +struct irq_2_iommu { +struct intel_iommu *iommu; +u16 irte_index; +u16 sub_handle; +u8 irte_mask; +}; +struct intel_ir_data {struct irq_2_iommu irq_2_iommu;struct irte irte_entry;
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] irq_remapping/vt-d: Move struct irq_2_iommu into intel_irq_remapping.c
irq_remapping/vt-d: Move struct irq_2_iommu into intel_irq_remapping.c
Commit-ID: 099c5c03487f6bca30c628e14e666788dd61fb33 Gitweb: http://git.kernel.org/tip/099c5c03487f6bca30c628e14e666788dd61fb33 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:51 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:53 +0200
irq_remapping/vt-d: Move struct irq_2_iommu into intel_irq_remapping.c
Now only intel_irq_remapping.c access irq_2_iommu, so move it from hw_irq.h into intel_irq_remapping.c.
--- arch/x86/include/asm/hw_irq.h | 9 --------- drivers/iommu/intel_irq_remapping.c | 7 +++++++ 2 files changed, 7 insertions(+), 9 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -9
@@ -95,14 +95,6 @@ extern void trace_call_function_single_interrupt(void);#endif /* CONFIG_TRACING */ #ifdef CONFIG_IRQ_REMAP -/* Intel specific interrupt remapping information */ -struct irq_2_iommu { - struct intel_iommu *iommu; - u16 irte_index; - u16 sub_handle; - u8 irte_mask; -}; - /* AMD specific interrupt remapping information */ struct irq_2_irte { u16 devid; /* Device ID for IRTE table */
@@ -194,7 +186,6 @@ struct irq_cfg { u8 move_in_progress : 1;#ifdef CONFIG_IRQ_REMAP union { -struct irq_2_iommu irq_2_iommu;struct irq_2_irte irq_2_irte; };#endif
drivers/iommu/intel_irq_remapping.c +7 -0
@@ -32,6 +32,13 @@ struct hpet_scope {unsigned int devfn; }; +struct irq_2_iommu { +struct intel_iommu *iommu; +u16 irte_index; +u16 sub_handle; +u8 irte_mask; +}; +struct intel_ir_data {struct irq_2_iommu irq_2_iommu;struct irte irte_entry;
PATCH v5 15/33 irq_remapping/amd: Move struct irq_2_irte into amd_iommu.c
In reply to Jiang LiuNow only amd_iommu.c access irq_2_irte, so move it from hw_irq.h into amd_iommu.c.
--- arch/x86/include/asm/hw_irq.h | 13 ------------- drivers/iommu/amd_iommu.c | 5 +++++ 2 files changed, 5 insertions(+), 13 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -13
@@ -94,14 +94,6 @@ extern void trace_call_function_single_interrupt(void);#define trace_kvm_posted_intr_ipi kvm_posted_intr_ipi#endif /* CONFIG_TRACING */ -#ifdef CONFIG_IRQ_REMAP -/* AMD specific interrupt remapping information */ -struct irq_2_irte { -u16 devid;/* Device ID for IRTE table */ -u16 index;/* Index into IRTE table*/ -}; -#endif /* CONFIG_IRQ_REMAP */ -struct irq_domain ;#ifdef CONFIG_X86_LOCAL_APIC
@@ -184,11 +176,6 @@ struct irq_cfg {unsigned int dest_apicid;u8 vector; u8 move_in_progress : 1; -#ifdef CONFIG_IRQ_REMAP -union { -struct irq_2_irte irq_2_irte; - }; -#endif union { #ifdef CONFIG_X86_IO_APIC struct {
drivers/iommu/amd_iommu.c +5 -0
@@ -3858,6 +3858,11 @@ union irte { } fields; }; +struct irq_2_irte { +u16 devid;/* Device ID for IRTE table */ +u16 index;/* Index into IRTE table*/ +}; +struct amd_ir_data {struct irq_2_irte irq_2_irte;union irte irte_entry;
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] irq_remapping/amd: Move struct irq_2_irte into amd_iommu.c
irq_remapping/amd: Move struct irq_2_irte into amd_iommu.c
Commit-ID: 9c72496698a4dadd406d159f7735851a63ef9412 Gitweb: http://git.kernel.org/tip/9c72496698a4dadd406d159f7735851a63ef9412 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:52 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:53 +0200
irq_remapping/amd: Move struct irq_2_irte into amd_iommu.c
Now only amd_iommu.c access irq_2_irte, so move it from hw_irq.h into amd_iommu.c.
--- arch/x86/include/asm/hw_irq.h | 13 ------------- drivers/iommu/amd_iommu.c | 5 +++++ 2 files changed, 5 insertions(+), 13 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -13
@@ -94,14 +94,6 @@ extern void trace_call_function_single_interrupt(void);#define trace_kvm_posted_intr_ipi kvm_posted_intr_ipi#endif /* CONFIG_TRACING */ -#ifdef CONFIG_IRQ_REMAP -/* AMD specific interrupt remapping information */ -struct irq_2_irte { -u16 devid;/* Device ID for IRTE table */ -u16 index;/* Index into IRTE table*/ -}; -#endif /* CONFIG_IRQ_REMAP */ -struct irq_domain ;#ifdef CONFIG_X86_LOCAL_APIC
@@ -184,11 +176,6 @@ struct irq_cfg {unsigned int dest_apicid;u8 vector; u8 move_in_progress : 1; -#ifdef CONFIG_IRQ_REMAP -union { -struct irq_2_irte irq_2_irte; - }; -#endif union { #ifdef CONFIG_X86_IO_APIC struct {
drivers/iommu/amd_iommu.c +5 -0
@@ -3852,6 +3852,11 @@ union irte { } fields; }; +struct irq_2_irte { +u16 devid;/* Device ID for IRTE table */ +u16 index;/* Index into IRTE table*/ +}; +struct amd_ir_data {struct irq_2_irte irq_2_irte;union irte irte_entry;
PATCH v5 16/33 x86/irq: Move irq_cfg.irq_2_pin into io_apic.c
In reply to Jiang LiuNow only io_apic.c accesses struct irq_cfg.irq_2_pin, so move irq_2_pin into struct mp_chip_data in io_apic.c to clean up struct irq_cfg further.
--- arch/x86/include/asm/hw_irq.h | 7 -- arch/x86/kernel/apic/io_apic.c | 164 +++++++++++++++++++--------------------- arch/x86/kernel/apic/vector.c | 3 - 3 files changed, 77 insertions(+), 97 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -7
@@ -176,13 +176,6 @@ struct irq_cfg {unsigned int dest_apicid;u8 vector; u8 move_in_progress : 1; -union { -#ifdef CONFIG_X86_IO_APIC -struct { -struct list_head irq_2_pin; - }; -#endif - }; };extern struct irq_domain *x86_vector_domain;
arch/x86/kernel/apic/io_apic.c +77 -87
451 lines not on this page · raw message
arch/x86/kernel/apic/vector.c +0 -3
@@ -68,9 +68,6 @@ static struct irq_cfg *alloc_irq_cfg(int node) goto out_cfg;if (!zalloc_cpumask_var_node (&cfg->old_domain,GFP_KERNEL , node)) goto out_domain; -#ifdef CONFIG_X86_IO_APIC -INIT_LIST_HEAD (&cfg->irq_2_pin); -#endif return cfg; out_domain:free_cpumask_var (cfg->domain);
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Move irq_cfg.irq_2_pin into io_apic.c
x86/irq: Move irq_cfg.irq_2_pin into io_apic.c
Commit-ID: 4467715a44cca2fa41d25f3d32b737bd2331a8d9 Gitweb: http://git.kernel.org/tip/4467715a44cca2fa41d25f3d32b737bd2331a8d9 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:53 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:53 +0200
x86/irq: Move irq_cfg.irq_2_pin into io_apic.c
Now only io_apic.c accesses struct irq_cfg.irq_2_pin, so move irq_2_pin into struct mp_chip_data in io_apic.c to clean up struct irq_cfg further.
--- arch/x86/include/asm/hw_irq.h | 7 -- arch/x86/kernel/apic/io_apic.c | 164 +++++++++++++++++++---------------------- arch/x86/kernel/apic/vector.c | 3 - 3 files changed, 77 insertions(+), 97 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -7
@@ -176,13 +176,6 @@ struct irq_cfg {unsigned int dest_apicid;u8 vector; u8 move_in_progress : 1; -union { -#ifdef CONFIG_X86_IO_APIC -struct { -struct list_head irq_2_pin; - }; -#endif - }; };extern struct irq_domain *x86_vector_domain;
arch/x86/kernel/apic/io_apic.c +77 -87
451 lines not on this page · raw message
arch/x86/kernel/apic/vector.c +0 -3
@@ -68,9 +68,6 @@ static struct irq_cfg *alloc_irq_cfg(int node) goto out_cfg;if (!zalloc_cpumask_var_node (&cfg->old_domain,GFP_KERNEL , node)) goto out_domain; -#ifdef CONFIG_X86_IO_APIC -INIT_LIST_HEAD (&cfg->irq_2_pin); -#endif return cfg; out_domain:free_cpumask_var (cfg->domain);
PATCH v5 17/33 x86/irq: Kill struct io_apic_irq_attr
In reply to Jiang LiuNow there's no user of struct io_apic_irq_attr anymore, so kill it.
--- arch/x86/include/asm/io_apic.h | 7 ------- arch/x86/kernel/apic/io_apic.c | 10 ---------- 2 files changed, 17 deletions(-)
arch/x86/include/asm/io_apic.h +0 -7
@@ -157,13 +157,6 @@ extern int restore_ioapic_entries(void);extern void setup_ioapic_ids_from_mpc (void );extern void setup_ioapic_ids_from_mpc_nocheck (void ); -struct io_apic_irq_attr { -int ioapic; -int ioapic_pin; -int trigger; -int polarity; -}; -enum ioapic_domain_type {IOAPIC_DOMAIN_INVALID ,IOAPIC_DOMAIN_LEGACY ,
arch/x86/kernel/apic/io_apic.c +0 -10
@@ -2959,16 +2959,6 @@ int mp_ioapic_registered(u32 gsi_base)return 0 ; } -static inline void set_io_apic_irq_attr (struct io_apic_irq_attr *irq_attr, -int ioapic,int ioapic_pin, -int trigger,int polarity) -{ - irq_attr->ioapic = ioapic; - irq_attr->ioapic_pin = ioapic_pin; - irq_attr->trigger = trigger; - irq_attr->polarity = polarity; -} -static void mp_irqdomain_get_attr (u32 gsi,struct mp_chip_data *data,struct irq_alloc_info *info) {
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Remove struct io_apic_irq_attr
x86/irq: Remove struct io_apic_irq_attr
Commit-ID: 50a6ad84b2a2c971e76d57884d61a5a55d7c1601 Gitweb: http://git.kernel.org/tip/50a6ad84b2a2c971e76d57884d61a5a55d7c1601 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:54 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:53 +0200
x86/irq: Remove struct io_apic_irq_attr
Now there's no user of struct io_apic_irq_attr anymore, so remove it.
--- arch/x86/include/asm/io_apic.h | 7 ------- arch/x86/kernel/apic/io_apic.c | 10 ---------- 2 files changed, 17 deletions(-)
arch/x86/include/asm/io_apic.h +0 -7
@@ -157,13 +157,6 @@ extern int restore_ioapic_entries(void);extern void setup_ioapic_ids_from_mpc (void );extern void setup_ioapic_ids_from_mpc_nocheck (void ); -struct io_apic_irq_attr { -int ioapic; -int ioapic_pin; -int trigger; -int polarity; -}; -enum ioapic_domain_type {IOAPIC_DOMAIN_INVALID ,IOAPIC_DOMAIN_LEGACY ,
arch/x86/kernel/apic/io_apic.c +0 -10
@@ -2959,16 +2959,6 @@ int mp_ioapic_registered(u32 gsi_base)return 0 ; } -static inline void set_io_apic_irq_attr (struct io_apic_irq_attr *irq_attr, -int ioapic,int ioapic_pin, -int trigger,int polarity) -{ - irq_attr->ioapic = ioapic; - irq_attr->ioapic_pin = ioapic_pin; - irq_attr->trigger = trigger; - irq_attr->polarity = polarity; -} -static void mp_irqdomain_get_attr (u32 gsi,struct mp_chip_data *data,struct irq_alloc_info *info) {
PATCH v5 18/33 x86/irq: Kill x86_io_apic_ops.write and x86_io_apic_ops.modify
In reply to Jiang Liux86_io_apic_ops.write is always set to native_io_apic_write(), and nobody overrides it. So get rid of the indirection by changing native_io_apic_write() as io_apic_write() and killing x86_io_apic_ops.write.
Do the same for x86_io_apic_ops.modify and native_io_apic_modify().
--- arch/x86/include/asm/io_apic.h | 13 ------------- arch/x86/include/asm/x86_init.h | 2 -- arch/x86/kernel/apic/io_apic.c | 6 ++++-- arch/x86/kernel/x86_init.c | 2 -- 4 files changed, 4 insertions(+), 19 deletions(-)
arch/x86/include/asm/io_apic.h +0 -13
@@ -208,8 +208,6 @@ extern void disable_ioapic_support(void);extern void __init native_io_apic_init_mappings (void );extern unsigned int native_io_apic_read (unsigned int apic,unsigned int reg); -extern void native_io_apic_write (unsigned int apic,unsigned int reg,unsigned int val); -extern void native_io_apic_modify (unsigned int apic,unsigned int reg,unsigned int val);extern void native_disable_io_apic (void );static inline unsigned int io_apic_read (unsigned int apic,unsigned int reg)
@@ -217,15 +215,6 @@ static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg)return x86_io_apic_ops.read (apic, reg); } -static inline void io_apic_write (unsigned int apic,unsigned int reg,unsigned int value) -{ - x86_io_apic_ops.write (apic, reg, value); -} -static inline void io_apic_modify (unsigned int apic,unsigned int reg,unsigned int value) -{ - x86_io_apic_ops.modify (apic, reg, value); -} -extern void setup_IO_APIC (void );extern void enable_IO_APIC (void );extern void disable_IO_APIC (void );
@@ -266,8 +255,6 @@ static inline void mp_save_irq(struct mpc_intsrc *m) { };static inline void disable_ioapic_support (void ) { }#define native_io_apic_init_mappings NULL#define native_io_apic_read NULL -#define native_io_apic_write NULL -#define native_io_apic_modify NULL#define native_disable_io_apic NULLstatic inline void setup_IO_APIC (void ) { }
arch/x86/include/asm/x86_init.h +0 -2
@@ -182,8 +182,6 @@ struct x86_msi_ops {struct x86_io_apic_ops {void (*init) (void );unsigned int (*read) (unsigned int apic,unsigned int reg); -void (*write) (unsigned int apic,unsigned int reg,unsigned int value); -void (*modify) (unsigned int apic,unsigned int reg,unsigned int value);void (*disable)(void ); };
arch/x86/kernel/apic/io_apic.c +4 -2
@@ -280,7 +280,8 @@ unsigned int native_io_apic_read(unsigned int apic, unsigned int reg)return readl (&io_apic->data); } -void native_io_apic_write (unsigned int apic,unsigned int reg,unsigned int value) +static void io_apic_write (unsigned int apic,unsigned int reg, +unsigned int value) {struct io_apic __iomem *io_apic =io_apic_base (apic);
@@ -294,7 +295,8 @@ void native_io_apic_write(unsigned int apic, unsigned int reg, unsigned int valu* * Older SiS APIC requires we rewrite the index register */ -void native_io_apic_modify (unsigned int apic,unsigned int reg,unsigned int value) +static void io_apic_modify (unsigned int apic,unsigned int reg, +unsigned int value) {struct io_apic __iomem *io_apic =io_apic_base (apic);
arch/x86/kernel/x86_init.c +0 -2
@@ -141,7 +141,5 @@ void arch_restore_msi_irqs(struct pci_dev *dev)struct x86_io_apic_ops x86_io_apic_ops = { .init = native_io_apic_init_mappings, .read = native_io_apic_read, - .write = native_io_apic_write, - .modify = native_io_apic_modify, .disable = native_disable_io_apic, };
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Remove x86_io_apic_ops.write and x86_io_apic_ops.modify
x86/irq: Remove x86_io_apic_ops.write and x86_io_apic_ops.modify
Commit-ID: 9a93d4736ec5ec322ec8f240a292c1a86cd0876d Gitweb: http://git.kernel.org/tip/9a93d4736ec5ec322ec8f240a292c1a86cd0876d Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:55 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:53 +0200
x86/irq: Remove x86_io_apic_ops.write and x86_io_apic_ops.modify
x86_io_apic_ops.write is always set to native_io_apic_write(), and nobody overrides it. So get rid of the indirection by changing native_io_apic_write() as io_apic_write() and removing x86_io_apic_ops.write.
Do the same for x86_io_apic_ops.modify and native_io_apic_modify().
--- arch/x86/include/asm/io_apic.h | 13 ------------- arch/x86/include/asm/x86_init.h | 2 -- arch/x86/kernel/apic/io_apic.c | 6 ++++-- arch/x86/kernel/x86_init.c | 2 -- 4 files changed, 4 insertions(+), 19 deletions(-)
arch/x86/include/asm/io_apic.h +0 -13
@@ -208,8 +208,6 @@ extern void disable_ioapic_support(void);extern void __init native_io_apic_init_mappings (void );extern unsigned int native_io_apic_read (unsigned int apic,unsigned int reg); -extern void native_io_apic_write (unsigned int apic,unsigned int reg,unsigned int val); -extern void native_io_apic_modify (unsigned int apic,unsigned int reg,unsigned int val);extern void native_disable_io_apic (void );static inline unsigned int io_apic_read (unsigned int apic,unsigned int reg)
@@ -217,15 +215,6 @@ static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg)return x86_io_apic_ops.read (apic, reg); } -static inline void io_apic_write (unsigned int apic,unsigned int reg,unsigned int value) -{ - x86_io_apic_ops.write (apic, reg, value); -} -static inline void io_apic_modify (unsigned int apic,unsigned int reg,unsigned int value) -{ - x86_io_apic_ops.modify (apic, reg, value); -} -extern void setup_IO_APIC (void );extern void enable_IO_APIC (void );extern void disable_IO_APIC (void );
@@ -266,8 +255,6 @@ static inline void mp_save_irq(struct mpc_intsrc *m) { };static inline void disable_ioapic_support (void ) { }#define native_io_apic_init_mappings NULL#define native_io_apic_read NULL -#define native_io_apic_write NULL -#define native_io_apic_modify NULL#define native_disable_io_apic NULLstatic inline void setup_IO_APIC (void ) { }
arch/x86/include/asm/x86_init.h +0 -2
@@ -182,8 +182,6 @@ struct x86_msi_ops {struct x86_io_apic_ops {void (*init) (void );unsigned int (*read) (unsigned int apic,unsigned int reg); -void (*write) (unsigned int apic,unsigned int reg,unsigned int value); -void (*modify) (unsigned int apic,unsigned int reg,unsigned int value);void (*disable)(void ); };
arch/x86/kernel/apic/io_apic.c +4 -2
@@ -280,7 +280,8 @@ unsigned int native_io_apic_read(unsigned int apic, unsigned int reg)return readl (&io_apic->data); } -void native_io_apic_write (unsigned int apic,unsigned int reg,unsigned int value) +static void io_apic_write (unsigned int apic,unsigned int reg, +unsigned int value) {struct io_apic __iomem *io_apic =io_apic_base (apic);
@@ -294,7 +295,8 @@ void native_io_apic_write(unsigned int apic, unsigned int reg, unsigned int valu* * Older SiS APIC requires we rewrite the index register */ -void native_io_apic_modify (unsigned int apic,unsigned int reg,unsigned int value) +static void io_apic_modify (unsigned int apic,unsigned int reg, +unsigned int value) {struct io_apic __iomem *io_apic =io_apic_base (apic);
arch/x86/kernel/x86_init.c +0 -2
@@ -141,7 +141,5 @@ void arch_restore_msi_irqs(struct pci_dev *dev)struct x86_io_apic_ops x86_io_apic_ops = { .init = native_io_apic_init_mappings, .read = native_io_apic_read, - .write = native_io_apic_write, - .modify = native_io_apic_modify, .disable = native_disable_io_apic, };
PATCH v5 19/33 x86/irq: Clean up io_apic.h
In reply to Jiang LiuClean up io_apic.h by:
1) moving definition of struct mp_ioapic_gsi into io_apic.c
2) changing mp_pin_to_gsi() and mp_ioapic_gsi_routing() as static
3) killing unused MP_MAX_IOAPIC_PIN
4) killing useless forward declaration
5) killing useless comments
--- arch/x86/include/asm/io_apic.h | 13 ++----------- arch/x86/kernel/apic/io_apic.c | 23 ++++++++--------------- 2 files changed, 10 insertions(+), 26 deletions(-)
arch/x86/include/asm/io_apic.h +2 -11
@@ -113,9 +113,6 @@ extern int nr_ioapics;extern int mpc_ioapic_id (int ioapic);extern unsigned int mpc_ioapic_addr (int ioapic); -extern struct mp_ioapic_gsi *mp_ioapic_gsi_routing (int ioapic); - -#define MP_MAX_IOAPIC_PIN 127/* # of MP IRQ source entries */ extern int mp_irq_entries;
@@ -135,6 +132,8 @@ extern int noioapicquirk;/* -1 if "noapic" boot option passed */ extern int noioapicreroute; +extern u32 gsi_top; +extern unsigned long io_apic_irqs;#define IO_APIC_IRQ (x) (((x) >= NR_IRQS_LEGACY) || ((1 << (x)) & io_apic_irqs))
@@ -174,15 +173,8 @@ struct ioapic_domain_cfg {struct device_node *dev; }; -struct mp_ioapic_gsi { -u32 gsi_base; -u32 gsi_end; -}; -extern u32 gsi_top; -extern int mp_find_ioapic (u32 gsi);extern int mp_find_ioapic_pin (int ioapic,u32 gsi); -extern u32 mp_pin_to_gsi (int ioapic,int pin);extern int mp_map_gsi_to_irq (u32 gsi,unsigned int flags,struct irq_alloc_info *info);extern void mp_unmap_irq (int irq);
@@ -231,7 +223,6 @@ static inline int arch_early_ioapic_init(void) { return 0; }static inline void print_IO_APICs (void ) {}#define gsi_top (NR_IRQS_LEGACY)static inline int mp_find_ioapic (u32 gsi) {return 0 ; } -static inline u32 mp_pin_to_gsi (int ioapic,int pin) {return UINT_MAX ; }static inline int mp_map_gsi_to_irq (u32 gsi,unsigned int flags,struct irq_alloc_info *info) {
arch/x86/kernel/apic/io_apic.c +8 -15
@@ -63,7 +63,6 @@#define for_each_ioapic_pin (idx, pin) \ for_each_ioapic((idx)) \ for_each_pin((idx), (pin)) -#define for_each_irq_pin (entry, head) \ list_for_each_entry(entry, &head, list)
@@ -92,6 +91,11 @@ struct mp_chip_data {bool isa_irq; }; +struct mp_ioapic_gsi { +u32 gsi_base; +u32 gsi_end; +}; + static struct ioapic { /* * # of IRQ routing registers
@@ -122,7 +126,7 @@ unsigned int mpc_ioapic_addr(int ioapic_idx)return ioapics[ioapic_idx].mp_config.apicaddr; } -struct mp_ioapic_gsi *mp_ioapic_gsi_routing (int ioapic_idx) +static inline struct mp_ioapic_gsi *mp_ioapic_gsi_routing (int ioapic_idx) {return &ioapics[ioapic_idx].gsi_config; }
@@ -134,7 +138,7 @@ static inline int mp_ioapic_pin_count(int ioapic)return gsi_cfg->gsi_end - gsi_cfg->gsi_base +1 ; } -u32 mp_pin_to_gsi (int ioapic,int pin) +static inline u32 mp_pin_to_gsi (int ioapic,int pin) {return mp_ioapic_gsi_routing (ioapic)->gsi_base + pin; }
@@ -1153,8 +1157,7 @@ static int pin_2_irq(int idx, int ioapic, int pin, unsigned int flags)return mp_map_pin_to_irq (gsi, idx, ioapic, pin, flags,NULL ); } -int mp_map_gsi_to_irq (u32 gsi,unsigned int flags, -struct irq_alloc_info *info) +int mp_map_gsi_to_irq (u32 gsi,unsigned int flags,struct irq_alloc_info *info) {int ioapic, pin, idx;
@@ -1719,7 +1722,6 @@ static int __init timer_irq_works(void)* This is not complete - we should be able to fake * an edge even if it isn't on the 8259A... */ -static unsigned int startup_ioapic_irq (struct irq_data *data) {int was_pending =0 , irq = data->irq;
@@ -1737,15 +1739,6 @@ static unsigned int startup_ioapic_irq(struct irq_data *data)return was_pending; } -/* -* Level and edge triggered IO-APIC interrupts need different handling, -* so we use two separate IRQ descriptors. Edge triggered IRQs can be -* handled with the level-triggered descriptor, but that one has slightly -* more overhead. Level-triggered interrupts cannot be handled with the -* edge-triggered handler, without risking IRQ storms and other ugly -* races. -*/ -static void __target_IO_APIC_irq (unsigned int irq,struct irq_cfg *cfg,struct mp_chip_data *data) {
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Clean up io_apic.h
x86/irq: Clean up io_apic.h
Commit-ID: 154d9e50e413ee144d48ccd6c402633ffbecbfff Gitweb: http://git.kernel.org/tip/154d9e50e413ee144d48ccd6c402633ffbecbfff Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:56 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:54 +0200
x86/irq: Clean up io_apic.h
Clean up io_apic.h by:
1) moving definition of struct mp_ioapic_gsi into io_apic.c
2) changing mp_pin_to_gsi() and mp_ioapic_gsi_routing() as static
3) removing unused MP_MAX_IOAPIC_PIN
4) removing useless forward declaration
5) removing useless comments
--- arch/x86/include/asm/io_apic.h | 13 ++----------- arch/x86/kernel/apic/io_apic.c | 23 ++++++++--------------- 2 files changed, 10 insertions(+), 26 deletions(-)
arch/x86/include/asm/io_apic.h +2 -11
@@ -113,9 +113,6 @@ extern int nr_ioapics;extern int mpc_ioapic_id (int ioapic);extern unsigned int mpc_ioapic_addr (int ioapic); -extern struct mp_ioapic_gsi *mp_ioapic_gsi_routing (int ioapic); - -#define MP_MAX_IOAPIC_PIN 127/* # of MP IRQ source entries */ extern int mp_irq_entries;
@@ -135,6 +132,8 @@ extern int noioapicquirk;/* -1 if "noapic" boot option passed */ extern int noioapicreroute; +extern u32 gsi_top; +extern unsigned long io_apic_irqs;#define IO_APIC_IRQ (x) (((x) >= NR_IRQS_LEGACY) || ((1 << (x)) & io_apic_irqs))
@@ -174,15 +173,8 @@ struct ioapic_domain_cfg {struct device_node *dev; }; -struct mp_ioapic_gsi { -u32 gsi_base; -u32 gsi_end; -}; -extern u32 gsi_top; -extern int mp_find_ioapic (u32 gsi);extern int mp_find_ioapic_pin (int ioapic,u32 gsi); -extern u32 mp_pin_to_gsi (int ioapic,int pin);extern int mp_map_gsi_to_irq (u32 gsi,unsigned int flags,struct irq_alloc_info *info);extern void mp_unmap_irq (int irq);
@@ -231,7 +223,6 @@ static inline int arch_early_ioapic_init(void) { return 0; }static inline void print_IO_APICs (void ) {}#define gsi_top (NR_IRQS_LEGACY)static inline int mp_find_ioapic (u32 gsi) {return 0 ; } -static inline u32 mp_pin_to_gsi (int ioapic,int pin) {return UINT_MAX ; }static inline int mp_map_gsi_to_irq (u32 gsi,unsigned int flags,struct irq_alloc_info *info) {
arch/x86/kernel/apic/io_apic.c +8 -15
@@ -63,7 +63,6 @@#define for_each_ioapic_pin (idx, pin) \ for_each_ioapic((idx)) \ for_each_pin((idx), (pin)) -#define for_each_irq_pin (entry, head) \ list_for_each_entry(entry, &head, list)
@@ -92,6 +91,11 @@ struct mp_chip_data {bool isa_irq; }; +struct mp_ioapic_gsi { +u32 gsi_base; +u32 gsi_end; +}; + static struct ioapic { /* * # of IRQ routing registers
@@ -122,7 +126,7 @@ unsigned int mpc_ioapic_addr(int ioapic_idx)return ioapics[ioapic_idx].mp_config.apicaddr; } -struct mp_ioapic_gsi *mp_ioapic_gsi_routing (int ioapic_idx) +static inline struct mp_ioapic_gsi *mp_ioapic_gsi_routing (int ioapic_idx) {return &ioapics[ioapic_idx].gsi_config; }
@@ -134,7 +138,7 @@ static inline int mp_ioapic_pin_count(int ioapic)return gsi_cfg->gsi_end - gsi_cfg->gsi_base +1 ; } -u32 mp_pin_to_gsi (int ioapic,int pin) +static inline u32 mp_pin_to_gsi (int ioapic,int pin) {return mp_ioapic_gsi_routing (ioapic)->gsi_base + pin; }
@@ -1153,8 +1157,7 @@ static int pin_2_irq(int idx, int ioapic, int pin, unsigned int flags)return mp_map_pin_to_irq (gsi, idx, ioapic, pin, flags,NULL ); } -int mp_map_gsi_to_irq (u32 gsi,unsigned int flags, -struct irq_alloc_info *info) +int mp_map_gsi_to_irq (u32 gsi,unsigned int flags,struct irq_alloc_info *info) {int ioapic, pin, idx;
@@ -1719,7 +1722,6 @@ static int __init timer_irq_works(void)* This is not complete - we should be able to fake * an edge even if it isn't on the 8259A... */ -static unsigned int startup_ioapic_irq (struct irq_data *data) {int was_pending =0 , irq = data->irq;
@@ -1737,15 +1739,6 @@ static unsigned int startup_ioapic_irq(struct irq_data *data)return was_pending; } -/* -* Level and edge triggered IO-APIC interrupts need different handling, -* so we use two separate IRQ descriptors. Edge triggered IRQs can be -* handled with the level-triggered descriptor, but that one has slightly -* more overhead. Level-triggered interrupts cannot be handled with the -* edge-triggered handler, without risking IRQ storms and other ugly -* races. -*/ -static void __target_IO_APIC_irq (unsigned int irq,struct irq_cfg *cfg,struct mp_chip_data *data) {
PATCH v5 20/33 x86/irq: Use cached IOAPIC entry instead of reading from hardware
In reply to Jiang LiuUse cached IOAPIC entry instead of reading data from IOAPIC hardware registers to improve performance.
--- arch/x86/kernel/apic/io_apic.c | 78 +++++++++++----------------------------- 1 file changed, 21 insertions(+), 57 deletions(-)
arch/x86/kernel/apic/io_apic.c +21 -57
@@ -67,8 +67,13 @@list_for_each_entry (entry, &head, list)/* -* Is the SiS APIC rmw bug present ? +* Is the SiS APIC rmw bug present ? * -1 = don't know, 0 = no, 1 = yes +* When doing a read-modify-write operation on IOAPIC registers, older SiS APIC +* requires we rewrite the index register again where the read already set up +* the index register. +* The code to make use of sis_apic_bug has been removed, but we don't want to +* loss this knowledge. */ int sis_apic_bug = -1;
@@ -293,22 +298,6 @@ static void io_apic_write(unsigned int apic, unsigned int reg,writel (value, &io_apic->data); } -/* -* Re-write a value: to be used for read-modify-write -* cycles where the read already set up the index register. -* -* Older SiS APIC requires we rewrite the index register -*/ -static void io_apic_modify (unsigned int apic,unsigned int reg, -unsigned int value) -{ -struct io_apic __iomem *io_apic =io_apic_base (apic); - -if (sis_apic_bug) -writel (reg, &io_apic->index); -writel (value, &io_apic->data); -} -union entry_union {struct {u32 w1, w2; };struct IO_APIC_route_entry entry;
@@ -445,29 +434,23 @@ static void __init replace_pin_at_irq_node(struct mp_chip_data *data, int node,add_pin_to_irq_node (data, node, newapic, newpin); } -static void __io_apic_modify_irq (struct irq_pin_list *entry, -int mask_and,int mask_or, -void (*final)(struct irq_pin_list *entry)) -{ -unsigned int reg, pin; - - pin = entry->pin; - reg =io_apic_read (entry->apic,0x10 + pin *2 ); - reg &= mask_and; - reg |= mask_or; -io_apic_modify (entry->apic,0x10 + pin *2 , reg); -if (final) -final (entry); -} -static void io_apic_modify_irq (struct mp_chip_data *data,int mask_and,int mask_or,void (*final)(struct irq_pin_list *entry)) { +union entry_union eu;struct irq_pin_list *entry; -for_each_irq_pin (entry, data->irq_2_pin) -__io_apic_modify_irq (entry, mask_and, mask_or, final); + eu.entry = data->entry; + eu.w1 &= mask_and; + eu.w1 |= mask_or; + data->entry = eu.entry; + +for_each_irq_pin (entry, data->irq_2_pin) { +io_apic_write (entry->apic,0x10 +2 * entry->pin, eu.w1); +if (final) +final (entry); + } }static void io_apic_sync (struct irq_pin_list *entry)
@@ -1739,28 +1722,6 @@ static unsigned int startup_ioapic_irq(struct irq_data *data)return was_pending; } -static void __target_IO_APIC_irq (unsigned int irq,struct irq_cfg *cfg, -struct mp_chip_data *data) -{ -int apic, pin; -struct irq_pin_list *entry; -u8 vector = cfg->vector; -unsigned int dest =SET_APIC_LOGICAL_ID (cfg->dest_apicid); - -for_each_irq_pin (entry, data->irq_2_pin) { -unsigned int reg; - - apic = entry->apic; - pin = entry->pin; - -io_apic_write (apic,0x11 + pin*2 , dest); - reg =io_apic_read (apic,0x10 + pin*2 ); - reg &= ~IO_APIC_REDIR_VECTOR_MASK ; - reg |= vector; -io_apic_modify (apic,0x10 + pin*2 , reg); - } -} -atomic_t irq_mis_count;#ifdef CONFIG_GENERIC_PENDING_IRQ
@@ -1926,6 +1887,7 @@ static int ioapic_set_affinity(struct irq_data *irq_data, {struct irq_data *parent = irq_data->parent_data;struct mp_chip_data *data = irq_data->chip_data; +struct irq_pin_list *entry;struct irq_cfg *cfg;unsigned long flags;int ret;
@@ -1936,7 +1898,9 @@ static int ioapic_set_affinity(struct irq_data *irq_data, cfg =irqd_cfg (irq_data); data->entry.dest = cfg->dest_apicid; data->entry.vector = cfg->vector; -__target_IO_APIC_irq (irq_data->irq, cfg, irq_data->chip_data); +for_each_irq_pin (entry, data->irq_2_pin) +__ioapic_write_entry (entry->apic, entry->pin, + data->entry); }raw_spin_unlock_irqrestore (&ioapic_lock, flags);
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Use cached IOAPIC entry instead of reading from hardware
x86/irq: Use cached IOAPIC entry instead of reading from hardware
Commit-ID: 0be275e3a5607b23f5132121bca22a10ee23aa99 Gitweb: http://git.kernel.org/tip/0be275e3a5607b23f5132121bca22a10ee23aa99 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:57 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:54 +0200
x86/irq: Use cached IOAPIC entry instead of reading from hardware
Use cached IOAPIC entry instead of reading data from IOAPIC hardware registers to improve performance.
--- arch/x86/kernel/apic/io_apic.c | 78 ++++++++++++------------------------------ 1 file changed, 21 insertions(+), 57 deletions(-)
arch/x86/kernel/apic/io_apic.c +21 -57
@@ -67,8 +67,13 @@list_for_each_entry (entry, &head, list)/* -* Is the SiS APIC rmw bug present ? +* Is the SiS APIC rmw bug present ? * -1 = don't know, 0 = no, 1 = yes +* When doing a read-modify-write operation on IOAPIC registers, older SiS APIC +* requires we rewrite the index register again where the read already set up +* the index register. +* The code to make use of sis_apic_bug has been removed, but we don't want to +* lose this knowledge. */ int sis_apic_bug = -1;
@@ -293,22 +298,6 @@ static void io_apic_write(unsigned int apic, unsigned int reg,writel (value, &io_apic->data); } -/* -* Re-write a value: to be used for read-modify-write -* cycles where the read already set up the index register. -* -* Older SiS APIC requires we rewrite the index register -*/ -static void io_apic_modify (unsigned int apic,unsigned int reg, -unsigned int value) -{ -struct io_apic __iomem *io_apic =io_apic_base (apic); - -if (sis_apic_bug) -writel (reg, &io_apic->index); -writel (value, &io_apic->data); -} -union entry_union {struct {u32 w1, w2; };struct IO_APIC_route_entry entry;
@@ -445,29 +434,23 @@ static void __init replace_pin_at_irq_node(struct mp_chip_data *data, int node,add_pin_to_irq_node (data, node, newapic, newpin); } -static void __io_apic_modify_irq (struct irq_pin_list *entry, -int mask_and,int mask_or, -void (*final)(struct irq_pin_list *entry)) -{ -unsigned int reg, pin; - - pin = entry->pin; - reg =io_apic_read (entry->apic,0x10 + pin *2 ); - reg &= mask_and; - reg |= mask_or; -io_apic_modify (entry->apic,0x10 + pin *2 , reg); -if (final) -final (entry); -} -static void io_apic_modify_irq (struct mp_chip_data *data,int mask_and,int mask_or,void (*final)(struct irq_pin_list *entry)) { +union entry_union eu;struct irq_pin_list *entry; -for_each_irq_pin (entry, data->irq_2_pin) -__io_apic_modify_irq (entry, mask_and, mask_or, final); + eu.entry = data->entry; + eu.w1 &= mask_and; + eu.w1 |= mask_or; + data->entry = eu.entry; + +for_each_irq_pin (entry, data->irq_2_pin) { +io_apic_write (entry->apic,0x10 +2 * entry->pin, eu.w1); +if (final) +final (entry); + } }static void io_apic_sync (struct irq_pin_list *entry)
@@ -1739,28 +1722,6 @@ static unsigned int startup_ioapic_irq(struct irq_data *data)return was_pending; } -static void __target_IO_APIC_irq (unsigned int irq,struct irq_cfg *cfg, -struct mp_chip_data *data) -{ -int apic, pin; -struct irq_pin_list *entry; -u8 vector = cfg->vector; -unsigned int dest =SET_APIC_LOGICAL_ID (cfg->dest_apicid); - -for_each_irq_pin (entry, data->irq_2_pin) { -unsigned int reg; - - apic = entry->apic; - pin = entry->pin; - -io_apic_write (apic,0x11 + pin*2 , dest); - reg =io_apic_read (apic,0x10 + pin*2 ); - reg &= ~IO_APIC_REDIR_VECTOR_MASK ; - reg |= vector; -io_apic_modify (apic,0x10 + pin*2 , reg); - } -} -atomic_t irq_mis_count;#ifdef CONFIG_GENERIC_PENDING_IRQ
@@ -1926,6 +1887,7 @@ static int ioapic_set_affinity(struct irq_data *irq_data, {struct irq_data *parent = irq_data->parent_data;struct mp_chip_data *data = irq_data->chip_data; +struct irq_pin_list *entry;struct irq_cfg *cfg;unsigned long flags;int ret;
@@ -1936,7 +1898,9 @@ static int ioapic_set_affinity(struct irq_data *irq_data, cfg =irqd_cfg (irq_data); data->entry.dest = cfg->dest_apicid; data->entry.vector = cfg->vector; -__target_IO_APIC_irq (irq_data->irq, cfg, irq_data->chip_data); +for_each_irq_pin (entry, data->irq_2_pin) +__ioapic_write_entry (entry->apic, entry->pin, + data->entry); }raw_spin_unlock_irqrestore (&ioapic_lock, flags);
PATCH v5 21/33 x86/irq: Remove sis apic bug workaround
In reply to Jiang LiuFrom: Thomas Gleixner <[email protected]>
The SiS apic bug workaround is now obsolete as we cache the register values for performance reasons.
--- arch/x86/include/asm/io_apic.h | 3 --- arch/x86/kernel/apic/io_apic.c | 35 ++++++++++------------------------- drivers/pci/quirks.c | 7 ------- 3 files changed, 10 insertions(+), 35 deletions(-)
arch/x86/include/asm/io_apic.h +0 -3
@@ -120,9 +120,6 @@ extern int mp_irq_entries;/* MP IRQ source entries */ extern struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES ]; -/* Older SiS APIC requires we rewrite the index register */ -extern int sis_apic_bug; -/* 1 if "noapic" boot option passed */ extern int skip_ioapic_setup;
arch/x86/kernel/apic/io_apic.c +10 -25
@@ -18,6 +18,16 @@* and Rolf G. Tews * for testing these extensively * Paul Diefenbaugh : Added full ACPI support +* +* Historical information which is worth to be preserved: +* +* - SiS APIC rmw bug: +* +* We used to have a workaround for a bug in SiS chips which +* required to rewrite the index register for a read-modify-write +* operation as the chip lost the index information which was +* setup for the read already. We cache the data now, so that +* workaround has been removed. */ #include <linux/mm.h>
@@ -66,17 +76,6 @@#define for_each_irq_pin (entry, head) \ list_for_each_entry(entry, &head, list) -/* -* Is the SiS APIC rmw bug present ? -* -1 = don't know, 0 = no, 1 = yes -* When doing a read-modify-write operation on IOAPIC registers, older SiS APIC -* requires we rewrite the index register again where the read already set up -* the index register. -* The code to make use of sis_apic_bug has been removed, but we don't want to -* loss this knowledge. -*/ -int sis_apic_bug =-1 ; -static DEFINE_RAW_SPINLOCK (ioapic_lock);static DEFINE_MUTEX (ioapic_mutex);static unsigned int ioapic_dynirq_base;
@@ -2320,20 +2319,6 @@ void __init setup_IO_APIC(void) ioapic_initialized =1 ; } -/* -* Called after all the initialization is done. If we didn't find any -* APIC bugs then we can allow the modify fast path -*/ - -static int __init io_apic_bug_finalize (void ) -{ -if (sis_apic_bug ==-1 ) - sis_apic_bug =0 ; -return 0 ; -} - -late_initcall (io_apic_bug_finalize); -static void resume_ioapic_id (int ioapic_idx) {unsigned long flags;
drivers/pci/quirks.c +0 -7
@@ -819,13 +819,6 @@ static void quirk_amd_ioapic(struct pci_dev *dev) } }DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_AMD ,PCI_DEVICE_ID_AMD_VIPER_7410 , quirk_amd_ioapic); - -static void quirk_ioapic_rmw (struct pci_dev *dev) -{ -if (dev->devfn ==0 && dev->bus->number ==0 ) - sis_apic_bug =1 ; -} -DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_SI ,PCI_ANY_ID , quirk_ioapic_rmw);#endif /* CONFIG_X86_IO_APIC */ /*
Signature · 1 line
1.7.10.4
tip-bot for Thomas Gleixner
merge bot[tip:x86/apic] x86/irq: Remove sis apic bug workaround
x86/irq: Remove sis apic bug workaround
Commit-ID: 1f934641294ca2e09016c689862378fbb15da4d4 Gitweb: http://git.kernel.org/tip/1f934641294ca2e09016c689862378fbb15da4d4 Author: Thomas Gleixner <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:58 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:54 +0200
x86/irq: Remove sis apic bug workaround
The SiS apic bug workaround is now obsolete as we cache the register values for performance reasons.
--- arch/x86/include/asm/io_apic.h | 3 --- arch/x86/kernel/apic/io_apic.c | 35 ++++++++++------------------------- drivers/pci/quirks.c | 7 ------- 3 files changed, 10 insertions(+), 35 deletions(-)
arch/x86/include/asm/io_apic.h +0 -3
@@ -120,9 +120,6 @@ extern int mp_irq_entries;/* MP IRQ source entries */ extern struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES ]; -/* Older SiS APIC requires we rewrite the index register */ -extern int sis_apic_bug; -/* 1 if "noapic" boot option passed */ extern int skip_ioapic_setup;
arch/x86/kernel/apic/io_apic.c +10 -25
@@ -18,6 +18,16 @@* and Rolf G. Tews * for testing these extensively * Paul Diefenbaugh : Added full ACPI support +* +* Historical information which is worth to be preserved: +* +* - SiS APIC rmw bug: +* +* We used to have a workaround for a bug in SiS chips which +* required to rewrite the index register for a read-modify-write +* operation as the chip lost the index information which was +* setup for the read already. We cache the data now, so that +* workaround has been removed. */ #include <linux/mm.h>
@@ -66,17 +76,6 @@#define for_each_irq_pin (entry, head) \ list_for_each_entry(entry, &head, list) -/* -* Is the SiS APIC rmw bug present ? -* -1 = don't know, 0 = no, 1 = yes -* When doing a read-modify-write operation on IOAPIC registers, older SiS APIC -* requires we rewrite the index register again where the read already set up -* the index register. -* The code to make use of sis_apic_bug has been removed, but we don't want to -* lose this knowledge. -*/ -int sis_apic_bug =-1 ; -static DEFINE_RAW_SPINLOCK (ioapic_lock);static DEFINE_MUTEX (ioapic_mutex);static unsigned int ioapic_dynirq_base;
@@ -2320,20 +2319,6 @@ void __init setup_IO_APIC(void) ioapic_initialized =1 ; } -/* -* Called after all the initialization is done. If we didn't find any -* APIC bugs then we can allow the modify fast path -*/ - -static int __init io_apic_bug_finalize (void ) -{ -if (sis_apic_bug ==-1 ) - sis_apic_bug =0 ; -return 0 ; -} - -late_initcall (io_apic_bug_finalize); -static void resume_ioapic_id (int ioapic_idx) {unsigned long flags;
drivers/pci/quirks.c +0 -7
@@ -819,13 +819,6 @@ static void quirk_amd_ioapic(struct pci_dev *dev) } }DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_AMD ,PCI_DEVICE_ID_AMD_VIPER_7410 , quirk_amd_ioapic); - -static void quirk_ioapic_rmw (struct pci_dev *dev) -{ -if (dev->devfn ==0 && dev->bus->number ==0 ) - sis_apic_bug =1 ; -} -DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_SI ,PCI_ANY_ID , quirk_ioapic_rmw);#endif /* CONFIG_X86_IO_APIC */ /*
PATCH v5 22/33 x86/irq: Kill unused alloc_irq_and_cfg_at()
In reply to Jiang LiuThere's no caller of alloc_irq_and_cfg_at() anymore, so kill it.
--- arch/x86/include/asm/hw_irq.h | 1 - arch/x86/kernel/apic/vector.c | 21 --------------------- 2 files changed, 22 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -1
@@ -186,7 +186,6 @@ extern void copy_irq_alloc_info(struct irq_alloc_info *dst, struct irq_alloc_info *src);extern struct irq_cfg *irq_cfg (unsigned int irq);extern struct irq_cfg *irqd_cfg (struct irq_data *irq_data); -extern struct irq_cfg *alloc_irq_and_cfg_at (unsigned int at,int node);extern void lock_vector_lock (void );extern void unlock_vector_lock (void );extern int assign_irq_vector (int ,struct irq_cfg *,const struct cpumask *);
arch/x86/kernel/apic/vector.c +0 -21
@@ -76,27 +76,6 @@ out_cfg:return NULL ; } -struct irq_cfg *alloc_irq_and_cfg_at (unsigned int at,int node) -{ -int res =irq_alloc_desc_at (at, node); -struct irq_cfg *cfg; - -if (res <0 ) { -if (res != -EEXIST ) -return NULL ; - cfg =irq_cfg (at); -if (cfg) -return cfg; - } - - cfg =alloc_irq_cfg (node); -if (cfg) -irq_set_chip_data (at, cfg); -else -irq_free_desc (at); -return cfg; -} -static void free_irq_cfg (struct irq_cfg *cfg) {if (cfg) {
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Remove unused alloc_irq_and_cfg_at()
x86/irq: Remove unused alloc_irq_and_cfg_at()
Commit-ID: a2cbbb47fd90ef1161ce22b099de5c6095f8365f Gitweb: http://git.kernel.org/tip/a2cbbb47fd90ef1161ce22b099de5c6095f8365f Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:29:59 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:54 +0200
x86/irq: Remove unused alloc_irq_and_cfg_at()
There's no caller of alloc_irq_and_cfg_at() anymore, so remove it.
--- arch/x86/include/asm/hw_irq.h | 1 - arch/x86/kernel/apic/vector.c | 21 --------------------- 2 files changed, 22 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -1
@@ -186,7 +186,6 @@ extern void copy_irq_alloc_info(struct irq_alloc_info *dst, struct irq_alloc_info *src);extern struct irq_cfg *irq_cfg (unsigned int irq);extern struct irq_cfg *irqd_cfg (struct irq_data *irq_data); -extern struct irq_cfg *alloc_irq_and_cfg_at (unsigned int at,int node);extern void lock_vector_lock (void );extern void unlock_vector_lock (void );extern int assign_irq_vector (int ,struct irq_cfg *,const struct cpumask *);
arch/x86/kernel/apic/vector.c +0 -21
@@ -76,27 +76,6 @@ out_cfg:return NULL ; } -struct irq_cfg *alloc_irq_and_cfg_at (unsigned int at,int node) -{ -int res =irq_alloc_desc_at (at, node); -struct irq_cfg *cfg; - -if (res <0 ) { -if (res != -EEXIST ) -return NULL ; - cfg =irq_cfg (at); -if (cfg) -return cfg; - } - - cfg =alloc_irq_cfg (node); -if (cfg) -irq_set_chip_data (at, cfg); -else -irq_free_desc (at); -return cfg; -} -static void free_irq_cfg (struct irq_cfg *cfg) {if (cfg) {
PATCH v5 23/33 x86/irq: Change functions only used in vector.c as static
In reply to Jiang LiuFunction {assign|clear}_irq_vector() and apic_retrigger_irq() are only used in file vector.c, so change them as static.
--- arch/x86/include/asm/hw_irq.h | 3 --- arch/x86/kernel/apic/vector.c | 7 ++++--- 2 files changed, 4 insertions(+), 6 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -3
@@ -188,8 +188,6 @@ extern struct irq_cfg *irq_cfg(unsigned int irq);extern struct irq_cfg *irqd_cfg (struct irq_data *irq_data);extern void lock_vector_lock (void );extern void unlock_vector_lock (void ); -extern int assign_irq_vector (int ,struct irq_cfg *,const struct cpumask *); -extern void clear_irq_vector (int irq,struct irq_cfg *cfg);extern void setup_vector_irq (int cpu);#ifdef CONFIG_SMP extern void send_cleanup_vector (struct irq_cfg *);
@@ -199,7 +197,6 @@ static inline void send_cleanup_vector(struct irq_cfg *c) { }static inline void irq_complete_move (struct irq_cfg *c) { }#endif -extern int apic_retrigger_irq (struct irq_data *data);extern void apic_ack_edge (struct irq_data *data);extern int apic_set_affinity (struct irq_data *data,const struct cpumask *mask,unsigned int *dest_id);
arch/x86/kernel/apic/vector.c +4 -3
@@ -185,7 +185,8 @@ next:return err; } -int assign_irq_vector (int irq,struct irq_cfg *cfg,const struct cpumask *mask) +static int assign_irq_vector (int irq,struct irq_cfg *cfg, +const struct cpumask *mask) {int err;unsigned long flags;
@@ -196,7 +197,7 @@ int assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)return err; } -void clear_irq_vector (int irq,struct irq_cfg *cfg) +static void clear_irq_vector (int irq,struct irq_cfg *cfg) {int cpu, vector;unsigned long flags;
@@ -441,7 +442,7 @@ void setup_vector_irq(int cpu)__setup_vector_irq (cpu); } -int apic_retrigger_irq (struct irq_data *data) +static int apic_retrigger_irq (struct irq_data *data) {struct irq_cfg *cfg =irqd_cfg (data);unsigned long flags;
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Make functions only used in vector.c static
x86/irq: Make functions only used in vector.c static
Commit-ID: f970510cc55e41d21ca30feb56873aaeb57ec18d Gitweb: http://git.kernel.org/tip/f970510cc55e41d21ca30feb56873aaeb57ec18d Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:30:00 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:54 +0200
x86/irq: Make functions only used in vector.c static
Function {assign|clear}_irq_vector() and apic_retrigger_irq() are only used in vector.c, so make them static.
--- arch/x86/include/asm/hw_irq.h | 3 --- arch/x86/kernel/apic/vector.c | 7 ++++--- 2 files changed, 4 insertions(+), 6 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -3
@@ -188,8 +188,6 @@ extern struct irq_cfg *irq_cfg(unsigned int irq);extern struct irq_cfg *irqd_cfg (struct irq_data *irq_data);extern void lock_vector_lock (void );extern void unlock_vector_lock (void ); -extern int assign_irq_vector (int ,struct irq_cfg *,const struct cpumask *); -extern void clear_irq_vector (int irq,struct irq_cfg *cfg);extern void setup_vector_irq (int cpu);#ifdef CONFIG_SMP extern void send_cleanup_vector (struct irq_cfg *);
@@ -199,7 +197,6 @@ static inline void send_cleanup_vector(struct irq_cfg *c) { }static inline void irq_complete_move (struct irq_cfg *c) { }#endif -extern int apic_retrigger_irq (struct irq_data *data);extern void apic_ack_edge (struct irq_data *data);extern int apic_set_affinity (struct irq_data *data,const struct cpumask *mask,unsigned int *dest_id);
arch/x86/kernel/apic/vector.c +4 -3
@@ -185,7 +185,8 @@ next:return err; } -int assign_irq_vector (int irq,struct irq_cfg *cfg,const struct cpumask *mask) +static int assign_irq_vector (int irq,struct irq_cfg *cfg, +const struct cpumask *mask) {int err;unsigned long flags;
@@ -196,7 +197,7 @@ int assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask)return err; } -void clear_irq_vector (int irq,struct irq_cfg *cfg) +static void clear_irq_vector (int irq,struct irq_cfg *cfg) {int cpu, vector;unsigned long flags;
@@ -441,7 +442,7 @@ void setup_vector_irq(int cpu)__setup_vector_irq (cpu); } -int apic_retrigger_irq (struct irq_data *data) +static int apic_retrigger_irq (struct irq_data *data) {struct irq_cfg *cfg =irqd_cfg (data);unsigned long flags;
PATCH v5 24/33 x86/irq: Kill function apic_set_affinity()
In reply to Jiang LiuNow there's no user of apic_set_affinity(), so kill it.
Also rename vector_set_affinity() to apic_set_affinity() for consistency.
--- arch/x86/include/asm/hw_irq.h | 2 -- arch/x86/kernel/apic/vector.c | 40 +++------------------------------------- 2 files changed, 3 insertions(+), 39 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -2
@@ -198,8 +198,6 @@ static inline void irq_complete_move(struct irq_cfg *c) { }#endif extern void apic_ack_edge (struct irq_data *data); -extern int apic_set_affinity (struct irq_data *data,const struct cpumask *mask, -unsigned int *dest_id);#else /* CONFIG_X86_LOCAL_APIC */ static inline void lock_vector_lock (void ) {}static inline void unlock_vector_lock (void ) {}
arch/x86/kernel/apic/vector.c +3 -37
@@ -463,42 +463,8 @@ void apic_ack_edge(struct irq_data *data)ack_APIC_irq (); } -/* -* Either sets data->affinity to a valid value, and returns -* ->cpu_mask_to_apicid of that in dest_id, or returns -1 and -* leaves data->affinity untouched. -*/ -int apic_set_affinity (struct irq_data *data,const struct cpumask *mask, -unsigned int *dest_id) -{ -struct irq_cfg *cfg =irqd_cfg (data); -unsigned int irq = data->irq; -int err; - -if (!config_enabled (CONFIG_SMP )) -return -EPERM ; - -if (!cpumask_intersects (mask, cpu_online_mask)) -return -EINVAL ; - - err =assign_irq_vector (irq, cfg, mask); -if (err) -return err; - - err = apic->cpu_mask_to_apicid_and (mask, cfg->domain, dest_id); -if (err) { -if (assign_irq_vector (irq, cfg, data->affinity)) -pr_err ("Failed to recover vector for irq %d\n" , irq); -return err; - } - -cpumask_copy (data->affinity, mask); - -return 0 ; -} - -static int vector_set_affinity (struct irq_data *irq_data, -const struct cpumask *dest,bool force) +static int apic_set_affinity (struct irq_data *irq_data, +const struct cpumask *dest,bool force) {int err;int irq = irq_data->irq;
@@ -524,7 +490,7 @@ static int vector_set_affinity(struct irq_data *irq_data,static struct irq_chip lapic_controller = { .irq_ack = apic_ack_edge, - .irq_set_affinity = vector_set_affinity, + .irq_set_affinity = apic_set_affinity, .irq_retrigger = apic_retrigger_irq, };
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Remove function apic_set_affinity()
x86/irq: Remove function apic_set_affinity()
Commit-ID: 68f9f4404d74f859dc84973db8731b41a51d929a Gitweb: http://git.kernel.org/tip/68f9f4404d74f859dc84973db8731b41a51d929a Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:30:01 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:54 +0200
x86/irq: Remove function apic_set_affinity()
Now there's no user of apic_set_affinity(), so remove it. Also rename vector_set_affinity() to apic_set_affinity() for consistency.
--- arch/x86/include/asm/hw_irq.h | 2 -- arch/x86/kernel/apic/vector.c | 40 +++------------------------------------- 2 files changed, 3 insertions(+), 39 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -2
@@ -198,8 +198,6 @@ static inline void irq_complete_move(struct irq_cfg *c) { }#endif extern void apic_ack_edge (struct irq_data *data); -extern int apic_set_affinity (struct irq_data *data,const struct cpumask *mask, -unsigned int *dest_id);#else /* CONFIG_X86_LOCAL_APIC */ static inline void lock_vector_lock (void ) {}static inline void unlock_vector_lock (void ) {}
arch/x86/kernel/apic/vector.c +3 -37
@@ -463,42 +463,8 @@ void apic_ack_edge(struct irq_data *data)ack_APIC_irq (); } -/* -* Either sets data->affinity to a valid value, and returns -* ->cpu_mask_to_apicid of that in dest_id, or returns -1 and -* leaves data->affinity untouched. -*/ -int apic_set_affinity (struct irq_data *data,const struct cpumask *mask, -unsigned int *dest_id) -{ -struct irq_cfg *cfg =irqd_cfg (data); -unsigned int irq = data->irq; -int err; - -if (!config_enabled (CONFIG_SMP )) -return -EPERM ; - -if (!cpumask_intersects (mask, cpu_online_mask)) -return -EINVAL ; - - err =assign_irq_vector (irq, cfg, mask); -if (err) -return err; - - err = apic->cpu_mask_to_apicid_and (mask, cfg->domain, dest_id); -if (err) { -if (assign_irq_vector (irq, cfg, data->affinity)) -pr_err ("Failed to recover vector for irq %d\n" , irq); -return err; - } - -cpumask_copy (data->affinity, mask); - -return 0 ; -} - -static int vector_set_affinity (struct irq_data *irq_data, -const struct cpumask *dest,bool force) +static int apic_set_affinity (struct irq_data *irq_data, +const struct cpumask *dest,bool force) {struct irq_cfg *cfg = irq_data->chip_data;int err, irq = irq_data->irq;
@@ -523,7 +489,7 @@ static int vector_set_affinity(struct irq_data *irq_data,static struct irq_chip lapic_controller = { .irq_ack = apic_ack_edge, - .irq_set_affinity = vector_set_affinity, + .irq_set_affinity = apic_set_affinity, .irq_retrigger = apic_retrigger_irq, };
PATCH v5 25/33 x86/irq: Move check of cfg->move_in_progress into send_cleanup_vector()
In reply to Jiang LiuMove check of cfg->move_in_progress into send_cleanup_vector() to prepare for simplifying struct irq_cfg.
--- arch/x86/kernel/apic/vector.c | 10 ++++++++-- arch/x86/platform/uv/uv_irq.c | 3 +-- drivers/iommu/amd_iommu.c | 3 +-- drivers/iommu/intel_irq_remapping.c | 3 +-- 4 files changed, 11 insertions(+), 8 deletions(-)
arch/x86/kernel/apic/vector.c +8 -2
@@ -495,7 +495,7 @@ static struct irq_chip lapic_controller = { };#ifdef CONFIG_SMP -void send_cleanup_vector (struct irq_cfg *cfg) +static void __send_cleanup_vector (struct irq_cfg *cfg) {cpumask_var_t cleanup_mask;
@@ -513,6 +513,12 @@ void send_cleanup_vector(struct irq_cfg *cfg) cfg->move_in_progress =0 ; } +void send_cleanup_vector (struct irq_cfg *cfg) +{ +if (cfg->move_in_progress) +__send_cleanup_vector (cfg); +} + asmlinkage __visible void smp_irq_move_cleanup_interrupt(void) {unsigned vector, me;
@@ -583,7 +589,7 @@ static void __irq_complete_move(struct irq_cfg *cfg, unsigned vector) me =smp_processor_id ();if (vector == cfg->vector &&cpumask_test_cpu (me, cfg->domain)) -send_cleanup_vector (cfg); +__send_cleanup_vector (cfg); }void irq_complete_move (struct irq_cfg *cfg)
arch/x86/platform/uv/uv_irq.c +1 -2
@@ -63,8 +63,7 @@ uv_set_irq_affinity(struct irq_data *data, const struct cpumask *mask, ret = parent->chip->irq_set_affinity (parent, mask, force);if (ret >=0 ) {uv_program_mmr (cfg, data->chip_data); -if (cfg->move_in_progress) -send_cleanup_vector (cfg); +send_cleanup_vector (cfg); }return ret;
drivers/iommu/amd_iommu.c +1 -2
@@ -4333,8 +4333,7 @@ static int amd_ir_set_affinity(struct irq_data *data,* at the new destination. So, time to cleanup the previous * vector allocation. */ -if (cfg->move_in_progress) -send_cleanup_vector (cfg); +send_cleanup_vector (cfg);return IRQ_SET_MASK_OK_DONE ; }
drivers/iommu/intel_irq_remapping.c +1 -2
@@ -1003,8 +1003,7 @@ intel_ir_set_affinity(struct irq_data *data, const struct cpumask *mask,* at the new destination. So, time to cleanup the previous * vector allocation. */ -if (cfg->move_in_progress) -send_cleanup_vector (cfg); +send_cleanup_vector (cfg);return IRQ_SET_MASK_OK_DONE ; }
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Move check of cfg-> move_in_progress into send_cleanup_vector()
x86/irq: Move check of cfg->move_in_progress into send_cleanup_vector()
Commit-ID: c6c2002b744215810c770dd73f45da954bcfa9d5 Gitweb: http://git.kernel.org/tip/c6c2002b744215810c770dd73f45da954bcfa9d5 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:30:02 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:54 +0200
x86/irq: Move check of cfg->move_in_progress into send_cleanup_vector()
Move check of cfg->move_in_progress into send_cleanup_vector() to prepare for simplifying struct irq_cfg.
--- arch/x86/kernel/apic/vector.c | 10 ++++++++-- arch/x86/platform/uv/uv_irq.c | 3 +-- drivers/iommu/amd_iommu.c | 3 +-- drivers/iommu/intel_irq_remapping.c | 3 +-- 4 files changed, 11 insertions(+), 8 deletions(-)
arch/x86/kernel/apic/vector.c +8 -2
@@ -494,7 +494,7 @@ static struct irq_chip lapic_controller = { };#ifdef CONFIG_SMP -void send_cleanup_vector (struct irq_cfg *cfg) +static void __send_cleanup_vector (struct irq_cfg *cfg) {cpumask_var_t cleanup_mask;
@@ -512,6 +512,12 @@ void send_cleanup_vector(struct irq_cfg *cfg) cfg->move_in_progress =0 ; } +void send_cleanup_vector (struct irq_cfg *cfg) +{ +if (cfg->move_in_progress) +__send_cleanup_vector (cfg); +} + asmlinkage __visible void smp_irq_move_cleanup_interrupt(void) {unsigned vector, me;
@@ -582,7 +588,7 @@ static void __irq_complete_move(struct irq_cfg *cfg, unsigned vector) me =smp_processor_id ();if (vector == cfg->vector &&cpumask_test_cpu (me, cfg->domain)) -send_cleanup_vector (cfg); +__send_cleanup_vector (cfg); }void irq_complete_move (struct irq_cfg *cfg)
arch/x86/platform/uv/uv_irq.c +1 -2
@@ -63,8 +63,7 @@ uv_set_irq_affinity(struct irq_data *data, const struct cpumask *mask, ret = parent->chip->irq_set_affinity (parent, mask, force);if (ret >=0 ) {uv_program_mmr (cfg, data->chip_data); -if (cfg->move_in_progress) -send_cleanup_vector (cfg); +send_cleanup_vector (cfg); }return ret;
drivers/iommu/amd_iommu.c +1 -2
@@ -4327,8 +4327,7 @@ static int amd_ir_set_affinity(struct irq_data *data,* at the new destination. So, time to cleanup the previous * vector allocation. */ -if (cfg->move_in_progress) -send_cleanup_vector (cfg); +send_cleanup_vector (cfg);return IRQ_SET_MASK_OK_DONE ; }
drivers/iommu/intel_irq_remapping.c +1 -2
@@ -1003,8 +1003,7 @@ intel_ir_set_affinity(struct irq_data *data, const struct cpumask *mask,* at the new destination. So, time to cleanup the previous * vector allocation. */ -if (cfg->move_in_progress) -send_cleanup_vector (cfg); +send_cleanup_vector (cfg);return IRQ_SET_MASK_OK_DONE ; }
PATCH v5 26/33 x86/irq: Move private data in struct irq_cfg into dedicated data structure
In reply to Jiang LiuSeveral fields in struct irq_cfg are private to vector.c, so move it into dedicated data structure. This helps to hide implementation details.
--- arch/x86/include/asm/hw_irq.h | 3 - arch/x86/kernel/apic/vector.c | 221 ++++++++++++++++++++++------------------- 2 files changed, 119 insertions(+), 105 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -3
@@ -171,11 +171,8 @@ enum { };struct irq_cfg { -cpumask_var_t domain; -cpumask_var_t old_domain;unsigned int dest_apicid;u8 vector; -u8 move_in_progress :1 ; };extern struct irq_domain *x86_vector_domain;
arch/x86/kernel/apic/vector.c +119 -102
484 lines not on this page · raw message
Signature · 1 line
1.7.10.4
PATCH v5 27/33 x86/irq: Refine the way to calculate NR_IRQS
In reply to Jiang LiuNow we have made MSI independent of IOAPIC, so we need to refine the way to calculate NR_IRQS to support configuration with MSI enabled but IOAPIC disabled.
--- arch/x86/include/asm/irq_vectors.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
arch/x86/include/asm/irq_vectors.h +11 -7
@@ -155,18 +155,22 @@ static inline int invalid_vm86_irq(int irq)* static arrays. */ -#define NR_IRQS_LEGACY 16 +#define NR_IRQS_LEGACY 16 -#define IO_APIC_VECTOR_LIMIT ( 32 * MAX_IO_APICS ) +#define CPU_VECTOR_LIMIT (64 * NR_CPUS) +#define IO_APIC_VECTOR_LIMIT (32 * MAX_IO_APICS) -#ifdef CONFIG_X86_IO_APIC -# define CPU_VECTOR_LIMIT (64 * NR_CPUS) -# define NR_IRQS \ +#if defined(CONFIG_X86_IO_APIC ) && defined(CONFIG_PCI_MSI ) +#define NR_IRQS \ (CPU_VECTOR_LIMIT > IO_APIC_VECTOR_LIMIT ? \ (NR_VECTORS + CPU_VECTOR_LIMIT) : \ (NR_VECTORS + IO_APIC_VECTOR_LIMIT)) -#else /* !CONFIG_X86_IO_APIC: */ -# define NR_IRQS NR_IRQS_LEGACY +#elif defined(CONFIG_X86_IO_APIC ) +#define NR_IRQS (NR_VECTORS + IO_APIC_VECTOR_LIMIT) +#elif defined(CONFIG_PCI_MSI ) +#define NR_IRQS (NR_VECTORS + CPU_VECTOR_LIMIT) +#else +#define NR_IRQS NR_IRQS_LEGACY#endif #endif /* _ASM_X86_IRQ_VECTORS_H */
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Refine the way to calculate NR_IRQS
x86/irq: Refine the way to calculate NR_IRQS
Commit-ID: 4399b14fa75c8d8225a0739fbcef575f02c6c6a5 Gitweb: http://git.kernel.org/tip/4399b14fa75c8d8225a0739fbcef575f02c6c6a5 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:30:04 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:55 +0200
x86/irq: Refine the way to calculate NR_IRQS
Now we have made MSI independent of IOAPIC, so we need to refine the way to calculate NR_IRQS to support configuration with MSI enabled but IOAPIC disabled.
--- arch/x86/include/asm/irq_vectors.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
arch/x86/include/asm/irq_vectors.h +11 -7
@@ -155,18 +155,22 @@ static inline int invalid_vm86_irq(int irq)* static arrays. */ -#define NR_IRQS_LEGACY 16 +#define NR_IRQS_LEGACY 16 -#define IO_APIC_VECTOR_LIMIT ( 32 * MAX_IO_APICS ) +#define CPU_VECTOR_LIMIT (64 * NR_CPUS) +#define IO_APIC_VECTOR_LIMIT (32 * MAX_IO_APICS) -#ifdef CONFIG_X86_IO_APIC -# define CPU_VECTOR_LIMIT (64 * NR_CPUS) -# define NR_IRQS \ +#if defined(CONFIG_X86_IO_APIC ) && defined(CONFIG_PCI_MSI ) +#define NR_IRQS \ (CPU_VECTOR_LIMIT > IO_APIC_VECTOR_LIMIT ? \ (NR_VECTORS + CPU_VECTOR_LIMIT) : \ (NR_VECTORS + IO_APIC_VECTOR_LIMIT)) -#else /* !CONFIG_X86_IO_APIC: */ -# define NR_IRQS NR_IRQS_LEGACY +#elif defined(CONFIG_X86_IO_APIC ) +#define NR_IRQS (NR_VECTORS + IO_APIC_VECTOR_LIMIT) +#elif defined(CONFIG_PCI_MSI ) +#define NR_IRQS (NR_VECTORS + CPU_VECTOR_LIMIT) +#else +#define NR_IRQS NR_IRQS_LEGACY#endif #endif /* _ASM_X86_IRQ_VECTORS_H */
PATCH v5 28/33 x86/irq, ACPI: Kill private function mp_register_gsi()/ mp_unregister_gsi()
In reply to Jiang LiuFunction mp_register_gsi() is only called once, so fold it into caller acpi_register_gsi_ioapic(). Do the same for mp_unregister_gsi().
--- arch/x86/kernel/acpi/boot.c | 57 ++++++++++++++----------------------------- 1 file changed, 18 insertions(+), 39 deletions(-)
arch/x86/kernel/acpi/boot.c +18 -39
@@ -400,42 +400,6 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,return 0 ; } -static int mp_register_gsi (struct device *dev,u32 gsi,int trigger, -int polarity) -{ -int irq, node; -struct irq_alloc_info info; - -if (acpi_irq_model !=ACPI_IRQ_MODEL_IOAPIC ) -return gsi; - - trigger = trigger ==ACPI_EDGE_SENSITIVE ?0 :1 ; - polarity = polarity ==ACPI_ACTIVE_HIGH ?0 :1 ; - node = dev ?dev_to_node (dev) :NUMA_NO_NODE ; -ioapic_set_alloc_attr (&info, node, trigger, polarity); - irq =mp_map_gsi_to_irq (gsi,IOAPIC_MAP_ALLOC , &info); -if (irq <0 ) -return irq; - -/* Don't set up the ACPI SCI because it's already set up */ -if (enable_update_mptable && acpi_gbl_FADT.sci_interrupt != gsi) -mp_config_acpi_gsi (dev, gsi, trigger, polarity); - -return irq; -} - -static void mp_unregister_gsi (u32 gsi) -{ -int irq; - -if (acpi_irq_model !=ACPI_IRQ_MODEL_IOAPIC ) -return ; - - irq =mp_map_gsi_to_irq (gsi,0 ,NULL ); -if (irq >0 ) -mp_unmap_irq (irq); -} -static struct irq_domain_ops acpi_irqdomain_ops = { .alloc = mp_irqdomain_alloc, .free = mp_irqdomain_free,
@@ -662,10 +626,21 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi, int trigger, int polarity) { int irq = gsi; -#ifdef CONFIG_X86_IO_APIC +int node; +struct irq_alloc_info info; + + node = dev ?dev_to_node (dev) :NUMA_NO_NODE ; + trigger = trigger ==ACPI_EDGE_SENSITIVE ?0 :1 ; + polarity = polarity ==ACPI_ACTIVE_HIGH ?0 :1 ; +ioapic_set_alloc_attr (&info, node, trigger, polarity); +mutex_lock (&acpi_ioapic_lock); - irq =mp_register_gsi (dev, gsi, trigger, polarity); + irq =mp_map_gsi_to_irq (gsi,IOAPIC_MAP_ALLOC , &info); +/* Don't set up the ACPI SCI because it's already set up */ +if (irq >=0 && enable_update_mptable && + acpi_gbl_FADT.sci_interrupt != gsi) +mp_config_acpi_gsi (dev, gsi, trigger, polarity);mutex_unlock (&acpi_ioapic_lock);#endif
@@ -675,8 +650,12 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi,static void acpi_unregister_gsi_ioapic (u32 gsi) {#ifdef CONFIG_X86_IO_APIC +int irq; +mutex_lock (&acpi_ioapic_lock); -mp_unregister_gsi (gsi); + irq =mp_map_gsi_to_irq (gsi,0 ,NULL ); +if (irq >0 ) +mp_unmap_irq (irq);mutex_unlock (&acpi_ioapic_lock);#endif }
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq, ACPI: Remove private function mp_register_gsi()/ mp_unregister_gsi()
x86/irq, ACPI: Remove private function mp_register_gsi()/ mp_unregister_gsi()
Commit-ID: 46176f39b1a6f457eae78999befbdf58e68555e7 Gitweb: http://git.kernel.org/tip/46176f39b1a6f457eae78999befbdf58e68555e7 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:30:05 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:55 +0200
x86/irq, ACPI: Remove private function mp_register_gsi()/ mp_unregister_gsi()
Function mp_register_gsi() is only called once, so fold it into caller acpi_register_gsi_ioapic(). Do the same for mp_unregister_gsi().
--- arch/x86/kernel/acpi/boot.c | 57 ++++++++++++++------------------------------- 1 file changed, 18 insertions(+), 39 deletions(-)
arch/x86/kernel/acpi/boot.c +18 -39
@@ -400,42 +400,6 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,return 0 ; } -static int mp_register_gsi (struct device *dev,u32 gsi,int trigger, -int polarity) -{ -int irq, node; -struct irq_alloc_info info; - -if (acpi_irq_model !=ACPI_IRQ_MODEL_IOAPIC ) -return gsi; - - trigger = trigger ==ACPI_EDGE_SENSITIVE ?0 :1 ; - polarity = polarity ==ACPI_ACTIVE_HIGH ?0 :1 ; - node = dev ?dev_to_node (dev) :NUMA_NO_NODE ; -ioapic_set_alloc_attr (&info, node, trigger, polarity); - irq =mp_map_gsi_to_irq (gsi,IOAPIC_MAP_ALLOC , &info); -if (irq <0 ) -return irq; - -/* Don't set up the ACPI SCI because it's already set up */ -if (enable_update_mptable && acpi_gbl_FADT.sci_interrupt != gsi) -mp_config_acpi_gsi (dev, gsi, trigger, polarity); - -return irq; -} - -static void mp_unregister_gsi (u32 gsi) -{ -int irq; - -if (acpi_irq_model !=ACPI_IRQ_MODEL_IOAPIC ) -return ; - - irq =mp_map_gsi_to_irq (gsi,0 ,NULL ); -if (irq >0 ) -mp_unmap_irq (irq); -} -static struct irq_domain_ops acpi_irqdomain_ops = { .alloc = mp_irqdomain_alloc, .free = mp_irqdomain_free,
@@ -662,10 +626,21 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi, int trigger, int polarity) { int irq = gsi; -#ifdef CONFIG_X86_IO_APIC +int node; +struct irq_alloc_info info; + + node = dev ?dev_to_node (dev) :NUMA_NO_NODE ; + trigger = trigger ==ACPI_EDGE_SENSITIVE ?0 :1 ; + polarity = polarity ==ACPI_ACTIVE_HIGH ?0 :1 ; +ioapic_set_alloc_attr (&info, node, trigger, polarity); +mutex_lock (&acpi_ioapic_lock); - irq =mp_register_gsi (dev, gsi, trigger, polarity); + irq =mp_map_gsi_to_irq (gsi,IOAPIC_MAP_ALLOC , &info); +/* Don't set up the ACPI SCI because it's already set up */ +if (irq >=0 && enable_update_mptable && + acpi_gbl_FADT.sci_interrupt != gsi) +mp_config_acpi_gsi (dev, gsi, trigger, polarity);mutex_unlock (&acpi_ioapic_lock);#endif
@@ -675,8 +650,12 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi,static void acpi_unregister_gsi_ioapic (u32 gsi) {#ifdef CONFIG_X86_IO_APIC +int irq; +mutex_lock (&acpi_ioapic_lock); -mp_unregister_gsi (gsi); + irq =mp_map_gsi_to_irq (gsi,0 ,NULL ); +if (irq >0 ) +mp_unmap_irq (irq);mutex_unlock (&acpi_ioapic_lock);#endif }
PATCH v5 29/33 x86, ioapic: Use proper defines for the entry fields
In reply to Jiang LiuFrom: Thomas Gleixner <[email protected]>
While looking at the printout issue, I stumbled more than once over the various 0/1 assignments which are either commented in strange ways or force to lookup the meaning.
Use proper constants and fix the misleading comments. While at it remove pointless 0 assignments in native_disable_io_apic() which have no value for understanding the code.
--- arch/x86/include/asm/io_apic.h | 16 +++++-- arch/x86/kernel/apic/io_apic.c | 100 ++++++++++++++++++++-------------------- 2 files changed, 63 insertions(+), 53 deletions(-)
arch/x86/include/asm/io_apic.h +13 -3
@@ -98,9 +98,19 @@ struct IR_IO_APIC_route_entry {struct irq_alloc_info ;struct irq_data ; -#define IOAPIC_AUTO -1 -#define IOAPIC_EDGE 0 -#define IOAPIC_LEVEL 1 +#define IOAPIC_AUTO -1 +#define IOAPIC_EDGE 0 +#define IOAPIC_LEVEL 1 + +#define IOAPIC_MASKED 1 +#define IOAPIC_UNMASKED 0 + +#define IOAPIC_POL_HIGH 0 +#define IOAPIC_POL_LOW 1 + +#define IOAPIC_DEST_MODE_PHYSICAL 0 +#define IOAPIC_DEST_MODE_LOGICAL 1 +#define IOAPIC_MAP_ALLOC 0x1#define IOAPIC_MAP_CHECK 0x2
arch/x86/kernel/apic/io_apic.c +50 -50
249 lines not on this page · raw message
Signature · 1 line
1.7.10.4
tip-bot for Thomas Gleixner
merge bot[tip:x86/apic] x86, ioapic: Use proper defines for the entry fields
x86, ioapic: Use proper defines for the entry fields
Commit-ID: 335efdf57da39d3949c3ef9338de5737e85cbe52 Gitweb: http://git.kernel.org/tip/335efdf57da39d3949c3ef9338de5737e85cbe52 Author: Thomas Gleixner <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:30:06 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:55 +0200
x86, ioapic: Use proper defines for the entry fields
While looking at the printout issue, I stumbled more than once over the various 0/1 assignments which are either commented in strange ways or force to lookup the meaning.
Use proper constants and fix the misleading comments. While at it remove pointless 0 assignments in native_disable_io_apic() which have no value for understanding the code.
--- arch/x86/include/asm/io_apic.h | 16 +++++-- arch/x86/kernel/apic/io_apic.c | 100 ++++++++++++++++++++--------------------- 2 files changed, 63 insertions(+), 53 deletions(-)
arch/x86/include/asm/io_apic.h +13 -3
@@ -98,9 +98,19 @@ struct IR_IO_APIC_route_entry {struct irq_alloc_info ;struct irq_data ; -#define IOAPIC_AUTO -1 -#define IOAPIC_EDGE 0 -#define IOAPIC_LEVEL 1 +#define IOAPIC_AUTO -1 +#define IOAPIC_EDGE 0 +#define IOAPIC_LEVEL 1 + +#define IOAPIC_MASKED 1 +#define IOAPIC_UNMASKED 0 + +#define IOAPIC_POL_HIGH 0 +#define IOAPIC_POL_LOW 1 + +#define IOAPIC_DEST_MODE_PHYSICAL 0 +#define IOAPIC_DEST_MODE_LOGICAL 1 +#define IOAPIC_MAP_ALLOC 0x1#define IOAPIC_MAP_CHECK 0x2
arch/x86/kernel/apic/io_apic.c +50 -50
249 lines not on this page · raw message
PATCH v5 30/33 x86,ioapic: Cleanup irq_trigger/polarity()
In reply to Jiang LiuFrom: Thomas Gleixner <[email protected]>
These functions are full of pointless indentations, useless comments and even more useless printks.
Clean them up.
--- arch/x86/kernel/apic/io_apic.c | 138 +++++++++++++++------------------------- 1 file changed, 50 insertions(+), 88 deletions(-)
arch/x86/kernel/apic/io_apic.c +50 -88
@@ -796,45 +796,47 @@ static int EISA_ELCR(unsigned int irq)static int irq_polarity (int idx) {int bus = mp_irqs[idx].srcbus; -int polarity;/* * Determine IRQ line polarity (high active or low active): */ -switch (mp_irqs[idx].irqflag &3 ) - { -case 0 :/* conforms, ie. bus-type dependent polarity */ -if (test_bit (bus, mp_bus_not_pci)) - polarity =default_ISA_polarity (idx); -else - polarity =default_PCI_polarity (idx); -break ; -case 1 :/* high active */ - { - polarity =IOAPIC_POL_HIGH ; -break ; - } -case 2 :/* reserved */ - { -pr_warn ("broken BIOS!!\n" ); - polarity =IOAPIC_POL_LOW ; -break ; - } -case 3 :/* low active */ - { - polarity =IOAPIC_POL_LOW ; -break ; - } -default :/* invalid */ - { -pr_warn ("broken BIOS!!\n" ); - polarity =IOAPIC_POL_LOW ; -break ; - } +switch (mp_irqs[idx].irqflag &0x03 ) { +case 0 : +/* conforms to spec, ie. bus-type dependent polarity */ +if (test_bit (bus, mp_bus_not_pci)) +return default_ISA_polarity (idx); +else +return default_PCI_polarity (idx); +case 1 : +return IOAPIC_POL_HIGH ; +case 2 : +pr_warn ("IOAPIC: Invalid polarity: 2, defaulting to low\n" ); +case 3 : +default :/* Pointless default required due to do gcc stupidity */ +return IOAPIC_POL_LOW ; } -return polarity; } +#ifdef CONFIG_EISA +static int eisa_irq_trigger (int idx,int bus,int trigger) +{ +switch (mp_bus_id_to_type[bus]) { +case MP_BUS_PCI : +case MP_BUS_ISA : +return trigger; +case MP_BUS_EISA : +return default_EISA_trigger (idx); + } +pr_warn ("IOAPIC: Invalid srcbus: %d defaulting to level\n" , bus); +return IOAPIC_LEVEL ; +} +#else +static inline int eisa_irq_trigger (int idx,int bus,int trigger) +{ +return trigger; +} +#endif +static int irq_trigger (int idx) {int bus = mp_irqs[idx].srcbus;
@@ -843,63 +845,23 @@ static int irq_trigger(int idx)/* * Determine IRQ trigger mode (edge or level sensitive): */ -switch ((mp_irqs[idx].irqflag>>2 ) &3 ) - { -case 0 :/* conforms, ie. bus-type dependent */ -if (test_bit (bus, mp_bus_not_pci)) - trigger =default_ISA_trigger (idx); -else - trigger =default_PCI_trigger (idx); -#ifdef CONFIG_EISA -switch (mp_bus_id_to_type[bus]) { -case MP_BUS_ISA :/* ISA pin */ - { -/* set before the switch */ -break ; - } -case MP_BUS_EISA :/* EISA pin */ - { - trigger =default_EISA_trigger (idx); -break ; - } -case MP_BUS_PCI :/* PCI pin */ - { -/* set before the switch */ -break ; - } -default : - { -pr_warn ("broken BIOS!!\n" ); - trigger =IOAPIC_LEVEL ; -break ; - } - } -#endif -break ; -case 1 :/* edge */ - { - trigger =IOAPIC_EDGE ; -break ; - } -case 2 :/* reserved */ - { -pr_warn ("broken BIOS!!\n" ); - trigger =IOAPIC_LEVEL ; -break ; - } -case 3 :/* level */ - { - trigger =IOAPIC_LEVEL ; -break ; - } -default :/* invalid */ - { -pr_warn ("broken BIOS!!\n" ); - trigger =IOAPIC_EDGE ; -break ; - } +switch ((mp_irqs[idx].irqflag >>2 ) &0x03 ) { +case 0 : +/* conforms to spec, ie. bus-type dependent trigger mode */ +if (test_bit (bus, mp_bus_not_pci)) + trigger =default_ISA_trigger (idx); +else + trigger =default_PCI_trigger (idx); +/* Take EISA into account */ +return eisa_irq_trigger (idx, bus, trigger); +case 1 : +return IOAPIC_EDGE ; +case 2 : +pr_warn ("IOAPIC: Invalid trigger mode 2 defaulting to level\n" ); +case 3 : +default :/* Pointless default required due to do gcc stupidity */ +return IOAPIC_LEVEL ; } -return trigger; } void ioapic_set_alloc_attr(struct irq_alloc_info *info, int node,
Signature · 1 line
1.7.10.4
tip-bot for Thomas Gleixner
merge bot[tip:x86/apic] x86,ioapic: Cleanup irq_trigger/polarity()
x86,ioapic: Cleanup irq_trigger/polarity()
Commit-ID: ab76085ec0858d4c2707ea0d036db00ef4aee8fd Gitweb: http://git.kernel.org/tip/ab76085ec0858d4c2707ea0d036db00ef4aee8fd Author: Thomas Gleixner <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:30:07 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:55 +0200
x86,ioapic: Cleanup irq_trigger/polarity()
These functions are full of pointless indentations, useless comments and even more useless printks.
Clean them up.
--- arch/x86/kernel/apic/io_apic.c | 138 +++++++++++++++-------------------------- 1 file changed, 50 insertions(+), 88 deletions(-)
arch/x86/kernel/apic/io_apic.c +50 -88
@@ -796,45 +796,47 @@ static int EISA_ELCR(unsigned int irq)static int irq_polarity (int idx) {int bus = mp_irqs[idx].srcbus; -int polarity;/* * Determine IRQ line polarity (high active or low active): */ -switch (mp_irqs[idx].irqflag &3 ) - { -case 0 :/* conforms, ie. bus-type dependent polarity */ -if (test_bit (bus, mp_bus_not_pci)) - polarity =default_ISA_polarity (idx); -else - polarity =default_PCI_polarity (idx); -break ; -case 1 :/* high active */ - { - polarity =IOAPIC_POL_HIGH ; -break ; - } -case 2 :/* reserved */ - { -pr_warn ("broken BIOS!!\n" ); - polarity =IOAPIC_POL_LOW ; -break ; - } -case 3 :/* low active */ - { - polarity =IOAPIC_POL_LOW ; -break ; - } -default :/* invalid */ - { -pr_warn ("broken BIOS!!\n" ); - polarity =IOAPIC_POL_LOW ; -break ; - } +switch (mp_irqs[idx].irqflag &0x03 ) { +case 0 : +/* conforms to spec, ie. bus-type dependent polarity */ +if (test_bit (bus, mp_bus_not_pci)) +return default_ISA_polarity (idx); +else +return default_PCI_polarity (idx); +case 1 : +return IOAPIC_POL_HIGH ; +case 2 : +pr_warn ("IOAPIC: Invalid polarity: 2, defaulting to low\n" ); +case 3 : +default :/* Pointless default required due to do gcc stupidity */ +return IOAPIC_POL_LOW ; } -return polarity; } +#ifdef CONFIG_EISA +static int eisa_irq_trigger (int idx,int bus,int trigger) +{ +switch (mp_bus_id_to_type[bus]) { +case MP_BUS_PCI : +case MP_BUS_ISA : +return trigger; +case MP_BUS_EISA : +return default_EISA_trigger (idx); + } +pr_warn ("IOAPIC: Invalid srcbus: %d defaulting to level\n" , bus); +return IOAPIC_LEVEL ; +} +#else +static inline int eisa_irq_trigger (int idx,int bus,int trigger) +{ +return trigger; +} +#endif +static int irq_trigger (int idx) {int bus = mp_irqs[idx].srcbus;
@@ -843,63 +845,23 @@ static int irq_trigger(int idx)/* * Determine IRQ trigger mode (edge or level sensitive): */ -switch ((mp_irqs[idx].irqflag>>2 ) &3 ) - { -case 0 :/* conforms, ie. bus-type dependent */ -if (test_bit (bus, mp_bus_not_pci)) - trigger =default_ISA_trigger (idx); -else - trigger =default_PCI_trigger (idx); -#ifdef CONFIG_EISA -switch (mp_bus_id_to_type[bus]) { -case MP_BUS_ISA :/* ISA pin */ - { -/* set before the switch */ -break ; - } -case MP_BUS_EISA :/* EISA pin */ - { - trigger =default_EISA_trigger (idx); -break ; - } -case MP_BUS_PCI :/* PCI pin */ - { -/* set before the switch */ -break ; - } -default : - { -pr_warn ("broken BIOS!!\n" ); - trigger =IOAPIC_LEVEL ; -break ; - } - } -#endif -break ; -case 1 :/* edge */ - { - trigger =IOAPIC_EDGE ; -break ; - } -case 2 :/* reserved */ - { -pr_warn ("broken BIOS!!\n" ); - trigger =IOAPIC_LEVEL ; -break ; - } -case 3 :/* level */ - { - trigger =IOAPIC_LEVEL ; -break ; - } -default :/* invalid */ - { -pr_warn ("broken BIOS!!\n" ); - trigger =IOAPIC_EDGE ; -break ; - } +switch ((mp_irqs[idx].irqflag >>2 ) &0x03 ) { +case 0 : +/* conforms to spec, ie. bus-type dependent trigger mode */ +if (test_bit (bus, mp_bus_not_pci)) + trigger =default_ISA_trigger (idx); +else + trigger =default_PCI_trigger (idx); +/* Take EISA into account */ +return eisa_irq_trigger (idx, bus, trigger); +case 1 : +return IOAPIC_EDGE ; +case 2 : +pr_warn ("IOAPIC: Invalid trigger mode 2 defaulting to level\n" ); +case 3 : +default :/* Pointless default required due to do gcc stupidity */ +return IOAPIC_LEVEL ; } -return trigger; } void ioapic_set_alloc_attr(struct irq_alloc_info *info, int node,
PATCH v5 31/33 x86: Cleanup irq_domain ops
In reply to Jiang LiuFrom: Thomas Gleixner <[email protected]>
We have 3 identical copies of the ioapic domain ops for acpi, mpparse, and sfi. Have a global one in the io_apic code and be done with it.
To avoid include hell in io_apic.h, create a private irqdomain header and include the generic irqdomain header from there.
--- arch/x86/include/asm/io_apic.h | 29 ++--------------------------- arch/x86/include/asm/irqdomain.h | 34 ++++++++++++++++++++++++++++++++++ arch/x86/kernel/acpi/boot.c | 13 +++---------- arch/x86/kernel/apic/io_apic.c | 9 ++++++++- arch/x86/kernel/devicetree.c | 12 ++++++------ arch/x86/kernel/mpparse.c | 9 +-------- arch/x86/platform/sfi/sfi.c | 10 ++-------- 7 files changed, 56 insertions(+), 60 deletions(-) create mode 100644 arch/x86/include/asm/irqdomain.h
arch/x86/include/asm/io_apic.h +2 -27
@@ -96,7 +96,7 @@ struct IR_IO_APIC_route_entry { } __attribute__ ((packed));struct irq_alloc_info ; -struct irq_data ; +struct ioapic_domain_cfg ;#define IOAPIC_AUTO -1#define IOAPIC_EDGE 0
@@ -163,23 +163,6 @@ extern int restore_ioapic_entries(void);extern void setup_ioapic_ids_from_mpc (void );extern void setup_ioapic_ids_from_mpc_nocheck (void ); -enum ioapic_domain_type { -IOAPIC_DOMAIN_INVALID , -IOAPIC_DOMAIN_LEGACY , -IOAPIC_DOMAIN_STRICT , -IOAPIC_DOMAIN_DYNAMIC , -}; - -struct device_node ; -struct irq_domain ; -struct irq_domain_ops ; - -struct ioapic_domain_cfg { -enum ioapic_domain_type type; -const struct irq_domain_ops *ops; -struct device_node *dev; -}; -extern int mp_find_ioapic (u32 gsi);extern int mp_find_ioapic_pin (int ioapic,u32 gsi); extern int mp_map_gsi_to_irq(u32 gsi, unsigned int flags,
@@ -189,15 +172,7 @@ extern int mp_register_ioapic(int id, u32 address, u32 gsi_base, struct ioapic_domain_cfg *cfg);extern int mp_unregister_ioapic (u32 gsi_base);extern int mp_ioapic_registered (u32 gsi_base); -extern int mp_irqdomain_alloc (struct irq_domain *domain,unsigned int virq, -unsigned int nr_irqs,void *arg); -extern void mp_irqdomain_free (struct irq_domain *domain,unsigned int virq, -unsigned int nr_irqs); -extern void mp_irqdomain_activate (struct irq_domain *domain, -struct irq_data *irq_data); -extern void mp_irqdomain_deactivate (struct irq_domain *domain, -struct irq_data *irq_data); -extern int mp_irqdomain_ioapic_idx (struct irq_domain *domain); +extern void ioapic_set_alloc_attr (struct irq_alloc_info *info,int node,int trigger,int polarity);
arch/x86/include/asm/irqdomain.h new file +34 -0
@@ -0,0 +1,34 @@ +#ifndef _ASM_IRQDOMAIN_H +#define _ASM_IRQDOMAIN_H + +#include <linux/irqdomain.h> + +enum ioapic_domain_type { +IOAPIC_DOMAIN_INVALID , +IOAPIC_DOMAIN_LEGACY , +IOAPIC_DOMAIN_STRICT , +IOAPIC_DOMAIN_DYNAMIC , +}; + +struct device_node ; +struct irq_data ; + +struct ioapic_domain_cfg { +enum ioapic_domain_type type; +const struct irq_domain_ops *ops; +struct device_node *dev; +}; + +extern const struct irq_domain_ops mp_ioapic_irqdomain_ops; + +extern int mp_irqdomain_alloc (struct irq_domain *domain,unsigned int virq, +unsigned int nr_irqs,void *arg); +extern void mp_irqdomain_free (struct irq_domain *domain,unsigned int virq, +unsigned int nr_irqs); +extern void mp_irqdomain_activate (struct irq_domain *domain, +struct irq_data *irq_data); +extern void mp_irqdomain_deactivate (struct irq_domain *domain, +struct irq_data *irq_data); +extern int mp_irqdomain_ioapic_idx (struct irq_domain *domain); + +#endif
arch/x86/kernel/acpi/boot.c +3 -10
@@ -31,12 +31,12 @@#include <linux/module.h> #include <linux/dmi.h> #include <linux/irq.h> -#include <linux/irqdomain.h> #include <linux/slab.h> #include <linux/bootmem.h> #include <linux/ioport.h> #include <linux/pci.h> +#include <asm/irqdomain.h> #include <asm/pci_x86.h> #include <asm/pgtable.h> #include <asm/io_apic.h>
@@ -400,20 +400,13 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,return 0 ; } -static struct irq_domain_ops acpi_irqdomain_ops = { - .alloc = mp_irqdomain_alloc, - .free = mp_irqdomain_free, - .activate = mp_irqdomain_activate, - .deactivate = mp_irqdomain_deactivate, -}; -static int __init acpi_parse_ioapic (struct acpi_subtable_header * header,const unsigned long end) {struct acpi_madt_io_apic *ioapic =NULL ;struct ioapic_domain_cfg cfg = { .type =IOAPIC_DOMAIN_DYNAMIC , - .ops = &acpi_irqdomain_ops, + .ops = &mp_ioapic_irqdomain_ops, }; ioapic = (struct acpi_madt_io_apic *)header;
@@ -764,7 +757,7 @@ int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base)u64 addr;struct ioapic_domain_cfg cfg = { .type =IOAPIC_DOMAIN_DYNAMIC , - .ops = &acpi_irqdomain_ops, + .ops = &mp_ioapic_irqdomain_ops, }; ioapic_id =acpi_get_ioapic_id (handle, gsi_base, &addr);
arch/x86/kernel/apic/io_apic.c +8 -1
@@ -41,13 +41,13 @@#include <linux/acpi.h> #include <linux/module.h> #include <linux/syscore_ops.h> -#include <linux/irqdomain.h> #include <linux/freezer.h> #include <linux/kthread.h> #include <linux/jiffies.h> /* time_after() */ #include <linux/slab.h> #include <linux/bootmem.h> +#include <asm/irqdomain.h> #include <asm/idle.h> #include <asm/io.h> #include <asm/smp.h>
@@ -2995,3 +2995,10 @@ int mp_irqdomain_ioapic_idx(struct irq_domain *domain) {return (int )(long )domain->host_data; } + +const struct irq_domain_ops mp_ioapic_irqdomain_ops = { + .alloc = mp_irqdomain_alloc, + .free = mp_irqdomain_free, + .activate = mp_irqdomain_activate, + .deactivate = mp_irqdomain_deactivate, +};
arch/x86/kernel/devicetree.c +6 -6
@@ -4,7 +4,6 @@#include <linux/bootmem.h> #include <linux/export.h> #include <linux/io.h> -#include <linux/irqdomain.h> #include <linux/interrupt.h> #include <linux/list.h> #include <linux/of.h>
@@ -17,6 +16,7 @@#include <linux/of_pci.h> #include <linux/initrd.h> +#include <asm/irqdomain.h> #include <asm/hpet.h> #include <asm/apic.h> #include <asm/pci_x86.h>
@@ -216,11 +216,11 @@ static int dt_irqdomain_alloc(struct irq_domain *domain, unsigned int virq,return mp_irqdomain_alloc (domain, virq, nr_irqs, &tmp); } -const struct irq_domain_ops ioapic_irq_domain_ops = { - .alloc = dt_irqdomain_alloc, - .free = mp_irqdomain_free, - .activate = mp_irqdomain_activate, - .deactivate = mp_irqdomain_deactivate, +static const struct irq_domain_ops ioapic_irq_domain_ops = { + .alloc = dt_irqdomain_alloc, + .free = mp_irqdomain_free, + .activate = mp_irqdomain_activate, + .deactivate = mp_irqdomain_deactivate, };static void __init dtb_add_ioapic (struct device_node *dn)
arch/x86/kernel/mpparse.c +1 -8
@@ -19,8 +19,8 @@#include <linux/module.h> #include <linux/smp.h> #include <linux/pci.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/mtrr.h> #include <asm/mpspec.h> #include <asm/pgalloc.h>
@@ -113,13 +113,6 @@ static void __init MP_bus_info(struct mpc_bus *m)pr_warn ("Unknown bustype %s - ignoring\n" , str); } -static struct irq_domain_ops mp_ioapic_irqdomain_ops = { - .alloc = mp_irqdomain_alloc, - .free = mp_irqdomain_free, - .activate = mp_irqdomain_activate, - .deactivate = mp_irqdomain_deactivate, -}; -static void __init MP_ioapic_info (struct mpc_ioapic *m) {struct ioapic_domain_cfg cfg = {
arch/x86/platform/sfi/sfi.c +2 -8
@@ -25,8 +25,8 @@#include <linux/init.h> #include <linux/sfi.h> #include <linux/io.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/io_apic.h> #include <asm/mpspec.h> #include <asm/setup.h>
@@ -71,12 +71,6 @@ static int __init sfi_parse_cpus(struct sfi_table_header *table)#endif /* CONFIG_X86_LOCAL_APIC */ #ifdef CONFIG_X86_IO_APIC -static struct irq_domain_ops sfi_ioapic_irqdomain_ops = { - .alloc = mp_irqdomain_alloc, - .free = mp_irqdomain_free, - .activate = mp_irqdomain_activate, - .deactivate = mp_irqdomain_deactivate, -};static int __init sfi_parse_ioapic (struct sfi_table_header *table) {
@@ -85,7 +79,7 @@ static int __init sfi_parse_ioapic(struct sfi_table_header *table)int i, num;struct ioapic_domain_cfg cfg = { .type =IOAPIC_DOMAIN_STRICT , - .ops = &sfi_ioapic_irqdomain_ops, + .ops = &mp_ioapic_irqdomain_ops, }; sb = (struct sfi_table_simple *)table;
Signature · 1 line
1.7.10.4
tip-bot for Thomas Gleixner
merge bot[tip:x86/apic] x86: Cleanup irq_domain ops
x86: Cleanup irq_domain ops
Commit-ID: f7a0c78669ee79443a91ea89652766c1be8d9e04 Gitweb: http://git.kernel.org/tip/f7a0c78669ee79443a91ea89652766c1be8d9e04 Author: Thomas Gleixner <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:30:08 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:55 +0200
x86: Cleanup irq_domain ops
We have 3 identical copies of the ioapic domain ops for acpi, mpparse, and sfi. Have a global one in the io_apic code and be done with it.
To avoid include hell in io_apic.h, create a private irqdomain header and include the generic irqdomain header from there.
--- arch/x86/include/asm/io_apic.h | 29 ++--------------------------- arch/x86/include/asm/irqdomain.h | 34 ++++++++++++++++++++++++++++++++++ arch/x86/kernel/acpi/boot.c | 13 +++---------- arch/x86/kernel/apic/io_apic.c | 9 ++++++++- arch/x86/kernel/devicetree.c | 12 ++++++------ arch/x86/kernel/mpparse.c | 9 +-------- arch/x86/platform/sfi/sfi.c | 10 ++-------- 7 files changed, 56 insertions(+), 60 deletions(-)
arch/x86/include/asm/io_apic.h +2 -27
@@ -96,7 +96,7 @@ struct IR_IO_APIC_route_entry { } __attribute__ ((packed));struct irq_alloc_info ; -struct irq_data ; +struct ioapic_domain_cfg ;#define IOAPIC_AUTO -1#define IOAPIC_EDGE 0
@@ -163,23 +163,6 @@ extern int restore_ioapic_entries(void);extern void setup_ioapic_ids_from_mpc (void );extern void setup_ioapic_ids_from_mpc_nocheck (void ); -enum ioapic_domain_type { -IOAPIC_DOMAIN_INVALID , -IOAPIC_DOMAIN_LEGACY , -IOAPIC_DOMAIN_STRICT , -IOAPIC_DOMAIN_DYNAMIC , -}; - -struct device_node ; -struct irq_domain ; -struct irq_domain_ops ; - -struct ioapic_domain_cfg { -enum ioapic_domain_type type; -const struct irq_domain_ops *ops; -struct device_node *dev; -}; -extern int mp_find_ioapic (u32 gsi);extern int mp_find_ioapic_pin (int ioapic,u32 gsi); extern int mp_map_gsi_to_irq(u32 gsi, unsigned int flags,
@@ -189,15 +172,7 @@ extern int mp_register_ioapic(int id, u32 address, u32 gsi_base, struct ioapic_domain_cfg *cfg);extern int mp_unregister_ioapic (u32 gsi_base);extern int mp_ioapic_registered (u32 gsi_base); -extern int mp_irqdomain_alloc (struct irq_domain *domain,unsigned int virq, -unsigned int nr_irqs,void *arg); -extern void mp_irqdomain_free (struct irq_domain *domain,unsigned int virq, -unsigned int nr_irqs); -extern void mp_irqdomain_activate (struct irq_domain *domain, -struct irq_data *irq_data); -extern void mp_irqdomain_deactivate (struct irq_domain *domain, -struct irq_data *irq_data); -extern int mp_irqdomain_ioapic_idx (struct irq_domain *domain); +extern void ioapic_set_alloc_attr (struct irq_alloc_info *info,int node,int trigger,int polarity);
arch/x86/include/asm/irqdomain.h new file +34 -0
@@ -0,0 +1,34 @@ +#ifndef _ASM_IRQDOMAIN_H +#define _ASM_IRQDOMAIN_H + +#include <linux/irqdomain.h> + +enum ioapic_domain_type { +IOAPIC_DOMAIN_INVALID , +IOAPIC_DOMAIN_LEGACY , +IOAPIC_DOMAIN_STRICT , +IOAPIC_DOMAIN_DYNAMIC , +}; + +struct device_node ; +struct irq_data ; + +struct ioapic_domain_cfg { +enum ioapic_domain_type type; +const struct irq_domain_ops *ops; +struct device_node *dev; +}; + +extern const struct irq_domain_ops mp_ioapic_irqdomain_ops; + +extern int mp_irqdomain_alloc (struct irq_domain *domain,unsigned int virq, +unsigned int nr_irqs,void *arg); +extern void mp_irqdomain_free (struct irq_domain *domain,unsigned int virq, +unsigned int nr_irqs); +extern void mp_irqdomain_activate (struct irq_domain *domain, +struct irq_data *irq_data); +extern void mp_irqdomain_deactivate (struct irq_domain *domain, +struct irq_data *irq_data); +extern int mp_irqdomain_ioapic_idx (struct irq_domain *domain); + +#endif
arch/x86/kernel/acpi/boot.c +3 -10
@@ -31,12 +31,12 @@#include <linux/module.h> #include <linux/dmi.h> #include <linux/irq.h> -#include <linux/irqdomain.h> #include <linux/slab.h> #include <linux/bootmem.h> #include <linux/ioport.h> #include <linux/pci.h> +#include <asm/irqdomain.h> #include <asm/pci_x86.h> #include <asm/pgtable.h> #include <asm/io_apic.h>
@@ -400,20 +400,13 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger,return 0 ; } -static struct irq_domain_ops acpi_irqdomain_ops = { - .alloc = mp_irqdomain_alloc, - .free = mp_irqdomain_free, - .activate = mp_irqdomain_activate, - .deactivate = mp_irqdomain_deactivate, -}; -static int __init acpi_parse_ioapic (struct acpi_subtable_header * header,const unsigned long end) {struct acpi_madt_io_apic *ioapic =NULL ;struct ioapic_domain_cfg cfg = { .type =IOAPIC_DOMAIN_DYNAMIC , - .ops = &acpi_irqdomain_ops, + .ops = &mp_ioapic_irqdomain_ops, }; ioapic = (struct acpi_madt_io_apic *)header;
@@ -764,7 +757,7 @@ int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base)u64 addr;struct ioapic_domain_cfg cfg = { .type =IOAPIC_DOMAIN_DYNAMIC , - .ops = &acpi_irqdomain_ops, + .ops = &mp_ioapic_irqdomain_ops, }; ioapic_id =acpi_get_ioapic_id (handle, gsi_base, &addr);
arch/x86/kernel/apic/io_apic.c +8 -1
@@ -41,13 +41,13 @@#include <linux/acpi.h> #include <linux/module.h> #include <linux/syscore_ops.h> -#include <linux/irqdomain.h> #include <linux/freezer.h> #include <linux/kthread.h> #include <linux/jiffies.h> /* time_after() */ #include <linux/slab.h> #include <linux/bootmem.h> +#include <asm/irqdomain.h> #include <asm/idle.h> #include <asm/io.h> #include <asm/smp.h>
@@ -2995,3 +2995,10 @@ int mp_irqdomain_ioapic_idx(struct irq_domain *domain) {return (int )(long )domain->host_data; } + +const struct irq_domain_ops mp_ioapic_irqdomain_ops = { + .alloc = mp_irqdomain_alloc, + .free = mp_irqdomain_free, + .activate = mp_irqdomain_activate, + .deactivate = mp_irqdomain_deactivate, +};
arch/x86/kernel/devicetree.c +6 -6
@@ -4,7 +4,6 @@#include <linux/bootmem.h> #include <linux/export.h> #include <linux/io.h> -#include <linux/irqdomain.h> #include <linux/interrupt.h> #include <linux/list.h> #include <linux/of.h>
@@ -17,6 +16,7 @@#include <linux/of_pci.h> #include <linux/initrd.h> +#include <asm/irqdomain.h> #include <asm/hpet.h> #include <asm/apic.h> #include <asm/pci_x86.h>
@@ -216,11 +216,11 @@ static int dt_irqdomain_alloc(struct irq_domain *domain, unsigned int virq,return mp_irqdomain_alloc (domain, virq, nr_irqs, &tmp); } -const struct irq_domain_ops ioapic_irq_domain_ops = { - .alloc = dt_irqdomain_alloc, - .free = mp_irqdomain_free, - .activate = mp_irqdomain_activate, - .deactivate = mp_irqdomain_deactivate, +static const struct irq_domain_ops ioapic_irq_domain_ops = { + .alloc = dt_irqdomain_alloc, + .free = mp_irqdomain_free, + .activate = mp_irqdomain_activate, + .deactivate = mp_irqdomain_deactivate, };static void __init dtb_add_ioapic (struct device_node *dn)
arch/x86/kernel/mpparse.c +1 -8
@@ -19,8 +19,8 @@#include <linux/module.h> #include <linux/smp.h> #include <linux/pci.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/mtrr.h> #include <asm/mpspec.h> #include <asm/pgalloc.h>
@@ -113,13 +113,6 @@ static void __init MP_bus_info(struct mpc_bus *m)pr_warn ("Unknown bustype %s - ignoring\n" , str); } -static struct irq_domain_ops mp_ioapic_irqdomain_ops = { - .alloc = mp_irqdomain_alloc, - .free = mp_irqdomain_free, - .activate = mp_irqdomain_activate, - .deactivate = mp_irqdomain_deactivate, -}; -static void __init MP_ioapic_info (struct mpc_ioapic *m) {struct ioapic_domain_cfg cfg = {
arch/x86/platform/sfi/sfi.c +2 -8
@@ -25,8 +25,8 @@#include <linux/init.h> #include <linux/sfi.h> #include <linux/io.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/io_apic.h> #include <asm/mpspec.h> #include <asm/setup.h>
@@ -71,12 +71,6 @@ static int __init sfi_parse_cpus(struct sfi_table_header *table)#endif /* CONFIG_X86_LOCAL_APIC */ #ifdef CONFIG_X86_IO_APIC -static struct irq_domain_ops sfi_ioapic_irqdomain_ops = { - .alloc = mp_irqdomain_alloc, - .free = mp_irqdomain_free, - .activate = mp_irqdomain_activate, - .deactivate = mp_irqdomain_deactivate, -};static int __init sfi_parse_ioapic (struct sfi_table_header *table) {
@@ -85,7 +79,7 @@ static int __init sfi_parse_ioapic(struct sfi_table_header *table)int i, num;struct ioapic_domain_cfg cfg = { .type =IOAPIC_DOMAIN_STRICT , - .ops = &sfi_ioapic_irqdomain_ops, + .ops = &mp_ioapic_irqdomain_ops, }; sb = (struct sfi_table_simple *)table;
PATCH v5 32/33 x86/irq: Move irqdomain specific code into asm/irqdomain.h
In reply to Jiang LiuNow we have dedicated asm/irqdomain.h, so move irqdomain specific code into it.
--- arch/x86/include/asm/hw_irq.h | 24 ----------------------- arch/x86/include/asm/irq_remapping.h | 2 +- arch/x86/include/asm/irqdomain.h | 35 +++++++++++++++++++++++++++++++--- arch/x86/kernel/apic/htirq.c | 2 +- arch/x86/kernel/apic/msi.c | 2 +- arch/x86/kernel/apic/vector.c | 2 +- arch/x86/kernel/hpet.c | 2 +- arch/x86/platform/uv/uv_irq.c | 2 +- 8 files changed, 38 insertions(+), 33 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -24
@@ -94,8 +94,6 @@ extern void trace_call_function_single_interrupt(void);#define trace_kvm_posted_intr_ipi kvm_posted_intr_ipi#endif /* CONFIG_TRACING */ -struct irq_domain ; -#ifdef CONFIG_X86_LOCAL_APIC struct irq_data ;struct pci_dev ;
@@ -165,22 +163,11 @@ struct irq_alloc_info { }; }; -enum { -/* Allocate contigious CPU vectors */ -X86_IRQ_ALLOC_CONTIGOUS_VECTORS =0x1 , -}; -struct irq_cfg {unsigned int dest_apicid;u8 vector; }; -extern struct irq_domain *x86_vector_domain; - -extern void init_irq_alloc_info (struct irq_alloc_info *info, -const struct cpumask *mask); -extern void copy_irq_alloc_info (struct irq_alloc_info *dst, -struct irq_alloc_info *src);extern struct irq_cfg *irq_cfg (unsigned int irq);extern struct irq_cfg *irqd_cfg (struct irq_data *irq_data);extern void lock_vector_lock (void );
@@ -200,17 +187,6 @@ static inline void lock_vector_lock(void) {}static inline void unlock_vector_lock (void ) {}#endif /* CONFIG_X86_LOCAL_APIC */ -#ifdef CONFIG_PCI_MSI -extern void arch_init_msi_domain (struct irq_domain *domain); -#else -static inline void arch_init_msi_domain (struct irq_domain *domain) { } -#endif -#ifdef CONFIG_HT_IRQ -extern void arch_init_htirq_domain (struct irq_domain *domain); -#else -static inline void arch_init_htirq_domain (struct irq_domain *domain) { } -#endif -/* Statistics */ extern atomic_t irq_err_count;extern atomic_t irq_mis_count;
arch/x86/include/asm/irq_remapping.h +1 -1
@@ -22,7 +22,7 @@#ifndef __X86_IRQ_REMAPPING_H#define __X86_IRQ_REMAPPING_H -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/hw_irq.h> #include <asm/io_apic.h>
arch/x86/include/asm/irqdomain.h +32 -3
@@ -2,6 +2,25 @@#define _ASM_IRQDOMAIN_H#include <linux/irqdomain.h> +#include <asm/hw_irq.h> + +#ifdef CONFIG_X86_LOCAL_APIC +enum { +/* Allocate contigious CPU vectors */ +X86_IRQ_ALLOC_CONTIGOUS_VECTORS =0x1 , +}; + +extern struct irq_domain *x86_vector_domain; + +extern void init_irq_alloc_info (struct irq_alloc_info *info, +const struct cpumask *mask); +extern void copy_irq_alloc_info (struct irq_alloc_info *dst, +struct irq_alloc_info *src); +#endif /* CONFIG_X86_LOCAL_APIC */ + +#ifdef CONFIG_X86_IO_APIC +struct device_node ; +struct irq_data ;enum ioapic_domain_type { IOAPIC_DOMAIN_INVALID,
@@ -10,9 +29,6 @@ enum ioapic_domain_type { IOAPIC_DOMAIN_DYNAMIC, }; -struct device_node ; -struct irq_data ; -struct ioapic_domain_cfg {enum ioapic_domain_type type;const struct irq_domain_ops *ops;
@@ -30,5 +46,18 @@ extern void mp_irqdomain_activate(struct irq_domain *domain,extern void mp_irqdomain_deactivate (struct irq_domain *domain,struct irq_data *irq_data);extern int mp_irqdomain_ioapic_idx (struct irq_domain *domain); +#endif /* CONFIG_X86_IO_APIC */ + +#ifdef CONFIG_PCI_MSI +extern void arch_init_msi_domain (struct irq_domain *domain); +#else +static inline void arch_init_msi_domain (struct irq_domain *domain) { } +#endif + +#ifdef CONFIG_HT_IRQ +extern void arch_init_htirq_domain (struct irq_domain *domain); +#else +static inline void arch_init_htirq_domain (struct irq_domain *domain) { } +#endif #endif
arch/x86/kernel/apic/htirq.c +1 -1
@@ -16,7 +16,7 @@#include <linux/device.h> #include <linux/pci.h> #include <linux/htirq.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/hw_irq.h> #include <asm/apic.h> #include <asm/hypertransport.h>
arch/x86/kernel/apic/msi.c +1 -1
@@ -16,7 +16,7 @@#include <linux/dmar.h> #include <linux/hpet.h> #include <linux/msi.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/msidef.h> #include <asm/hpet.h> #include <asm/hw_irq.h>
arch/x86/kernel/apic/vector.c +1 -1
@@ -13,8 +13,8 @@#include <linux/interrupt.h> #include <linux/init.h> #include <linux/compiler.h> -#include <linux/irqdomain.h> #include <linux/slab.h> +#include <asm/irqdomain.h> #include <asm/hw_irq.h> #include <asm/apic.h> #include <asm/i8259.h>
arch/x86/kernel/hpet.c +1 -1
@@ -11,8 +11,8 @@#include <linux/cpu.h> #include <linux/pm.h> #include <linux/io.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/fixmap.h> #include <asm/hpet.h> #include <asm/time.h>
arch/x86/platform/uv/uv_irq.c +1 -1
@@ -12,8 +12,8 @@#include <linux/rbtree.h> #include <linux/slab.h> #include <linux/irq.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/apic.h> #include <asm/uv/uv_irq.h> #include <asm/uv/uv_hub.h>
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Move irqdomain specific code into asm/ irqdomain.h
x86/irq: Move irqdomain specific code into asm/irqdomain.h
Commit-ID: d746d1ebd30c48562a3fb512ab18d5822f137820 Gitweb: http://git.kernel.org/tip/d746d1ebd30c48562a3fb512ab18d5822f137820 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:30:09 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:55 +0200
x86/irq: Move irqdomain specific code into asm/irqdomain.h
Now we have dedicated asm/irqdomain.h, so move irqdomain specific code into it.
--- arch/x86/include/asm/hw_irq.h | 24 ------------------------ arch/x86/include/asm/irq_remapping.h | 2 +- arch/x86/include/asm/irqdomain.h | 35 ++++++++++++++++++++++++++++++++--- arch/x86/kernel/apic/htirq.c | 2 +- arch/x86/kernel/apic/msi.c | 2 +- arch/x86/kernel/apic/vector.c | 2 +- arch/x86/kernel/hpet.c | 2 +- arch/x86/platform/uv/uv_irq.c | 2 +- 8 files changed, 38 insertions(+), 33 deletions(-)
arch/x86/include/asm/hw_irq.h +0 -24
@@ -94,8 +94,6 @@ extern void trace_call_function_single_interrupt(void);#define trace_kvm_posted_intr_ipi kvm_posted_intr_ipi#endif /* CONFIG_TRACING */ -struct irq_domain ; -#ifdef CONFIG_X86_LOCAL_APIC struct irq_data ;struct pci_dev ;
@@ -165,22 +163,11 @@ struct irq_alloc_info { }; }; -enum { -/* Allocate contiguous CPU vectors */ -X86_IRQ_ALLOC_CONTIGUOUS_VECTORS =0x1 , -}; -struct irq_cfg {unsigned int dest_apicid;u8 vector; }; -extern struct irq_domain *x86_vector_domain; - -extern void init_irq_alloc_info (struct irq_alloc_info *info, -const struct cpumask *mask); -extern void copy_irq_alloc_info (struct irq_alloc_info *dst, -struct irq_alloc_info *src);extern struct irq_cfg *irq_cfg (unsigned int irq);extern struct irq_cfg *irqd_cfg (struct irq_data *irq_data);extern void lock_vector_lock (void );
@@ -200,17 +187,6 @@ static inline void lock_vector_lock(void) {}static inline void unlock_vector_lock (void ) {}#endif /* CONFIG_X86_LOCAL_APIC */ -#ifdef CONFIG_PCI_MSI -extern void arch_init_msi_domain (struct irq_domain *domain); -#else -static inline void arch_init_msi_domain (struct irq_domain *domain) { } -#endif -#ifdef CONFIG_HT_IRQ -extern void arch_init_htirq_domain (struct irq_domain *domain); -#else -static inline void arch_init_htirq_domain (struct irq_domain *domain) { } -#endif -/* Statistics */ extern atomic_t irq_err_count;extern atomic_t irq_mis_count;
arch/x86/include/asm/irq_remapping.h +1 -1
@@ -22,7 +22,7 @@#ifndef __X86_IRQ_REMAPPING_H#define __X86_IRQ_REMAPPING_H -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/hw_irq.h> #include <asm/io_apic.h>
arch/x86/include/asm/irqdomain.h +32 -3
@@ -2,6 +2,25 @@#define _ASM_IRQDOMAIN_H#include <linux/irqdomain.h> +#include <asm/hw_irq.h> + +#ifdef CONFIG_X86_LOCAL_APIC +enum { +/* Allocate contiguous CPU vectors */ +X86_IRQ_ALLOC_CONTIGUOUS_VECTORS =0x1 , +}; + +extern struct irq_domain *x86_vector_domain; + +extern void init_irq_alloc_info (struct irq_alloc_info *info, +const struct cpumask *mask); +extern void copy_irq_alloc_info (struct irq_alloc_info *dst, +struct irq_alloc_info *src); +#endif /* CONFIG_X86_LOCAL_APIC */ + +#ifdef CONFIG_X86_IO_APIC +struct device_node ; +struct irq_data ;enum ioapic_domain_type { IOAPIC_DOMAIN_INVALID,
@@ -10,9 +29,6 @@ enum ioapic_domain_type { IOAPIC_DOMAIN_DYNAMIC, }; -struct device_node ; -struct irq_data ; -struct ioapic_domain_cfg {enum ioapic_domain_type type;const struct irq_domain_ops *ops;
@@ -30,5 +46,18 @@ extern void mp_irqdomain_activate(struct irq_domain *domain,extern void mp_irqdomain_deactivate (struct irq_domain *domain,struct irq_data *irq_data);extern int mp_irqdomain_ioapic_idx (struct irq_domain *domain); +#endif /* CONFIG_X86_IO_APIC */ + +#ifdef CONFIG_PCI_MSI +extern void arch_init_msi_domain (struct irq_domain *domain); +#else +static inline void arch_init_msi_domain (struct irq_domain *domain) { } +#endif + +#ifdef CONFIG_HT_IRQ +extern void arch_init_htirq_domain (struct irq_domain *domain); +#else +static inline void arch_init_htirq_domain (struct irq_domain *domain) { } +#endif #endif
arch/x86/kernel/apic/htirq.c +1 -1
@@ -16,7 +16,7 @@#include <linux/device.h> #include <linux/pci.h> #include <linux/htirq.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/hw_irq.h> #include <asm/apic.h> #include <asm/hypertransport.h>
arch/x86/kernel/apic/msi.c +1 -1
@@ -16,7 +16,7 @@#include <linux/dmar.h> #include <linux/hpet.h> #include <linux/msi.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/msidef.h> #include <asm/hpet.h> #include <asm/hw_irq.h>
arch/x86/kernel/apic/vector.c +1 -1
@@ -13,8 +13,8 @@#include <linux/interrupt.h> #include <linux/init.h> #include <linux/compiler.h> -#include <linux/irqdomain.h> #include <linux/slab.h> +#include <asm/irqdomain.h> #include <asm/hw_irq.h> #include <asm/apic.h> #include <asm/i8259.h>
arch/x86/kernel/hpet.c +1 -1
@@ -11,8 +11,8 @@#include <linux/cpu.h> #include <linux/pm.h> #include <linux/io.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/fixmap.h> #include <asm/hpet.h> #include <asm/time.h>
arch/x86/platform/uv/uv_irq.c +1 -1
@@ -12,8 +12,8 @@#include <linux/rbtree.h> #include <linux/slab.h> #include <linux/irq.h> -#include <linux/irqdomain.h> +#include <asm/irqdomain.h> #include <asm/apic.h> #include <asm/uv/uv_irq.h> #include <asm/uv/uv_hub.h>
PATCH v5 33/33 x86/irq: Avoid memory allocation in __assign_irq_vector()
In reply to Jiang LiuFunction __assign_irq_vector() is protected by vector_lock, so use a global temporary cpu_mask to avoid allocating/freeing cpu_mask.
--- arch/x86/kernel/apic/vector.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-)
arch/x86/kernel/apic/vector.c +17 -16
@@ -30,6 +30,7 @@ struct apic_chip_data {struct irq_domain *x86_vector_domain;static DEFINE_RAW_SPINLOCK (vector_lock); +static cpumask_var_t vector_cpumask;static struct irq_chip lapic_controller;#ifdef CONFIG_X86_IO_APIC static struct apic_chip_data *legacy_irq_data[NR_IRQS_LEGACY ];
@@ -116,14 +117,10 @@ static int __assign_irq_vector(int irq, struct apic_chip_data *d,static int current_vector =FIRST_EXTERNAL_VECTOR +VECTOR_OFFSET_START ;static int current_offset =VECTOR_OFFSET_START %16 ;int cpu, err; -cpumask_var_t tmp_mask;if (d->move_in_progress)return -EBUSY ; -if (!alloc_cpumask_var (&tmp_mask,GFP_ATOMIC )) -return -ENOMEM ; -/* Only try and allocate irqs on cpus that are present */ err = -ENOSPC ;cpumask_clear (d->old_domain);
@@ -131,21 +128,22 @@ static int __assign_irq_vector(int irq, struct apic_chip_data *d,while (cpu < nr_cpu_ids) {int new_cpu, vector, offset; - apic->vector_allocation_domain (cpu, tmp_mask, mask); + apic->vector_allocation_domain (cpu, vector_cpumask, mask); -if (cpumask_subset (tmp_mask, d->domain)) { +if (cpumask_subset (vector_cpumask, d->domain)) { err =0 ; -if (cpumask_equal (tmp_mask, d->domain)) +if (cpumask_equal (vector_cpumask, d->domain))break ;/* * New cpumask using the vector is a proper subset of * the current in use mask. So cleanup the vector * allocation for the members that are not used anymore. */ -cpumask_andnot (d->old_domain, d->domain, tmp_mask); +cpumask_andnot (d->old_domain, d->domain, + vector_cpumask); d->move_in_progress =cpumask_intersects (d->old_domain, cpu_online_mask); -cpumask_and (d->domain, d->domain, tmp_mask); +cpumask_and (d->domain, d->domain, vector_cpumask);break ; }
@@ -159,16 +157,18 @@ next: }if (unlikely (current_vector == vector)) { -cpumask_or (d->old_domain, d->old_domain, tmp_mask); -cpumask_andnot (tmp_mask, mask, d->old_domain); - cpu =cpumask_first_and (tmp_mask, cpu_online_mask); +cpumask_or (d->old_domain, d->old_domain, + vector_cpumask); +cpumask_andnot (vector_cpumask, mask, d->old_domain); + cpu =cpumask_first_and (vector_cpumask, + cpu_online_mask);continue ; }if (test_bit (vector, used_vectors)) goto next; -for_each_cpu_and (new_cpu, tmp_mask, cpu_online_mask) { +for_each_cpu_and (new_cpu, vector_cpumask, cpu_online_mask) {if (per_cpu (vector_irq, new_cpu)[vector] >VECTOR_UNDEFINED ) goto next;
@@ -181,14 +181,13 @@ next: d->move_in_progress =cpumask_intersects (d->old_domain, cpu_online_mask); } -for_each_cpu_and (new_cpu, tmp_mask, cpu_online_mask) +for_each_cpu_and (new_cpu, vector_cpumask, cpu_online_mask)per_cpu (vector_irq, new_cpu)[vector] = irq; d->cfg.vector = vector; -cpumask_copy (d->domain, tmp_mask); +cpumask_copy (d->domain, vector_cpumask); err =0 ;break ; } -free_cpumask_var (tmp_mask);if (!err) {/* cache destination APIC IDs into cfg->dest_apicid */
@@ -397,6 +396,8 @@ int __init arch_early_irq_init(void)arch_init_msi_domain (x86_vector_domain);arch_init_htirq_domain (x86_vector_domain); +BUG_ON (!alloc_cpumask_var (&vector_cpumask,GFP_KERNEL )); +return arch_early_ioapic_init (); }
Signature · 1 line
1.7.10.4
tip-bot for Jiang Liu
merge bot[tip:x86/apic] x86/irq: Avoid memory allocation in __assign_irq_vector()
x86/irq: Avoid memory allocation in __assign_irq_vector()
Commit-ID: f7fa7aeeecb7a9abdd5f5d069a71ffb3e99a2a07 Gitweb: http://git.kernel.org/tip/f7fa7aeeecb7a9abdd5f5d069a71ffb3e99a2a07 Author: Jiang Liu <[email protected]> AuthorDate: Tue, 14 Apr 2015 10:30:10 +0800 Committer: Thomas Gleixner <[email protected]> CommitDate: Fri, 24 Apr 2015 15:36:55 +0200
x86/irq: Avoid memory allocation in __assign_irq_vector()
Function __assign_irq_vector() is protected by vector_lock, so use a global temporary cpu_mask to avoid allocating/freeing cpu_mask.
--- arch/x86/kernel/apic/vector.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-)
arch/x86/kernel/apic/vector.c +17 -16
@@ -30,6 +30,7 @@ struct apic_chip_data {struct irq_domain *x86_vector_domain;static DEFINE_RAW_SPINLOCK (vector_lock); +static cpumask_var_t vector_cpumask;static struct irq_chip lapic_controller;#ifdef CONFIG_X86_IO_APIC static struct apic_chip_data *legacy_irq_data[NR_IRQS_LEGACY ];
@@ -116,14 +117,10 @@ static int __assign_irq_vector(int irq, struct apic_chip_data *d,static int current_vector =FIRST_EXTERNAL_VECTOR +VECTOR_OFFSET_START ;static int current_offset =VECTOR_OFFSET_START %16 ;int cpu, err; -cpumask_var_t tmp_mask;if (d->move_in_progress)return -EBUSY ; -if (!alloc_cpumask_var (&tmp_mask,GFP_ATOMIC )) -return -ENOMEM ; -/* Only try and allocate irqs on cpus that are present */ err = -ENOSPC ;cpumask_clear (d->old_domain);
@@ -131,21 +128,22 @@ static int __assign_irq_vector(int irq, struct apic_chip_data *d,while (cpu < nr_cpu_ids) {int new_cpu, vector, offset; - apic->vector_allocation_domain (cpu, tmp_mask, mask); + apic->vector_allocation_domain (cpu, vector_cpumask, mask); -if (cpumask_subset (tmp_mask, d->domain)) { +if (cpumask_subset (vector_cpumask, d->domain)) { err =0 ; -if (cpumask_equal (tmp_mask, d->domain)) +if (cpumask_equal (vector_cpumask, d->domain))break ;/* * New cpumask using the vector is a proper subset of * the current in use mask. So cleanup the vector * allocation for the members that are not used anymore. */ -cpumask_andnot (d->old_domain, d->domain, tmp_mask); +cpumask_andnot (d->old_domain, d->domain, + vector_cpumask); d->move_in_progress =cpumask_intersects (d->old_domain, cpu_online_mask); -cpumask_and (d->domain, d->domain, tmp_mask); +cpumask_and (d->domain, d->domain, vector_cpumask);break ; }
@@ -159,16 +157,18 @@ next: }if (unlikely (current_vector == vector)) { -cpumask_or (d->old_domain, d->old_domain, tmp_mask); -cpumask_andnot (tmp_mask, mask, d->old_domain); - cpu =cpumask_first_and (tmp_mask, cpu_online_mask); +cpumask_or (d->old_domain, d->old_domain, + vector_cpumask); +cpumask_andnot (vector_cpumask, mask, d->old_domain); + cpu =cpumask_first_and (vector_cpumask, + cpu_online_mask);continue ; }if (test_bit (vector, used_vectors)) goto next; -for_each_cpu_and (new_cpu, tmp_mask, cpu_online_mask) { +for_each_cpu_and (new_cpu, vector_cpumask, cpu_online_mask) {if (per_cpu (vector_irq, new_cpu)[vector] >VECTOR_UNDEFINED ) goto next;
@@ -181,14 +181,13 @@ next: d->move_in_progress =cpumask_intersects (d->old_domain, cpu_online_mask); } -for_each_cpu_and (new_cpu, tmp_mask, cpu_online_mask) +for_each_cpu_and (new_cpu, vector_cpumask, cpu_online_mask)per_cpu (vector_irq, new_cpu)[vector] = irq; d->cfg.vector = vector; -cpumask_copy (d->domain, tmp_mask); +cpumask_copy (d->domain, vector_cpumask); err =0 ;break ; } -free_cpumask_var (tmp_mask);if (!err) {/* cache destination APIC IDs into cfg->dest_apicid */
@@ -397,6 +396,8 @@ int __init arch_early_irq_init(void)arch_init_msi_domain (x86_vector_domain);arch_init_htirq_domain (x86_vector_domain); +BUG_ON (!alloc_cpumask_var (&vector_cpumask,GFP_KERNEL )); +return arch_early_ioapic_init (); }