* [RFC v1 02/11] genirq: Move field 'node' from struct irq_data into struct irq_common_data [not found] <1430709339-29083-1-git-send-email-jiang.liu@linux.intel.com> @ 2015-05-04 3:15 ` Jiang Liu 2015-05-08 2:29 ` Yun Wu (Abel) 2015-05-15 20:42 ` Thomas Gleixner 2015-05-04 3:15 ` [RFC v1 04/11] genirq: Move field 'handler_data' " Jiang Liu 1 sibling, 2 replies; 5+ messages in thread From: Jiang Liu @ 2015-05-04 3:15 UTC (permalink / raw) To: Thomas Gleixner, Bjorn Helgaas, Benjamin Herrenschmidt, Ingo Molnar, H. Peter Anvin, Rafael J. Wysocki, Randy Dunlap, Yinghai Lu, Borislav Petkov, x86, Jiang Liu, Jason Cooper, Grant Likely, Kevin Cernekee Cc: Konrad Rzeszutek Wilk, Tony Luck, linux-kernel, linux-pci, linux-acpi, linux-sh NUMA node information is per-irq instead of per-irqchip, so move it into struct irq_common_data. Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> --- arch/sh/kernel/irq.c | 2 +- arch/x86/kernel/apic/vector.c | 8 ++++---- arch/x86/platform/uv/uv_irq.c | 2 +- include/linux/irq.h | 20 ++++++++++++++++++-- kernel/irq/internals.h | 5 +++++ kernel/irq/irqdesc.c | 10 ++-------- kernel/irq/irqdomain.c | 4 ++-- kernel/irq/manage.c | 2 +- kernel/irq/proc.c | 2 +- 9 files changed, 35 insertions(+), 20 deletions(-) diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index eb10ff84015c..8dc677cc136b 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c @@ -227,7 +227,7 @@ void migrate_irqs(void) for_each_active_irq(irq) { struct irq_data *data = irq_get_irq_data(irq); - if (data->node = cpu) { + if (irq_data_get_node(data) = cpu) { unsigned int newcpu = cpumask_any_and(data->affinity, cpu_online_mask); if (newcpu >= nr_cpu_ids) { diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c index 96ce5068a926..983bea2a09ce 100644 --- a/arch/x86/kernel/apic/vector.c +++ b/arch/x86/kernel/apic/vector.c @@ -345,7 +345,7 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq, struct irq_alloc_info *info = arg; struct apic_chip_data *data; struct irq_data *irq_data; - int i, err; + int i, err, node; if (disable_apic) return -ENXIO; @@ -357,12 +357,13 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq, for (i = 0; i < nr_irqs; i++) { irq_data = irq_domain_get_irq_data(domain, virq + i); BUG_ON(!irq_data); + node = irq_data_get_node(irq_data); #ifdef CONFIG_X86_IO_APIC if (virq + i < nr_legacy_irqs() && legacy_irq_data[virq + i]) data = legacy_irq_data[virq + i]; else #endif - data = alloc_apic_chip_data(irq_data->node); + data = alloc_apic_chip_data(node); if (!data) { err = -ENOMEM; goto error; @@ -371,8 +372,7 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq, irq_data->chip = &lapic_controller; irq_data->chip_data = data; irq_data->hwirq = virq + i; - err = assign_irq_vector_policy(virq, irq_data->node, data, - info); + err = assign_irq_vector_policy(virq, node, data, info); if (err) goto error; } diff --git a/arch/x86/platform/uv/uv_irq.c b/arch/x86/platform/uv/uv_irq.c index cdf86cd3fd97..bc992b7b041f 100644 --- a/arch/x86/platform/uv/uv_irq.c +++ b/arch/x86/platform/uv/uv_irq.c @@ -89,7 +89,7 @@ static int uv_domain_alloc(struct irq_domain *domain, unsigned int virq, return -EINVAL; chip_data = kmalloc_node(sizeof(*chip_data), GFP_KERNEL, - irq_data->node); + irq_data_get_node(irq_data)); if (!chip_data) return -ENOMEM; diff --git a/include/linux/irq.h b/include/linux/irq.h index 3b6e0def7f5c..3f999a0af713 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -129,9 +129,13 @@ struct irq_domain; * struct irq_common_data - per irq data shared by all irqchips * @state_use_accessors: status information for irq chip functions. * Use accessor functions to deal with it + * @node: node index useful for balancing */ struct irq_common_data { unsigned int state_use_accessors; +#ifdef CONFIG_SMP + unsigned int node; +#endif }; /** @@ -139,7 +143,6 @@ struct irq_common_data { * @mask: precomputed bitmask for accessing the chip registers * @irq: interrupt number * @hwirq: hardware interrupt number, local to the interrupt domain - * @node: node index useful for balancing * @common: point to data shared by all irqchips * @chip: low level interrupt hardware access * @domain: Interrupt translation domain; responsible for mapping @@ -160,7 +163,6 @@ struct irq_data { u32 mask; unsigned int irq; unsigned long hwirq; - unsigned int node; struct irq_common_data *common; struct irq_chip *chip; struct irq_domain *domain; @@ -634,6 +636,20 @@ static inline u32 irq_get_trigger_type(unsigned int irq) return d ? irqd_get_trigger_type(d) : 0; } +static inline int irq_common_data_get_node(struct irq_common_data *d) +{ +#ifdef CONFIG_SMP + return d->node; +#else + return 0; +#endif +} + +static inline int irq_data_get_node(struct irq_data *d) +{ + return irq_common_data_get_node(d->common); +} + unsigned int arch_dynirq_lower_bound(unsigned int from); int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node, diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index ed84299788b3..d82a77d39aeb 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h @@ -199,6 +199,11 @@ static inline void kstat_incr_irqs_this_cpu(unsigned int irq, struct irq_desc *d __this_cpu_inc(kstat.irqs_sum); } +static inline int irq_desc_get_node(struct irq_desc *desc) +{ + return irq_common_data_get_node(&desc->irq_common_data); +} + #ifdef CONFIG_PM_SLEEP bool irq_pm_check_wakeup(struct irq_desc *desc); void irq_pm_install_action(struct irq_desc *desc, struct irqaction *action); diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index eac1aac906ea..20773f073e24 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c @@ -52,23 +52,17 @@ static int alloc_masks(struct irq_desc *desc, gfp_t gfp, int node) static void desc_smp_init(struct irq_desc *desc, int node) { - desc->irq_data.node = node; + desc->irq_common_data.node = node; cpumask_copy(desc->irq_data.affinity, irq_default_affinity); #ifdef CONFIG_GENERIC_PENDING_IRQ cpumask_clear(desc->pending_mask); #endif } -static inline int desc_node(struct irq_desc *desc) -{ - return desc->irq_data.node; -} - #else static inline int alloc_masks(struct irq_desc *desc, gfp_t gfp, int node) { return 0; } static inline void desc_smp_init(struct irq_desc *desc, int node) { } -static inline int desc_node(struct irq_desc *desc) { return 0; } #endif static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node, @@ -300,7 +294,7 @@ static void free_desc(unsigned int irq) unsigned long flags; raw_spin_lock_irqsave(&desc->lock, flags); - desc_set_defaults(irq, desc, desc_node(desc), NULL); + desc_set_defaults(irq, desc, irq_desc_get_node(desc), NULL); raw_spin_unlock_irqrestore(&desc->lock, flags); } diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index 3552b8750efd..93ef89059022 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c @@ -830,12 +830,12 @@ static struct irq_data *irq_domain_insert_irq_data(struct irq_domain *domain, { struct irq_data *irq_data; - irq_data = kzalloc_node(sizeof(*irq_data), GFP_KERNEL, child->node); + irq_data = kzalloc_node(sizeof(*irq_data), GFP_KERNEL, + irq_data_get_node(child)); if (irq_data) { child->parent_data = irq_data; irq_data->irq = child->irq; irq_data->common = child->common; - irq_data->node = child->node; irq_data->domain = domain; } diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index e68932bb308e..d206aa2c3378 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -332,7 +332,7 @@ static int setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask) { struct cpumask *set = irq_default_affinity; - int node = desc->irq_data.node; + int node = irq_desc_get_node(desc); /* Excludes PER_CPU and NO_BALANCE interrupts */ if (!irq_can_set_affinity(irq)) diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index df2f4642d1e7..0e97c142ce40 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c @@ -241,7 +241,7 @@ static int irq_node_proc_show(struct seq_file *m, void *v) { struct irq_desc *desc = irq_to_desc((long) m->private); - seq_printf(m, "%d\n", desc->irq_data.node); + seq_printf(m, "%d\n", irq_desc_get_node(desc)); return 0; } -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [RFC v1 02/11] genirq: Move field 'node' from struct irq_data into struct irq_common_data 2015-05-04 3:15 ` [RFC v1 02/11] genirq: Move field 'node' from struct irq_data into struct irq_common_data Jiang Liu @ 2015-05-08 2:29 ` Yun Wu (Abel) 2015-05-08 3:04 ` Yun Wu (Abel) 2015-05-15 20:42 ` Thomas Gleixner 1 sibling, 1 reply; 5+ messages in thread From: Yun Wu (Abel) @ 2015-05-08 2:29 UTC (permalink / raw) To: Jiang Liu Cc: Thomas Gleixner, Bjorn Helgaas, Benjamin Herrenschmidt, Ingo Molnar, H. Peter Anvin, Rafael J. Wysocki, Randy Dunlap, Yinghai Lu, Borislav Petkov, x86, Jason Cooper, Grant Likely, Kevin Cernekee, Konrad Rzeszutek Wilk, Tony Luck, linux-kernel, linux-pci, linux-acpi, linux-sh Hi Gerry, On 2015/5/4 11:15, Jiang Liu wrote: > NUMA node information is per-irq instead of per-irqchip, so move it into > struct irq_common_data. > > Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> > --- > arch/sh/kernel/irq.c | 2 +- > arch/x86/kernel/apic/vector.c | 8 ++++---- > arch/x86/platform/uv/uv_irq.c | 2 +- > include/linux/irq.h | 20 ++++++++++++++++++-- > kernel/irq/internals.h | 5 +++++ > kernel/irq/irqdesc.c | 10 ++-------- > kernel/irq/irqdomain.c | 4 ++-- > kernel/irq/manage.c | 2 +- > kernel/irq/proc.c | 2 +- > 9 files changed, 35 insertions(+), 20 deletions(-) > > diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c > index eb10ff84015c..8dc677cc136b 100644 > --- a/arch/sh/kernel/irq.c > +++ b/arch/sh/kernel/irq.c > @@ -227,7 +227,7 @@ void migrate_irqs(void) > for_each_active_irq(irq) { > struct irq_data *data = irq_get_irq_data(irq); > > - if (data->node = cpu) { > + if (irq_data_get_node(data) = cpu) { > unsigned int newcpu = cpumask_any_and(data->affinity, > cpu_online_mask); > if (newcpu >= nr_cpu_ids) { > diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c > index 96ce5068a926..983bea2a09ce 100644 > --- a/arch/x86/kernel/apic/vector.c > +++ b/arch/x86/kernel/apic/vector.c > @@ -345,7 +345,7 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq, > struct irq_alloc_info *info = arg; > struct apic_chip_data *data; > struct irq_data *irq_data; > - int i, err; > + int i, err, node; > > if (disable_apic) > return -ENXIO; > @@ -357,12 +357,13 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq, > for (i = 0; i < nr_irqs; i++) { > irq_data = irq_domain_get_irq_data(domain, virq + i); > BUG_ON(!irq_data); > + node = irq_data_get_node(irq_data); > #ifdef CONFIG_X86_IO_APIC > if (virq + i < nr_legacy_irqs() && legacy_irq_data[virq + i]) > data = legacy_irq_data[virq + i]; > else > #endif > - data = alloc_apic_chip_data(irq_data->node); > + data = alloc_apic_chip_data(node); > if (!data) { > err = -ENOMEM; > goto error; > @@ -371,8 +372,7 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq, > irq_data->chip = &lapic_controller; > irq_data->chip_data = data; > irq_data->hwirq = virq + i; > - err = assign_irq_vector_policy(virq, irq_data->node, data, > - info); > + err = assign_irq_vector_policy(virq, node, data, info); > if (err) > goto error; > } > diff --git a/arch/x86/platform/uv/uv_irq.c b/arch/x86/platform/uv/uv_irq.c > index cdf86cd3fd97..bc992b7b041f 100644 > --- a/arch/x86/platform/uv/uv_irq.c > +++ b/arch/x86/platform/uv/uv_irq.c > @@ -89,7 +89,7 @@ static int uv_domain_alloc(struct irq_domain *domain, unsigned int virq, > return -EINVAL; > > chip_data = kmalloc_node(sizeof(*chip_data), GFP_KERNEL, > - irq_data->node); > + irq_data_get_node(irq_data)); > if (!chip_data) > return -ENOMEM; > > diff --git a/include/linux/irq.h b/include/linux/irq.h > index 3b6e0def7f5c..3f999a0af713 100644 > --- a/include/linux/irq.h > +++ b/include/linux/irq.h > @@ -129,9 +129,13 @@ struct irq_domain; > * struct irq_common_data - per irq data shared by all irqchips > * @state_use_accessors: status information for irq chip functions. > * Use accessor functions to deal with it > + * @node: node index useful for balancing > */ > struct irq_common_data { > unsigned int state_use_accessors; > +#ifdef CONFIG_SMP Would CONFIG_NUMA be a little more appropriate? Or even let @node be always compiled? Thanks, Abel > + unsigned int node; > +#endif > }; > > /** > @@ -139,7 +143,6 @@ struct irq_common_data { > * @mask: precomputed bitmask for accessing the chip registers > * @irq: interrupt number > * @hwirq: hardware interrupt number, local to the interrupt domain > - * @node: node index useful for balancing > * @common: point to data shared by all irqchips > * @chip: low level interrupt hardware access > * @domain: Interrupt translation domain; responsible for mapping > @@ -160,7 +163,6 @@ struct irq_data { > u32 mask; > unsigned int irq; > unsigned long hwirq; > - unsigned int node; > struct irq_common_data *common; > struct irq_chip *chip; > struct irq_domain *domain; > @@ -634,6 +636,20 @@ static inline u32 irq_get_trigger_type(unsigned int irq) > return d ? irqd_get_trigger_type(d) : 0; > } > > +static inline int irq_common_data_get_node(struct irq_common_data *d) > +{ > +#ifdef CONFIG_SMP > + return d->node; > +#else > + return 0; > +#endif > +} > + > +static inline int irq_data_get_node(struct irq_data *d) > +{ > + return irq_common_data_get_node(d->common); > +} > + > unsigned int arch_dynirq_lower_bound(unsigned int from); > > int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node, > diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h > index ed84299788b3..d82a77d39aeb 100644 > --- a/kernel/irq/internals.h > +++ b/kernel/irq/internals.h > @@ -199,6 +199,11 @@ static inline void kstat_incr_irqs_this_cpu(unsigned int irq, struct irq_desc *d > __this_cpu_inc(kstat.irqs_sum); > } > > +static inline int irq_desc_get_node(struct irq_desc *desc) > +{ > + return irq_common_data_get_node(&desc->irq_common_data); > +} > + > #ifdef CONFIG_PM_SLEEP > bool irq_pm_check_wakeup(struct irq_desc *desc); > void irq_pm_install_action(struct irq_desc *desc, struct irqaction *action); > diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c > index eac1aac906ea..20773f073e24 100644 > --- a/kernel/irq/irqdesc.c > +++ b/kernel/irq/irqdesc.c > @@ -52,23 +52,17 @@ static int alloc_masks(struct irq_desc *desc, gfp_t gfp, int node) > > static void desc_smp_init(struct irq_desc *desc, int node) > { > - desc->irq_data.node = node; > + desc->irq_common_data.node = node; > cpumask_copy(desc->irq_data.affinity, irq_default_affinity); > #ifdef CONFIG_GENERIC_PENDING_IRQ > cpumask_clear(desc->pending_mask); > #endif > } > > -static inline int desc_node(struct irq_desc *desc) > -{ > - return desc->irq_data.node; > -} > - > #else > static inline int > alloc_masks(struct irq_desc *desc, gfp_t gfp, int node) { return 0; } > static inline void desc_smp_init(struct irq_desc *desc, int node) { } > -static inline int desc_node(struct irq_desc *desc) { return 0; } > #endif > > static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node, > @@ -300,7 +294,7 @@ static void free_desc(unsigned int irq) > unsigned long flags; > > raw_spin_lock_irqsave(&desc->lock, flags); > - desc_set_defaults(irq, desc, desc_node(desc), NULL); > + desc_set_defaults(irq, desc, irq_desc_get_node(desc), NULL); > raw_spin_unlock_irqrestore(&desc->lock, flags); > } > > diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c > index 3552b8750efd..93ef89059022 100644 > --- a/kernel/irq/irqdomain.c > +++ b/kernel/irq/irqdomain.c > @@ -830,12 +830,12 @@ static struct irq_data *irq_domain_insert_irq_data(struct irq_domain *domain, > { > struct irq_data *irq_data; > > - irq_data = kzalloc_node(sizeof(*irq_data), GFP_KERNEL, child->node); > + irq_data = kzalloc_node(sizeof(*irq_data), GFP_KERNEL, > + irq_data_get_node(child)); > if (irq_data) { > child->parent_data = irq_data; > irq_data->irq = child->irq; > irq_data->common = child->common; > - irq_data->node = child->node; > irq_data->domain = domain; > } > > diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c > index e68932bb308e..d206aa2c3378 100644 > --- a/kernel/irq/manage.c > +++ b/kernel/irq/manage.c > @@ -332,7 +332,7 @@ static int > setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask) > { > struct cpumask *set = irq_default_affinity; > - int node = desc->irq_data.node; > + int node = irq_desc_get_node(desc); > > /* Excludes PER_CPU and NO_BALANCE interrupts */ > if (!irq_can_set_affinity(irq)) > diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c > index df2f4642d1e7..0e97c142ce40 100644 > --- a/kernel/irq/proc.c > +++ b/kernel/irq/proc.c > @@ -241,7 +241,7 @@ static int irq_node_proc_show(struct seq_file *m, void *v) > { > struct irq_desc *desc = irq_to_desc((long) m->private); > > - seq_printf(m, "%d\n", desc->irq_data.node); > + seq_printf(m, "%d\n", irq_desc_get_node(desc)); > return 0; > } > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC v1 02/11] genirq: Move field 'node' from struct irq_data into struct irq_common_data 2015-05-08 2:29 ` Yun Wu (Abel) @ 2015-05-08 3:04 ` Yun Wu (Abel) 0 siblings, 0 replies; 5+ messages in thread From: Yun Wu (Abel) @ 2015-05-08 3:04 UTC (permalink / raw) To: Jiang Liu Cc: Thomas Gleixner, Bjorn Helgaas, Benjamin Herrenschmidt, Ingo Molnar, H. Peter Anvin, Rafael J. Wysocki, Randy Dunlap, Yinghai Lu, Borislav Petkov, x86, Jason Cooper, Grant Likely, Kevin Cernekee, Konrad Rzeszutek Wilk, Tony Luck, linux-kernel, linux-pci, linux-acpi, linux-sh On 2015/5/8 10:29, Yun Wu (Abel) wrote: > Hi Gerry, > On 2015/5/4 11:15, Jiang Liu wrote: > >> NUMA node information is per-irq instead of per-irqchip, so move it into >> struct irq_common_data. >> >> Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> >> --- >> arch/sh/kernel/irq.c | 2 +- >> arch/x86/kernel/apic/vector.c | 8 ++++---- >> arch/x86/platform/uv/uv_irq.c | 2 +- >> include/linux/irq.h | 20 ++++++++++++++++++-- >> kernel/irq/internals.h | 5 +++++ >> kernel/irq/irqdesc.c | 10 ++-------- >> kernel/irq/irqdomain.c | 4 ++-- >> kernel/irq/manage.c | 2 +- >> kernel/irq/proc.c | 2 +- >> 9 files changed, 35 insertions(+), 20 deletions(-) >> >> diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c >> index eb10ff84015c..8dc677cc136b 100644 >> --- a/arch/sh/kernel/irq.c >> +++ b/arch/sh/kernel/irq.c >> @@ -227,7 +227,7 @@ void migrate_irqs(void) >> for_each_active_irq(irq) { >> struct irq_data *data = irq_get_irq_data(irq); >> >> - if (data->node = cpu) { >> + if (irq_data_get_node(data) = cpu) { >> unsigned int newcpu = cpumask_any_and(data->affinity, >> cpu_online_mask); >> if (newcpu >= nr_cpu_ids) { >> diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c >> index 96ce5068a926..983bea2a09ce 100644 >> --- a/arch/x86/kernel/apic/vector.c >> +++ b/arch/x86/kernel/apic/vector.c >> @@ -345,7 +345,7 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq, >> struct irq_alloc_info *info = arg; >> struct apic_chip_data *data; >> struct irq_data *irq_data; >> - int i, err; >> + int i, err, node; >> >> if (disable_apic) >> return -ENXIO; >> @@ -357,12 +357,13 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq, >> for (i = 0; i < nr_irqs; i++) { >> irq_data = irq_domain_get_irq_data(domain, virq + i); >> BUG_ON(!irq_data); >> + node = irq_data_get_node(irq_data); >> #ifdef CONFIG_X86_IO_APIC >> if (virq + i < nr_legacy_irqs() && legacy_irq_data[virq + i]) >> data = legacy_irq_data[virq + i]; >> else >> #endif >> - data = alloc_apic_chip_data(irq_data->node); >> + data = alloc_apic_chip_data(node); >> if (!data) { >> err = -ENOMEM; >> goto error; >> @@ -371,8 +372,7 @@ static int x86_vector_alloc_irqs(struct irq_domain *domain, unsigned int virq, >> irq_data->chip = &lapic_controller; >> irq_data->chip_data = data; >> irq_data->hwirq = virq + i; >> - err = assign_irq_vector_policy(virq, irq_data->node, data, >> - info); >> + err = assign_irq_vector_policy(virq, node, data, info); >> if (err) >> goto error; >> } >> diff --git a/arch/x86/platform/uv/uv_irq.c b/arch/x86/platform/uv/uv_irq.c >> index cdf86cd3fd97..bc992b7b041f 100644 >> --- a/arch/x86/platform/uv/uv_irq.c >> +++ b/arch/x86/platform/uv/uv_irq.c >> @@ -89,7 +89,7 @@ static int uv_domain_alloc(struct irq_domain *domain, unsigned int virq, >> return -EINVAL; >> >> chip_data = kmalloc_node(sizeof(*chip_data), GFP_KERNEL, >> - irq_data->node); >> + irq_data_get_node(irq_data)); >> if (!chip_data) >> return -ENOMEM; >> >> diff --git a/include/linux/irq.h b/include/linux/irq.h >> index 3b6e0def7f5c..3f999a0af713 100644 >> --- a/include/linux/irq.h >> +++ b/include/linux/irq.h >> @@ -129,9 +129,13 @@ struct irq_domain; >> * struct irq_common_data - per irq data shared by all irqchips >> * @state_use_accessors: status information for irq chip functions. >> * Use accessor functions to deal with it >> + * @node: node index useful for balancing >> */ >> struct irq_common_data { >> unsigned int state_use_accessors; >> +#ifdef CONFIG_SMP > > Would CONFIG_NUMA be a little more appropriate? > Or even let @node be always compiled? Sorry for comment before reading your next patch in which you replaced CONFIG_SMP with CONFIG_NUMA. And letting @node be under CONFIG_NUMA makes sense, because it's useless in non-NUMA scenario. Thanks, Abel > > >> + unsigned int node; >> +#endif >> }; >> >> /** >> @@ -139,7 +143,6 @@ struct irq_common_data { >> * @mask: precomputed bitmask for accessing the chip registers >> * @irq: interrupt number >> * @hwirq: hardware interrupt number, local to the interrupt domain >> - * @node: node index useful for balancing >> * @common: point to data shared by all irqchips >> * @chip: low level interrupt hardware access >> * @domain: Interrupt translation domain; responsible for mapping >> @@ -160,7 +163,6 @@ struct irq_data { >> u32 mask; >> unsigned int irq; >> unsigned long hwirq; >> - unsigned int node; >> struct irq_common_data *common; >> struct irq_chip *chip; >> struct irq_domain *domain; >> @@ -634,6 +636,20 @@ static inline u32 irq_get_trigger_type(unsigned int irq) >> return d ? irqd_get_trigger_type(d) : 0; >> } >> >> +static inline int irq_common_data_get_node(struct irq_common_data *d) >> +{ >> +#ifdef CONFIG_SMP >> + return d->node; >> +#else >> + return 0; >> +#endif >> +} >> + >> +static inline int irq_data_get_node(struct irq_data *d) >> +{ >> + return irq_common_data_get_node(d->common); >> +} >> + >> unsigned int arch_dynirq_lower_bound(unsigned int from); >> >> int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node, >> diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h >> index ed84299788b3..d82a77d39aeb 100644 >> --- a/kernel/irq/internals.h >> +++ b/kernel/irq/internals.h >> @@ -199,6 +199,11 @@ static inline void kstat_incr_irqs_this_cpu(unsigned int irq, struct irq_desc *d >> __this_cpu_inc(kstat.irqs_sum); >> } >> >> +static inline int irq_desc_get_node(struct irq_desc *desc) >> +{ >> + return irq_common_data_get_node(&desc->irq_common_data); >> +} >> + >> #ifdef CONFIG_PM_SLEEP >> bool irq_pm_check_wakeup(struct irq_desc *desc); >> void irq_pm_install_action(struct irq_desc *desc, struct irqaction *action); >> diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c >> index eac1aac906ea..20773f073e24 100644 >> --- a/kernel/irq/irqdesc.c >> +++ b/kernel/irq/irqdesc.c >> @@ -52,23 +52,17 @@ static int alloc_masks(struct irq_desc *desc, gfp_t gfp, int node) >> >> static void desc_smp_init(struct irq_desc *desc, int node) >> { >> - desc->irq_data.node = node; >> + desc->irq_common_data.node = node; >> cpumask_copy(desc->irq_data.affinity, irq_default_affinity); >> #ifdef CONFIG_GENERIC_PENDING_IRQ >> cpumask_clear(desc->pending_mask); >> #endif >> } >> >> -static inline int desc_node(struct irq_desc *desc) >> -{ >> - return desc->irq_data.node; >> -} >> - >> #else >> static inline int >> alloc_masks(struct irq_desc *desc, gfp_t gfp, int node) { return 0; } >> static inline void desc_smp_init(struct irq_desc *desc, int node) { } >> -static inline int desc_node(struct irq_desc *desc) { return 0; } >> #endif >> >> static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node, >> @@ -300,7 +294,7 @@ static void free_desc(unsigned int irq) >> unsigned long flags; >> >> raw_spin_lock_irqsave(&desc->lock, flags); >> - desc_set_defaults(irq, desc, desc_node(desc), NULL); >> + desc_set_defaults(irq, desc, irq_desc_get_node(desc), NULL); >> raw_spin_unlock_irqrestore(&desc->lock, flags); >> } >> >> diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c >> index 3552b8750efd..93ef89059022 100644 >> --- a/kernel/irq/irqdomain.c >> +++ b/kernel/irq/irqdomain.c >> @@ -830,12 +830,12 @@ static struct irq_data *irq_domain_insert_irq_data(struct irq_domain *domain, >> { >> struct irq_data *irq_data; >> >> - irq_data = kzalloc_node(sizeof(*irq_data), GFP_KERNEL, child->node); >> + irq_data = kzalloc_node(sizeof(*irq_data), GFP_KERNEL, >> + irq_data_get_node(child)); >> if (irq_data) { >> child->parent_data = irq_data; >> irq_data->irq = child->irq; >> irq_data->common = child->common; >> - irq_data->node = child->node; >> irq_data->domain = domain; >> } >> >> diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c >> index e68932bb308e..d206aa2c3378 100644 >> --- a/kernel/irq/manage.c >> +++ b/kernel/irq/manage.c >> @@ -332,7 +332,7 @@ static int >> setup_affinity(unsigned int irq, struct irq_desc *desc, struct cpumask *mask) >> { >> struct cpumask *set = irq_default_affinity; >> - int node = desc->irq_data.node; >> + int node = irq_desc_get_node(desc); >> >> /* Excludes PER_CPU and NO_BALANCE interrupts */ >> if (!irq_can_set_affinity(irq)) >> diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c >> index df2f4642d1e7..0e97c142ce40 100644 >> --- a/kernel/irq/proc.c >> +++ b/kernel/irq/proc.c >> @@ -241,7 +241,7 @@ static int irq_node_proc_show(struct seq_file *m, void *v) >> { >> struct irq_desc *desc = irq_to_desc((long) m->private); >> >> - seq_printf(m, "%d\n", desc->irq_data.node); >> + seq_printf(m, "%d\n", irq_desc_get_node(desc)); >> return 0; >> } >> > > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC v1 02/11] genirq: Move field 'node' from struct irq_data into struct irq_common_data 2015-05-04 3:15 ` [RFC v1 02/11] genirq: Move field 'node' from struct irq_data into struct irq_common_data Jiang Liu 2015-05-08 2:29 ` Yun Wu (Abel) @ 2015-05-15 20:42 ` Thomas Gleixner 1 sibling, 0 replies; 5+ messages in thread From: Thomas Gleixner @ 2015-05-15 20:42 UTC (permalink / raw) To: Jiang Liu Cc: Bjorn Helgaas, Benjamin Herrenschmidt, Ingo Molnar, H. Peter Anvin, Rafael J. Wysocki, Randy Dunlap, Yinghai Lu, Borislav Petkov, x86, Jason Cooper, Grant Likely, Kevin Cernekee, Konrad Rzeszutek Wilk, Tony Luck, linux-kernel, linux-pci, linux-acpi, linux-sh On Mon, 4 May 2015, Jiang Liu wrote: > NUMA node information is per-irq instead of per-irqchip, so move it into > struct irq_common_data. > > Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> > --- > arch/sh/kernel/irq.c | 2 +- > arch/x86/kernel/apic/vector.c | 8 ++++---- > arch/x86/platform/uv/uv_irq.c | 2 +- > include/linux/irq.h | 20 ++++++++++++++++++-- > kernel/irq/internals.h | 5 +++++ > kernel/irq/irqdesc.c | 10 ++-------- > kernel/irq/irqdomain.c | 4 ++-- > kernel/irq/manage.c | 2 +- > kernel/irq/proc.c | 2 +- Can you please split this into several patches for review and bisection sake? 1) Do the cleanup of s/data->node/irq_data_get_node(data)/ 1 a) core code 1 b) arch/sh 1 c) arch/x86 2) Do the actual move of node to common_data Thanks, tglx ^ permalink raw reply [flat|nested] 5+ messages in thread
* [RFC v1 04/11] genirq: Move field 'handler_data' from struct irq_data into struct irq_common_data [not found] <1430709339-29083-1-git-send-email-jiang.liu@linux.intel.com> 2015-05-04 3:15 ` [RFC v1 02/11] genirq: Move field 'node' from struct irq_data into struct irq_common_data Jiang Liu @ 2015-05-04 3:15 ` Jiang Liu 1 sibling, 0 replies; 5+ messages in thread From: Jiang Liu @ 2015-05-04 3:15 UTC (permalink / raw) To: Thomas Gleixner, Bjorn Helgaas, Benjamin Herrenschmidt, Ingo Molnar, H. Peter Anvin, Rafael J. Wysocki, Randy Dunlap, Yinghai Lu, Borislav Petkov, David S. Miller, x86, Linus Walleij, Alexandre Courbot, Simon Horman, Magnus Damm, bob picco, Jiang Liu, Andy Lutomirski, Jason Cooper, Grant Likely, Kevin Cernekee, Marc Zyngier Cc: Konrad Rzeszutek Wilk, Tony Luck, linux-kernel, linux-pci, linux-acpi, sparclinux, linux-gpio, linux-sh Handler data (handler_data) is per-irq instead of per irqchip, so move it into struct irq_common_data. Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> --- arch/sparc/kernel/irq_64.c | 15 +++++++++------ arch/sparc/kernel/sun4d_irq.c | 4 ++-- arch/sparc/kernel/sun4m_irq.c | 6 ++++-- arch/x86/kernel/apic/msi.c | 2 +- arch/x86/kernel/hpet.c | 4 ++-- drivers/gpio/gpio-davinci.c | 2 +- drivers/sh/intc/virq.c | 4 ++-- include/linux/irq.h | 8 ++++---- include/linux/irqdesc.h | 2 +- kernel/irq/chip.c | 2 +- kernel/irq/irqdesc.c | 3 ++- 11 files changed, 29 insertions(+), 23 deletions(-) diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index 4033c23bdfa6..5130f6e3e68e 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c @@ -210,21 +210,21 @@ struct irq_handler_data { static inline unsigned int irq_data_to_handle(struct irq_data *data) { - struct irq_handler_data *ihd = data->handler_data; + struct irq_handler_data *ihd = irq_data_get_irq_handler_data(data); return ihd->dev_handle; } static inline unsigned int irq_data_to_ino(struct irq_data *data) { - struct irq_handler_data *ihd = data->handler_data; + struct irq_handler_data *ihd = irq_data_get_irq_handler_data(data); return ihd->dev_ino; } static inline unsigned long irq_data_to_sysino(struct irq_data *data) { - struct irq_handler_data *ihd = data->handler_data; + struct irq_handler_data *ihd = irq_data_get_irq_handler_data(data); return ihd->sysino; } @@ -370,8 +370,9 @@ static int irq_choose_cpu(unsigned int irq, const struct cpumask *affinity) static void sun4u_irq_enable(struct irq_data *data) { - struct irq_handler_data *handler_data = data->handler_data; + struct irq_handler_data *handler_data; + handler_data = irq_data_get_irq_handler_data(data); if (likely(handler_data)) { unsigned long cpuid, imap, val; unsigned int tid; @@ -393,8 +394,9 @@ static void sun4u_irq_enable(struct irq_data *data) static int sun4u_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force) { - struct irq_handler_data *handler_data = data->handler_data; + struct irq_handler_data *handler_data; + handler_data = irq_data_get_irq_handler_data(data); if (likely(handler_data)) { unsigned long cpuid, imap, val; unsigned int tid; @@ -438,8 +440,9 @@ static void sun4u_irq_disable(struct irq_data *data) static void sun4u_irq_eoi(struct irq_data *data) { - struct irq_handler_data *handler_data = data->handler_data; + struct irq_handler_data *handler_data; + handler_data = irq_data_get_irq_handler_data(data); if (likely(handler_data)) upa_writeq(ICLR_IDLE, handler_data->iclr); } diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c index a1bb2675b280..a87d0e47c168 100644 --- a/arch/sparc/kernel/sun4d_irq.c +++ b/arch/sparc/kernel/sun4d_irq.c @@ -188,7 +188,7 @@ void sun4d_handler_irq(unsigned int pil, struct pt_regs *regs) static void sun4d_mask_irq(struct irq_data *data) { - struct sun4d_handler_data *handler_data = data->handler_data; + struct sun4d_handler_data *handler_data = irq_data_get_irq_handler_data(data); unsigned int real_irq; #ifdef CONFIG_SMP int cpuid = handler_data->cpuid; @@ -206,7 +206,7 @@ static void sun4d_mask_irq(struct irq_data *data) static void sun4d_unmask_irq(struct irq_data *data) { - struct sun4d_handler_data *handler_data = data->handler_data; + struct sun4d_handler_data *handler_data = irq_data_get_irq_handler_data(data); unsigned int real_irq; #ifdef CONFIG_SMP int cpuid = handler_data->cpuid; diff --git a/arch/sparc/kernel/sun4m_irq.c b/arch/sparc/kernel/sun4m_irq.c index 8bb3b3fddea7..da737c712fa8 100644 --- a/arch/sparc/kernel/sun4m_irq.c +++ b/arch/sparc/kernel/sun4m_irq.c @@ -188,9 +188,10 @@ static unsigned long sun4m_imask[0x50] = { static void sun4m_mask_irq(struct irq_data *data) { - struct sun4m_handler_data *handler_data = data->handler_data; + struct sun4m_handler_data *handler_data; int cpu = smp_processor_id(); + handler_data = irq_data_get_irq_handler_data(data); if (handler_data->mask) { unsigned long flags; @@ -206,9 +207,10 @@ static void sun4m_mask_irq(struct irq_data *data) static void sun4m_unmask_irq(struct irq_data *data) { - struct sun4m_handler_data *handler_data = data->handler_data; + struct sun4m_handler_data *handler_data; int cpu = smp_processor_id(); + handler_data = irq_data_get_irq_handler_data(data); if (handler_data->mask) { unsigned long flags; diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c index 58fde664e7c0..e87655fcf30e 100644 --- a/arch/x86/kernel/apic/msi.c +++ b/arch/x86/kernel/apic/msi.c @@ -263,7 +263,7 @@ static inline int hpet_dev_id(struct irq_domain *domain) static void hpet_msi_write_msg(struct irq_data *data, struct msi_msg *msg) { - hpet_msi_write(data->handler_data, msg); + hpet_msi_write(irq_data_get_irq_handler_data(data), msg); } static struct irq_chip hpet_msi_controller = { diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index e2449cf38b06..40cf79a55fe7 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c @@ -426,7 +426,7 @@ static struct irq_domain *hpet_domain; void hpet_msi_unmask(struct irq_data *data) { - struct hpet_dev *hdev = data->handler_data; + struct hpet_dev *hdev = irq_data_get_irq_handler_data(data); unsigned int cfg; /* unmask it */ @@ -437,7 +437,7 @@ void hpet_msi_unmask(struct irq_data *data) void hpet_msi_mask(struct irq_data *data) { - struct hpet_dev *hdev = data->handler_data; + struct hpet_dev *hdev = irq_data_get_irq_handler_data(data); unsigned int cfg; /* mask it */ diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c index c5e05c82d67c..477d5b8616ab 100644 --- a/drivers/gpio/gpio-davinci.c +++ b/drivers/gpio/gpio-davinci.c @@ -396,7 +396,7 @@ static int gpio_irq_type_unbanked(struct irq_data *data, unsigned trigger) struct davinci_gpio_regs __iomem *g; u32 mask; - d = (struct davinci_gpio_controller *)data->handler_data; + d = (struct davinci_gpio_controller *)irq_data_get_irq_handler_data(data); g = (struct davinci_gpio_regs __iomem *)d->regs; mask = __gpio_mask(data->irq - d->gpio_irq); diff --git a/drivers/sh/intc/virq.c b/drivers/sh/intc/virq.c index f30ac9354ff2..3dbc21696924 100644 --- a/drivers/sh/intc/virq.c +++ b/drivers/sh/intc/virq.c @@ -87,8 +87,8 @@ static int add_virq_to_pirq(unsigned int irq, unsigned int virq) struct irq_data *data = irq_get_irq_data(irq); /* scan for duplicates */ - last = (struct intc_virq_list **)&data->handler_data; - for_each_virq(entry, data->handler_data) { + last = (struct intc_virq_list **)&data->common->handler_data; + for_each_virq(entry, irq_data_get_irq_handler_data(data)) { if (entry->irq = virq) return 0; last = &entry->next; diff --git a/include/linux/irq.h b/include/linux/irq.h index 0138f046642c..43581e166298 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h @@ -130,12 +130,14 @@ struct irq_domain; * @state_use_accessors: status information for irq chip functions. * Use accessor functions to deal with it * @node: node index useful for balancing + * @handler_data: per-IRQ data for the irq_chip methods */ struct irq_common_data { unsigned int state_use_accessors; #ifdef CONFIG_NUMA unsigned int node; #endif + void *handler_data; }; /** @@ -149,7 +151,6 @@ struct irq_common_data { * between hwirq number and linux irq number. * @parent_data: pointer to parent struct irq_data to support hierarchy * irq_domain - * @handler_data: per-IRQ data for the irq_chip methods * @chip_data: platform-specific per-chip private data for the chip * methods, to allow shared chip implementations * @msi_desc: MSI descriptor @@ -169,7 +170,6 @@ struct irq_data { #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY struct irq_data *parent_data; #endif - void *handler_data; void *chip_data; struct msi_desc *msi_desc; cpumask_var_t affinity; @@ -611,12 +611,12 @@ static inline void *irq_data_get_irq_chip_data(struct irq_data *d) static inline void *irq_get_handler_data(unsigned int irq) { struct irq_data *d = irq_get_irq_data(irq); - return d ? d->handler_data : NULL; + return d ? d->common->handler_data : NULL; } static inline void *irq_data_get_irq_handler_data(struct irq_data *d) { - return d->handler_data; + return d->common->handler_data; } static inline struct msi_desc *irq_get_msi_desc(unsigned int irq) diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h index 3010e99abf3e..5d5776f40129 100644 --- a/include/linux/irqdesc.h +++ b/include/linux/irqdesc.h @@ -111,7 +111,7 @@ static inline void *irq_desc_get_chip_data(struct irq_desc *desc) static inline void *irq_desc_get_handler_data(struct irq_desc *desc) { - return desc->irq_data.handler_data; + return desc->irq_common_data.handler_data; } static inline struct msi_desc *irq_desc_get_msi_desc(struct irq_desc *desc) diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index eb9a4ea394ab..46c487fc71dd 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c @@ -83,7 +83,7 @@ int irq_set_handler_data(unsigned int irq, void *data) if (!desc) return -EINVAL; - desc->irq_data.handler_data = data; + desc->irq_common_data.handler_data = data; irq_put_desc_unlock(desc, flags); return 0; } diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index 0c3057e42906..7f881792ad5f 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c @@ -72,11 +72,12 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node, { int cpu; + desc->irq_common_data.handler_data = NULL; + desc->irq_data.common = &desc->irq_common_data; desc->irq_data.irq = irq; desc->irq_data.chip = &no_irq_chip; desc->irq_data.chip_data = NULL; - desc->irq_data.handler_data = NULL; desc->irq_data.msi_desc = NULL; irq_settings_clr_and_set(desc, ~0, _IRQ_DEFAULT_INIT_FLAGS); irqd_set(&desc->irq_data, IRQD_IRQ_DISABLED); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-05-15 20:42 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1430709339-29083-1-git-send-email-jiang.liu@linux.intel.com>
2015-05-04 3:15 ` [RFC v1 02/11] genirq: Move field 'node' from struct irq_data into struct irq_common_data Jiang Liu
2015-05-08 2:29 ` Yun Wu (Abel)
2015-05-08 3:04 ` Yun Wu (Abel)
2015-05-15 20:42 ` Thomas Gleixner
2015-05-04 3:15 ` [RFC v1 04/11] genirq: Move field 'handler_data' " Jiang Liu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox