* [PATCH 00/12] genirq/irqchip: Effective affinity fixups
@ 2017-08-15 11:34 Marc Zyngier
2017-08-15 11:34 ` [PATCH 01/12] genirq: Restrict effective affinity to single-target interrupts Marc Zyngier
` (11 more replies)
0 siblings, 12 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
4.13 contains a number of updates to the core IRQ code to deal with
things like the effective affinity. This series attempts to fix a
number of small things that are now breaking:
1) The core code assumes that CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
being defined implies that *all* interrupts have an effective
affinity, while it may not be the case (I may have compiled in an
irqchip driver that has this property, yet none of my interrupts are
routed through it).
2) A large number of our irqchips are effectively single target (they
will pick one CPU in the affinity list), and yet do not update the
effective affinity cpumask.
(1) is solved by checking that the interrupt has been configured as
"single target" when reporting the effective affinity mask.
(2) is just a matter of updating the effective affinity when required,
and to mark the interrupts as "single target". I've kept them separate
so that people can directly pick the irqchip they are interested in,
but these 10 patches could as well be squashed into a single one.
I've lightly tested the ARM GIC stuff, and that's it. I'd appreciate
some feedback from the platform maintainers, specially for the more
exotic architectures such as metag and xtensa.
Thanks,
M.
Marc Zyngier (12):
genirq: Restrict effective affinity to single-target interrupts
genirq/proc: Use the the accessor to report the effective affinity
irqchip/gic: Report that effective affinity is a single target
irqchip/gic-v3: Report that effective affinity is a single target
irqchip/gic-v3-its: Report that effective affinity is a single target
irqchip/armada-370-xp: Report that effective affinity is a single
target
irqchip/bcm-6345-l1: Report that effective affinity is a single target
irqchip/bcm-7038-l1: Report that effective affinity is a single target
irqchip/metag-ext: Report that effective affinity is a single target
irqchip/hip04: Report that effective affinity is a single target
irqchip/mips-gic: Report that effective affinity is a single target
irqchip/xtensa-mx: Report that effective affinity is a single target
arch/arm/mach-hisi/Kconfig | 1 +
arch/metag/Kconfig | 1 +
drivers/irqchip/Kconfig | 7 +++++++
drivers/irqchip/irq-armada-370-xp.c | 3 +++
drivers/irqchip/irq-bcm6345-l1.c | 3 +++
drivers/irqchip/irq-bcm7038-l1.c | 3 +++
drivers/irqchip/irq-gic-v3-its.c | 7 ++++++-
drivers/irqchip/irq-gic-v3.c | 3 +++
drivers/irqchip/irq-gic.c | 3 +++
drivers/irqchip/irq-hip04.c | 3 +++
drivers/irqchip/irq-metag-ext.c | 4 ++++
drivers/irqchip/irq-mips-gic.c | 2 ++
drivers/irqchip/irq-xtensa-mx.c | 6 +++++-
include/linux/irq.h | 5 ++++-
kernel/irq/proc.c | 2 +-
15 files changed, 49 insertions(+), 4 deletions(-)
--
2.11.0
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 01/12] genirq: Restrict effective affinity to single-target interrupts
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
2017-08-15 12:01 ` Thomas Gleixner
2017-08-15 11:34 ` [PATCH 02/12] genirq/proc: Use the the accessor to report the effective affinity Marc Zyngier
` (10 subsequent siblings)
11 siblings, 1 reply; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
Just because CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK is selected
doesn't mean that all the interrupts are using the effective
affinity mask. For a number of them, this mask is likely to
be empty.
In order to deal with this, let's restrict the use of the
effective affinity mask to these interrupts that have been
configured as "single target".
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
include/linux/irq.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/include/linux/irq.h b/include/linux/irq.h
index d2d543794093..af1510642b8a 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -781,7 +781,10 @@ static inline struct cpumask *irq_data_get_affinity_mask(struct irq_data *d)
static inline
struct cpumask *irq_data_get_effective_affinity_mask(struct irq_data *d)
{
- return d->common->effective_affinity;
+ if (irqd_is_single_target(d))
+ return d->common->effective_affinity;
+ else
+ return d->common->affinity;
}
static inline void irq_data_update_effective_affinity(struct irq_data *d,
const struct cpumask *m)
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 02/12] genirq/proc: Use the the accessor to report the effective affinity
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
2017-08-15 11:34 ` [PATCH 01/12] genirq: Restrict effective affinity to single-target interrupts Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
2017-08-15 11:34 ` [PATCH 03/12] irqchip/gic: Report that effective affinity is a single target Marc Zyngier
` (9 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
If CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK is defined, but that the
interrupt is not single target, the effective affinity reported in
/proc/irq/x/effective_affinity will be empty, which is not the truth.
Instead, use the accessor to report the affinity, which will pick
the right mask.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
kernel/irq/proc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c
index 7f9642a1e267..0534781724d0 100644
--- a/kernel/irq/proc.c
+++ b/kernel/irq/proc.c
@@ -61,7 +61,7 @@ static int show_irq_affinity(int type, struct seq_file *m)
case EFFECTIVE:
case EFFECTIVE_LIST:
#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
- mask = desc->irq_common_data.effective_affinity;
+ mask = irq_data_get_effective_affinity_mask(&desc->irq_data);
break;
#else
return -EINVAL;
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 03/12] irqchip/gic: Report that effective affinity is a single target
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
2017-08-15 11:34 ` [PATCH 01/12] genirq: Restrict effective affinity to single-target interrupts Marc Zyngier
2017-08-15 11:34 ` [PATCH 02/12] genirq/proc: Use the the accessor to report the effective affinity Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
2017-08-15 11:34 ` [PATCH 04/12] irqchip/gic-v3: " Marc Zyngier
` (8 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
The GIC driver only targets a single CPU at a time, even if
the notional affinity is wider. Let's inform the core code
about this.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
drivers/irqchip/Kconfig | 1 +
drivers/irqchip/irq-gic.c | 3 +++
2 files changed, 4 insertions(+)
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index f1fd5f44d1d4..586929d072ca 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -7,6 +7,7 @@ config ARM_GIC
select IRQ_DOMAIN
select IRQ_DOMAIN_HIERARCHY
select MULTI_IRQ_HANDLER
+ select GENERIC_IRQ_EFFECTIVE_AFF_MASK
config ARM_GIC_PM
bool
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
index 1b1df4f770bd..20dd2ba3d603 100644
--- a/drivers/irqchip/irq-gic.c
+++ b/drivers/irqchip/irq-gic.c
@@ -344,6 +344,8 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
writel_relaxed(val | bit, reg);
gic_unlock_irqrestore(flags);
+ irq_data_update_effective_affinity(d, cpumask_of(cpu));
+
return IRQ_SET_MASK_OK_DONE;
}
#endif
@@ -966,6 +968,7 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
irq_domain_set_info(d, irq, hw, &gic->chip, d->host_data,
handle_fasteoi_irq, NULL, NULL);
irq_set_probe(irq);
+ irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(irq)));
}
return 0;
}
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 04/12] irqchip/gic-v3: Report that effective affinity is a single target
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
` (2 preceding siblings ...)
2017-08-15 11:34 ` [PATCH 03/12] irqchip/gic: Report that effective affinity is a single target Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
2017-08-15 11:34 ` [PATCH 05/12] irqchip/gic-v3-its: " Marc Zyngier
` (7 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
The GICv3 driver only targets a single CPU at a time, even if
the notional affinity is wider. Let's inform the core code
about this.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
drivers/irqchip/Kconfig | 1 +
drivers/irqchip/irq-gic-v3.c | 3 +++
2 files changed, 4 insertions(+)
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index 586929d072ca..ce99c1ee6c7d 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -35,6 +35,7 @@ config ARM_GIC_V3
select MULTI_IRQ_HANDLER
select IRQ_DOMAIN_HIERARCHY
select PARTITION_PERCPU
+ select GENERIC_IRQ_EFFECTIVE_AFF_MASK
config ARM_GIC_V3_ITS
bool
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
index dbffb7ab6203..511c290c4a26 100644
--- a/drivers/irqchip/irq-gic-v3.c
+++ b/drivers/irqchip/irq-gic-v3.c
@@ -670,6 +670,8 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
else
gic_dist_wait_for_rwp();
+ irq_data_update_effective_affinity(d, cpumask_of(cpu));
+
return IRQ_SET_MASK_OK_DONE;
}
#else
@@ -768,6 +770,7 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
irq_domain_set_info(d, irq, hw, chip, d->host_data,
handle_fasteoi_irq, NULL, NULL);
irq_set_probe(irq);
+ irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(irq)));
}
/* LPIs */
if (hw >= 8192 && hw < GIC_ID_NR) {
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 05/12] irqchip/gic-v3-its: Report that effective affinity is a single target
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
` (3 preceding siblings ...)
2017-08-15 11:34 ` [PATCH 04/12] irqchip/gic-v3: " Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
2017-08-15 11:34 ` [PATCH 06/12] irqchip/armada-370-xp: " Marc Zyngier
` (6 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
The GICv3 ITS driver only targets a single CPU at a time, even if
the notional affinity is wider. Let's inform the core code
about this.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
drivers/irqchip/irq-gic-v3-its.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
index 68932873eebc..22e228500357 100644
--- a/drivers/irqchip/irq-gic-v3-its.c
+++ b/drivers/irqchip/irq-gic-v3-its.c
@@ -649,6 +649,7 @@ static int its_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
target_col = &its_dev->its->collections[cpu];
its_send_movi(its_dev, target_col, id);
its_dev->event_map.col_map[id] = cpu;
+ irq_data_update_effective_affinity(d, cpumask_of(cpu));
}
return IRQ_SET_MASK_OK_DONE;
@@ -1481,6 +1482,7 @@ static int its_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
irq_domain_set_hwirq_and_chip(domain, virq + i,
hwirq, &its_irq_chip, its_dev);
+ irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(virq + i)));
pr_debug("ID:%d pID:%d vID:%d\n",
(int)(hwirq - its_dev->event_map.lpi_base),
(int) hwirq, virq + i);
@@ -1495,13 +1497,16 @@ static void its_irq_domain_activate(struct irq_domain *domain,
struct its_device *its_dev = irq_data_get_irq_chip_data(d);
u32 event = its_get_event_id(d);
const struct cpumask *cpu_mask = cpu_online_mask;
+ int cpu;
/* get the cpu_mask of local node */
if (its_dev->its->numa_node >= 0)
cpu_mask = cpumask_of_node(its_dev->its->numa_node);
/* Bind the LPI to the first possible CPU */
- its_dev->event_map.col_map[event] = cpumask_first(cpu_mask);
+ cpu = cpumask_first(cpu_mask);
+ its_dev->event_map.col_map[event] = cpu;
+ irq_data_update_effective_affinity(d, cpumask_of(cpu));
/* Map the GIC IRQ and event to the device */
its_send_mapti(its_dev, d->hwirq, event);
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 06/12] irqchip/armada-370-xp: Report that effective affinity is a single target
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
` (4 preceding siblings ...)
2017-08-15 11:34 ` [PATCH 05/12] irqchip/gic-v3-its: " Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
2017-08-15 11:34 ` [PATCH 07/12] irqchip/bcm-6345-l1: " Marc Zyngier
` (5 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
The Armada 370 XP driver only targets a single CPU at a time, even if
the notional affinity is wider. Let's inform the core code
about this.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
drivers/irqchip/Kconfig | 1 +
drivers/irqchip/irq-armada-370-xp.c | 3 +++
2 files changed, 4 insertions(+)
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index ce99c1ee6c7d..cd688777553c 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -66,6 +66,7 @@ config ARMADA_370_XP_IRQ
bool
select GENERIC_IRQ_CHIP
select PCI_MSI if PCI
+ select GENERIC_IRQ_EFFECTIVE_AFF_MASK
config ALPINE_MSI
bool
diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c
index b207b2c3aa55..eb815676c088 100644
--- a/drivers/irqchip/irq-armada-370-xp.c
+++ b/drivers/irqchip/irq-armada-370-xp.c
@@ -330,6 +330,8 @@ static int armada_xp_set_affinity(struct irq_data *d,
writel(reg, main_int_base + ARMADA_370_XP_INT_SOURCE_CTL(hwirq));
raw_spin_unlock(&irq_controller_lock);
+ irq_data_update_effective_affinity(d, cpumask_of(cpu));
+
return IRQ_SET_MASK_OK;
}
#endif
@@ -363,6 +365,7 @@ static int armada_370_xp_mpic_irq_map(struct irq_domain *h,
} else {
irq_set_chip_and_handler(virq, &armada_370_xp_irq_chip,
handle_level_irq);
+ irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(virq)));
}
irq_set_probe(virq);
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 07/12] irqchip/bcm-6345-l1: Report that effective affinity is a single target
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
` (5 preceding siblings ...)
2017-08-15 11:34 ` [PATCH 06/12] irqchip/armada-370-xp: " Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
2017-08-15 11:34 ` [PATCH 08/12] irqchip/bcm-7038-l1: " Marc Zyngier
` (4 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
The BCM 6345-L1 driver only targets a single CPU at a time, even if
the notional affinity is wider. Let's inform the core code
about this.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
drivers/irqchip/Kconfig | 1 +
drivers/irqchip/irq-bcm6345-l1.c | 3 +++
2 files changed, 4 insertions(+)
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index cd688777553c..b36a55d6833e 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -96,6 +96,7 @@ config BCM6345_L1_IRQ
bool
select GENERIC_IRQ_CHIP
select IRQ_DOMAIN
+ select GENERIC_IRQ_EFFECTIVE_AFF_MASK
config BCM7038_L1_IRQ
bool
diff --git a/drivers/irqchip/irq-bcm6345-l1.c b/drivers/irqchip/irq-bcm6345-l1.c
index daa4ae89e466..43f8abe40878 100644
--- a/drivers/irqchip/irq-bcm6345-l1.c
+++ b/drivers/irqchip/irq-bcm6345-l1.c
@@ -231,6 +231,8 @@ static int bcm6345_l1_set_affinity(struct irq_data *d,
}
raw_spin_unlock_irqrestore(&intc->lock, flags);
+ irq_data_update_effective_affinity(d, cpumask_of(new_cpu));
+
return IRQ_SET_MASK_OK_NOCOPY;
}
@@ -291,6 +293,7 @@ static int bcm6345_l1_map(struct irq_domain *d, unsigned int virq,
irq_set_chip_and_handler(virq,
&bcm6345_l1_irq_chip, handle_percpu_irq);
irq_set_chip_data(virq, d->host_data);
+ irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(virq)));
return 0;
}
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 08/12] irqchip/bcm-7038-l1: Report that effective affinity is a single target
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
` (6 preceding siblings ...)
2017-08-15 11:34 ` [PATCH 07/12] irqchip/bcm-6345-l1: " Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
2017-08-15 11:34 ` [PATCH 09/12] irqchip/metag-ext: " Marc Zyngier
` (3 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
The BCM 7038-L1 driver only targets a single CPU at a time, even if
the notional affinity is wider. Let's inform the core code
about this.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
drivers/irqchip/Kconfig | 1 +
drivers/irqchip/irq-bcm7038-l1.c | 3 +++
2 files changed, 4 insertions(+)
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index b36a55d6833e..39bfa5b25b54 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -102,6 +102,7 @@ config BCM7038_L1_IRQ
bool
select GENERIC_IRQ_CHIP
select IRQ_DOMAIN
+ select GENERIC_IRQ_EFFECTIVE_AFF_MASK
config BCM7120_L2_IRQ
bool
diff --git a/drivers/irqchip/irq-bcm7038-l1.c b/drivers/irqchip/irq-bcm7038-l1.c
index c2662a1bfdd3..55cfb986225b 100644
--- a/drivers/irqchip/irq-bcm7038-l1.c
+++ b/drivers/irqchip/irq-bcm7038-l1.c
@@ -212,6 +212,8 @@ static int bcm7038_l1_set_affinity(struct irq_data *d,
__bcm7038_l1_unmask(d, first_cpu);
raw_spin_unlock_irqrestore(&intc->lock, flags);
+ irq_data_update_effective_affinity(d, cpumask_of(first_cpu));
+
return 0;
}
@@ -299,6 +301,7 @@ static int bcm7038_l1_map(struct irq_domain *d, unsigned int virq,
{
irq_set_chip_and_handler(virq, &bcm7038_l1_irq_chip, handle_level_irq);
irq_set_chip_data(virq, d->host_data);
+ irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(virq)));
return 0;
}
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 09/12] irqchip/metag-ext: Report that effective affinity is a single target
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
` (7 preceding siblings ...)
2017-08-15 11:34 ` [PATCH 08/12] irqchip/bcm-7038-l1: " Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
2017-08-15 11:34 ` [PATCH 10/12] irqchip/hip04: " Marc Zyngier
` (2 subsequent siblings)
11 siblings, 0 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
The metag-ext driver only targets a single CPU at a time, even if
the notional affinity is wider. Let's inform the core code
about this.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
arch/metag/Kconfig | 1 +
drivers/irqchip/irq-metag-ext.c | 4 ++++
2 files changed, 5 insertions(+)
diff --git a/arch/metag/Kconfig b/arch/metag/Kconfig
index 5b7a45d99cfb..7d8b322e5101 100644
--- a/arch/metag/Kconfig
+++ b/arch/metag/Kconfig
@@ -26,6 +26,7 @@ config METAG
select HAVE_SYSCALL_TRACEPOINTS
select HAVE_UNDERSCORE_SYMBOL_PREFIX
select IRQ_DOMAIN
+ select GENERIC_IRQ_EFFECTIVE_AFF_MASK
select MODULES_USE_ELF_RELA
select OF
select OF_EARLY_FLATTREE
diff --git a/drivers/irqchip/irq-metag-ext.c b/drivers/irqchip/irq-metag-ext.c
index 0cdd923d1535..be7216bfb8dd 100644
--- a/drivers/irqchip/irq-metag-ext.c
+++ b/drivers/irqchip/irq-metag-ext.c
@@ -518,6 +518,8 @@ static int meta_intc_set_affinity(struct irq_data *data,
metag_out32(TBI_TRIG_VEC(TBID_SIGNUM_TR2(thread)), vec_addr);
+ irq_data_update_effective_affinity(data, cpumask_of(cpu));
+
return 0;
}
#else
@@ -578,6 +580,8 @@ static int meta_intc_map(struct irq_domain *d, unsigned int irq,
else
irq_set_chip_and_handler(irq, &meta_intc_edge_chip,
handle_edge_irq);
+
+ irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(irq)));
return 0;
}
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 10/12] irqchip/hip04: Report that effective affinity is a single target
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
` (8 preceding siblings ...)
2017-08-15 11:34 ` [PATCH 09/12] irqchip/metag-ext: " Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
2017-08-15 11:34 ` [PATCH 11/12] irqchip/mips-gic: " Marc Zyngier
2017-08-15 11:34 ` [PATCH 12/12] irqchip/xtensa-mx: " Marc Zyngier
11 siblings, 0 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
The HIP04 driver only targets a single CPU at a time, even if
the notional affinity is wider. Let's inform the core code
about this.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
arch/arm/mach-hisi/Kconfig | 1 +
drivers/irqchip/irq-hip04.c | 3 +++
2 files changed, 4 insertions(+)
diff --git a/arch/arm/mach-hisi/Kconfig b/arch/arm/mach-hisi/Kconfig
index a3b091a4d344..65a048fa08ec 100644
--- a/arch/arm/mach-hisi/Kconfig
+++ b/arch/arm/mach-hisi/Kconfig
@@ -39,6 +39,7 @@ config ARCH_HIP04
select HAVE_ARM_ARCH_TIMER
select MCPM if SMP
select MCPM_QUAD_CLUSTER if SMP
+ select GENERIC_IRQ_EFFECTIVE_AFF_MASK
help
Support for Hisilicon HiP04 SoC family
diff --git a/drivers/irqchip/irq-hip04.c b/drivers/irqchip/irq-hip04.c
index c1b4ee955dbe..5b4fd2f4e5f8 100644
--- a/drivers/irqchip/irq-hip04.c
+++ b/drivers/irqchip/irq-hip04.c
@@ -165,6 +165,8 @@ static int hip04_irq_set_affinity(struct irq_data *d,
writel_relaxed(val | bit, reg);
raw_spin_unlock(&irq_controller_lock);
+ irq_data_update_effective_affinity(d, cpumask_of(cpu));
+
return IRQ_SET_MASK_OK;
}
#endif
@@ -312,6 +314,7 @@ static int hip04_irq_domain_map(struct irq_domain *d, unsigned int irq,
irq_set_chip_and_handler(irq, &hip04_irq_chip,
handle_fasteoi_irq);
irq_set_probe(irq);
+ irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(irq)));
}
irq_set_chip_data(irq, d->host_data);
return 0;
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 11/12] irqchip/mips-gic: Report that effective affinity is a single target
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
` (9 preceding siblings ...)
2017-08-15 11:34 ` [PATCH 10/12] irqchip/hip04: " Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
2017-08-15 16:23 ` Paul Burton
2017-08-15 11:34 ` [PATCH 12/12] irqchip/xtensa-mx: " Marc Zyngier
11 siblings, 1 reply; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
The MIPS GIC driver only targets a single CPU at a time, even if
the notional affinity is wider. Let's inform the core code
about this.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
drivers/irqchip/Kconfig | 1 +
drivers/irqchip/irq-mips-gic.c | 2 ++
2 files changed, 3 insertions(+)
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index 39bfa5b25b54..bca9a88012f0 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -141,6 +141,7 @@ config IRQ_MIPS_CPU
select GENERIC_IRQ_IPI if SYS_SUPPORTS_MULTITHREADING
select IRQ_DOMAIN
select IRQ_DOMAIN_HIERARCHY if GENERIC_IRQ_IPI
+ select GENERIC_IRQ_EFFECTIVE_AFF_MASK
config CLPS711X_IRQCHIP
bool
diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
index 6ab1d3afec02..e075cb25fad6 100644
--- a/drivers/irqchip/irq-mips-gic.c
+++ b/drivers/irqchip/irq-mips-gic.c
@@ -463,6 +463,7 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *cpumask,
set_bit(irq, pcpu_masks[cpumask_first(&tmp)].pcpu_mask);
cpumask_copy(irq_data_get_affinity_mask(d), cpumask);
+ irq_data_update_effective_affinity(d, cpumask);
spin_unlock_irqrestore(&gic_lock, flags);
return IRQ_SET_MASK_OK_NOCOPY;
@@ -716,6 +717,7 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int virq,
if (err)
return err;
+ irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(virq)));
return gic_shared_irq_domain_map(d, virq, hwirq, 0);
}
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 12/12] irqchip/xtensa-mx: Report that effective affinity is a single target
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
` (10 preceding siblings ...)
2017-08-15 11:34 ` [PATCH 11/12] irqchip/mips-gic: " Marc Zyngier
@ 2017-08-15 11:34 ` Marc Zyngier
11 siblings, 0 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 11:34 UTC (permalink / raw)
To: linux-kernel
Cc: Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
The xtensa-mx driver only targets a single CPU at a time, even if
the notional affinity is wider. Let's inform the core code
about this.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
drivers/irqchip/Kconfig | 1 +
drivers/irqchip/irq-xtensa-mx.c | 6 +++++-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
index bca9a88012f0..1139de9da21a 100644
--- a/drivers/irqchip/Kconfig
+++ b/drivers/irqchip/Kconfig
@@ -223,6 +223,7 @@ config VERSATILE_FPGA_IRQ_NR
config XTENSA_MX
bool
select IRQ_DOMAIN
+ select GENERIC_IRQ_EFFECTIVE_AFF_MASK
config XILINX_INTC
bool
diff --git a/drivers/irqchip/irq-xtensa-mx.c b/drivers/irqchip/irq-xtensa-mx.c
index 72a391e01011..a15a9510c904 100644
--- a/drivers/irqchip/irq-xtensa-mx.c
+++ b/drivers/irqchip/irq-xtensa-mx.c
@@ -32,6 +32,7 @@ static int xtensa_mx_irq_map(struct irq_domain *d, unsigned int irq,
irq_set_status_flags(irq, IRQ_LEVEL);
return 0;
}
+ irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(irq)));
return xtensa_irq_map(d, irq, hw);
}
@@ -121,9 +122,12 @@ static int xtensa_mx_irq_retrigger(struct irq_data *d)
static int xtensa_mx_irq_set_affinity(struct irq_data *d,
const struct cpumask *dest, bool force)
{
- unsigned mask = 1u << cpumask_any_and(dest, cpu_online_mask);
+ int cpu = cpumask_any_and(dest, cpu_online_mask);
+ unsigned mask = 1u << cpu;
set_er(mask, MIROUT(d->hwirq - HW_IRQ_MX_BASE));
+ irq_data_update_effective_affinity(d, cpumask_of(cpu));
+
return 0;
}
--
2.11.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 01/12] genirq: Restrict effective affinity to single-target interrupts
2017-08-15 11:34 ` [PATCH 01/12] genirq: Restrict effective affinity to single-target interrupts Marc Zyngier
@ 2017-08-15 12:01 ` Thomas Gleixner
2017-08-15 12:18 ` Marc Zyngier
0 siblings, 1 reply; 18+ messages in thread
From: Thomas Gleixner @ 2017-08-15 12:01 UTC (permalink / raw)
To: Marc Zyngier
Cc: linux-kernel, Wei Xu, James Hogan, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
On Tue, 15 Aug 2017, Marc Zyngier wrote:
> Just because CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK is selected
> doesn't mean that all the interrupts are using the effective
> affinity mask. For a number of them, this mask is likely to
> be empty.
>
> In order to deal with this, let's restrict the use of the
> effective affinity mask to these interrupts that have been
> configured as "single target".
That's actually wrong. On X86 we have other restrictions, i.e. groups of
CPUs which are a subset of the affinity mask.
The point of the effective mask is to see to which CPU(s) a particular
interrupt is effectively routed. This is always a subset of the affinity
mask which is either the boot default or set by the admin.
So what you really want is to check whether the effective mask is
empty. That's an indicator that the underlying irq chip does not update the
effective mask.
The single target bit is an optimization for the hotplug case. If its set,
then we can avoid to reconfigure the affinity for that interrupt because it
either would not change or pointlessly be redirected to another single CPU
in the valid set.
Thanks,
tglx
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 01/12] genirq: Restrict effective affinity to single-target interrupts
2017-08-15 12:01 ` Thomas Gleixner
@ 2017-08-15 12:18 ` Marc Zyngier
0 siblings, 0 replies; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 12:18 UTC (permalink / raw)
To: Thomas Gleixner
Cc: linux-kernel, Wei Xu, James Hogan, Jason Cooper, Andrew Lunn,
Gregory Clement, Sebastian Hesselbarth, Kevin Cernekee,
Florian Fainelli, Chris Zankel, Max Filippov, Paul Burton,
Matt Redfearn
On 15/08/17 13:01, Thomas Gleixner wrote:
> On Tue, 15 Aug 2017, Marc Zyngier wrote:
>
>> Just because CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK is selected
>> doesn't mean that all the interrupts are using the effective
>> affinity mask. For a number of them, this mask is likely to
>> be empty.
>>
>> In order to deal with this, let's restrict the use of the
>> effective affinity mask to these interrupts that have been
>> configured as "single target".
>
> That's actually wrong. On X86 we have other restrictions, i.e. groups of
> CPUs which are a subset of the affinity mask.
Ah, I completely missed that particular restriction.
> The point of the effective mask is to see to which CPU(s) a particular
> interrupt is effectively routed. This is always a subset of the affinity
> mask which is either the boot default or set by the admin.
>
> So what you really want is to check whether the effective mask is
> empty. That's an indicator that the underlying irq chip does not update the
> effective mask.
Yes, that should do the trick. I'll update that patch.
Thanks,
M.
--
Jazz is not dead. It just smells funny...
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 11/12] irqchip/mips-gic: Report that effective affinity is a single target
2017-08-15 11:34 ` [PATCH 11/12] irqchip/mips-gic: " Marc Zyngier
@ 2017-08-15 16:23 ` Paul Burton
2017-08-15 16:44 ` Marc Zyngier
0 siblings, 1 reply; 18+ messages in thread
From: Paul Burton @ 2017-08-15 16:23 UTC (permalink / raw)
To: Marc Zyngier
Cc: linux-kernel, Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper,
Andrew Lunn, Gregory Clement, Sebastian Hesselbarth,
Kevin Cernekee, Florian Fainelli, Chris Zankel, Max Filippov,
Matt Redfearn
[-- Attachment #1: Type: text/plain, Size: 1943 bytes --]
Hi Marc,
On Tuesday, 15 August 2017 04:34:46 PDT Marc Zyngier wrote:
> The MIPS GIC driver only targets a single CPU at a time, even if
> the notional affinity is wider. Let's inform the core code
> about this.
>
> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> ---
> drivers/irqchip/Kconfig | 1 +
> drivers/irqchip/irq-mips-gic.c | 2 ++
> 2 files changed, 3 insertions(+)
>
> diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
> index 39bfa5b25b54..bca9a88012f0 100644
> --- a/drivers/irqchip/Kconfig
> +++ b/drivers/irqchip/Kconfig
> @@ -141,6 +141,7 @@ config IRQ_MIPS_CPU
> select GENERIC_IRQ_IPI if SYS_SUPPORTS_MULTITHREADING
> select IRQ_DOMAIN
> select IRQ_DOMAIN_HIERARCHY if GENERIC_IRQ_IPI
> + select GENERIC_IRQ_EFFECTIVE_AFF_MASK
>
> config CLPS711X_IRQCHIP
> bool
> diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
> index 6ab1d3afec02..e075cb25fad6 100644
> --- a/drivers/irqchip/irq-mips-gic.c
> +++ b/drivers/irqchip/irq-mips-gic.c
> @@ -463,6 +463,7 @@ static int gic_set_affinity(struct irq_data *d, const
> struct cpumask *cpumask, set_bit(irq,
> pcpu_masks[cpumask_first(&tmp)].pcpu_mask);
>
> cpumask_copy(irq_data_get_affinity_mask(d), cpumask);
> + irq_data_update_effective_affinity(d, cpumask);
This doesn't seem right - it's just setting the effective affinity to the same
as affinity, not taking into account CPU restrictions at all. I think this
should be:
irq_data_update_effective_affinity(d, cpumask_of(cpumask_first(&tmp)));
(or something cleaner but to that effect)
Thanks,
Paul
> spin_unlock_irqrestore(&gic_lock, flags);
>
> return IRQ_SET_MASK_OK_NOCOPY;
> @@ -716,6 +717,7 @@ static int gic_irq_domain_map(struct irq_domain *d,
> unsigned int virq, if (err)
> return err;
>
> + irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(virq)));
> return gic_shared_irq_domain_map(d, virq, hwirq, 0);
> }
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 11/12] irqchip/mips-gic: Report that effective affinity is a single target
2017-08-15 16:23 ` Paul Burton
@ 2017-08-15 16:44 ` Marc Zyngier
2017-08-15 16:48 ` Paul Burton
0 siblings, 1 reply; 18+ messages in thread
From: Marc Zyngier @ 2017-08-15 16:44 UTC (permalink / raw)
To: Paul Burton
Cc: linux-kernel, Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper,
Andrew Lunn, Gregory Clement, Sebastian Hesselbarth,
Kevin Cernekee, Florian Fainelli, Chris Zankel, Max Filippov,
Matt Redfearn
On 15/08/17 17:23, Paul Burton wrote:
> Hi Marc,
>
> On Tuesday, 15 August 2017 04:34:46 PDT Marc Zyngier wrote:
>> The MIPS GIC driver only targets a single CPU at a time, even if
>> the notional affinity is wider. Let's inform the core code
>> about this.
>>
>> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
>> ---
>> drivers/irqchip/Kconfig | 1 +
>> drivers/irqchip/irq-mips-gic.c | 2 ++
>> 2 files changed, 3 insertions(+)
>>
>> diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
>> index 39bfa5b25b54..bca9a88012f0 100644
>> --- a/drivers/irqchip/Kconfig
>> +++ b/drivers/irqchip/Kconfig
>> @@ -141,6 +141,7 @@ config IRQ_MIPS_CPU
>> select GENERIC_IRQ_IPI if SYS_SUPPORTS_MULTITHREADING
>> select IRQ_DOMAIN
>> select IRQ_DOMAIN_HIERARCHY if GENERIC_IRQ_IPI
>> + select GENERIC_IRQ_EFFECTIVE_AFF_MASK
>>
>> config CLPS711X_IRQCHIP
>> bool
>> diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
>> index 6ab1d3afec02..e075cb25fad6 100644
>> --- a/drivers/irqchip/irq-mips-gic.c
>> +++ b/drivers/irqchip/irq-mips-gic.c
>> @@ -463,6 +463,7 @@ static int gic_set_affinity(struct irq_data *d, const
>> struct cpumask *cpumask, set_bit(irq,
>> pcpu_masks[cpumask_first(&tmp)].pcpu_mask);
>>
>> cpumask_copy(irq_data_get_affinity_mask(d), cpumask);
>> + irq_data_update_effective_affinity(d, cpumask);
>
> This doesn't seem right - it's just setting the effective affinity to the same
> as affinity, not taking into account CPU restrictions at all. I think this
> should be:
>
> irq_data_update_effective_affinity(d, cpumask_of(cpumask_first(&tmp)));
>
> (or something cleaner but to that effect)
Gah, you're absolutely right (/me plugs brain back in). How about something like this:
diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
index e075cb25fad6..6461380ff1a4 100644
--- a/drivers/irqchip/irq-mips-gic.c
+++ b/drivers/irqchip/irq-mips-gic.c
@@ -445,25 +445,27 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *cpumask,
unsigned int irq = GIC_HWIRQ_TO_SHARED(d->hwirq);
cpumask_t tmp = CPU_MASK_NONE;
unsigned long flags;
- int i;
+ int i, cpu;
cpumask_and(&tmp, cpumask, cpu_online_mask);
if (cpumask_empty(&tmp))
return -EINVAL;
+ cpu = cpumask_first(&tmp);
+
/* Assumption : cpumask refers to a single CPU */
spin_lock_irqsave(&gic_lock, flags);
/* Re-route this IRQ */
- gic_map_to_vpe(irq, mips_cm_vp_id(cpumask_first(&tmp)));
+ gic_map_to_vpe(irq, mips_cm_vp_id(cpu));
/* Update the pcpu_masks */
for (i = 0; i < min(gic_vpes, NR_CPUS); i++)
clear_bit(irq, pcpu_masks[i].pcpu_mask);
- set_bit(irq, pcpu_masks[cpumask_first(&tmp)].pcpu_mask);
+ set_bit(irq, pcpu_masks[cpu].pcpu_mask);
cpumask_copy(irq_data_get_affinity_mask(d), cpumask);
- irq_data_update_effective_affinity(d, cpumask);
+ irq_data_update_effective_affinity(d, cpumask_of(cpu));
spin_unlock_irqrestore(&gic_lock, flags);
return IRQ_SET_MASK_OK_NOCOPY;
Thanks,
M.
--
Jazz is not dead. It just smells funny...
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 11/12] irqchip/mips-gic: Report that effective affinity is a single target
2017-08-15 16:44 ` Marc Zyngier
@ 2017-08-15 16:48 ` Paul Burton
0 siblings, 0 replies; 18+ messages in thread
From: Paul Burton @ 2017-08-15 16:48 UTC (permalink / raw)
To: Marc Zyngier
Cc: linux-kernel, Wei Xu, James Hogan, Thomas Gleixner, Jason Cooper,
Andrew Lunn, Gregory Clement, Sebastian Hesselbarth,
Kevin Cernekee, Florian Fainelli, Chris Zankel, Max Filippov,
Matt Redfearn
[-- Attachment #1: Type: text/plain, Size: 3450 bytes --]
Hi Marc,
On Tuesday, 15 August 2017 09:44:24 PDT Marc Zyngier wrote:
> On 15/08/17 17:23, Paul Burton wrote:
> > Hi Marc,
> >
> > On Tuesday, 15 August 2017 04:34:46 PDT Marc Zyngier wrote:
> >> The MIPS GIC driver only targets a single CPU at a time, even if
> >> the notional affinity is wider. Let's inform the core code
> >> about this.
> >>
> >> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> >> ---
> >>
> >> drivers/irqchip/Kconfig | 1 +
> >> drivers/irqchip/irq-mips-gic.c | 2 ++
> >> 2 files changed, 3 insertions(+)
> >>
> >> diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
> >> index 39bfa5b25b54..bca9a88012f0 100644
> >> --- a/drivers/irqchip/Kconfig
> >> +++ b/drivers/irqchip/Kconfig
> >> @@ -141,6 +141,7 @@ config IRQ_MIPS_CPU
> >>
> >> select GENERIC_IRQ_IPI if SYS_SUPPORTS_MULTITHREADING
> >> select IRQ_DOMAIN
> >> select IRQ_DOMAIN_HIERARCHY if GENERIC_IRQ_IPI
> >>
> >> + select GENERIC_IRQ_EFFECTIVE_AFF_MASK
> >>
> >> config CLPS711X_IRQCHIP
> >>
> >> bool
> >>
> >> diff --git a/drivers/irqchip/irq-mips-gic.c
> >> b/drivers/irqchip/irq-mips-gic.c index 6ab1d3afec02..e075cb25fad6 100644
> >> --- a/drivers/irqchip/irq-mips-gic.c
> >> +++ b/drivers/irqchip/irq-mips-gic.c
> >> @@ -463,6 +463,7 @@ static int gic_set_affinity(struct irq_data *d, const
> >> struct cpumask *cpumask, set_bit(irq,
> >> pcpu_masks[cpumask_first(&tmp)].pcpu_mask);
> >>
> >> cpumask_copy(irq_data_get_affinity_mask(d), cpumask);
> >>
> >> + irq_data_update_effective_affinity(d, cpumask);
> >
> > This doesn't seem right - it's just setting the effective affinity to the
> > same as affinity, not taking into account CPU restrictions at all. I
> > think this>
> > should be:
> > irq_data_update_effective_affinity(d, cpumask_of(cpumask_first(&tmp)));
> >
> > (or something cleaner but to that effect)
>
> Gah, you're absolutely right (/me plugs brain back in). How about something
> like this:
>
> diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
> index e075cb25fad6..6461380ff1a4 100644
> --- a/drivers/irqchip/irq-mips-gic.c
> +++ b/drivers/irqchip/irq-mips-gic.c
> @@ -445,25 +445,27 @@ static int gic_set_affinity(struct irq_data *d, const
> struct cpumask *cpumask, unsigned int irq = GIC_HWIRQ_TO_SHARED(d->hwirq);
> cpumask_t tmp = CPU_MASK_NONE;
> unsigned long flags;
> - int i;
> + int i, cpu;
>
> cpumask_and(&tmp, cpumask, cpu_online_mask);
> if (cpumask_empty(&tmp))
> return -EINVAL;
>
> + cpu = cpumask_first(&tmp);
> +
> /* Assumption : cpumask refers to a single CPU */
> spin_lock_irqsave(&gic_lock, flags);
>
> /* Re-route this IRQ */
> - gic_map_to_vpe(irq, mips_cm_vp_id(cpumask_first(&tmp)));
> + gic_map_to_vpe(irq, mips_cm_vp_id(cpu));
>
> /* Update the pcpu_masks */
> for (i = 0; i < min(gic_vpes, NR_CPUS); i++)
> clear_bit(irq, pcpu_masks[i].pcpu_mask);
> - set_bit(irq, pcpu_masks[cpumask_first(&tmp)].pcpu_mask);
> + set_bit(irq, pcpu_masks[cpu].pcpu_mask);
>
> cpumask_copy(irq_data_get_affinity_mask(d), cpumask);
> - irq_data_update_effective_affinity(d, cpumask);
> + irq_data_update_effective_affinity(d, cpumask_of(cpu));
> spin_unlock_irqrestore(&gic_lock, flags);
>
> return IRQ_SET_MASK_OK_NOCOPY;
>
> Thanks,
>
> M.
That looks better (though patch 37 of my "irqchip: mips-gic: Cleanup &
optimisation" series would get you that cpu variable already ;) ).
Thanks,
Paul
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2017-08-15 16:48 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-15 11:34 [PATCH 00/12] genirq/irqchip: Effective affinity fixups Marc Zyngier
2017-08-15 11:34 ` [PATCH 01/12] genirq: Restrict effective affinity to single-target interrupts Marc Zyngier
2017-08-15 12:01 ` Thomas Gleixner
2017-08-15 12:18 ` Marc Zyngier
2017-08-15 11:34 ` [PATCH 02/12] genirq/proc: Use the the accessor to report the effective affinity Marc Zyngier
2017-08-15 11:34 ` [PATCH 03/12] irqchip/gic: Report that effective affinity is a single target Marc Zyngier
2017-08-15 11:34 ` [PATCH 04/12] irqchip/gic-v3: " Marc Zyngier
2017-08-15 11:34 ` [PATCH 05/12] irqchip/gic-v3-its: " Marc Zyngier
2017-08-15 11:34 ` [PATCH 06/12] irqchip/armada-370-xp: " Marc Zyngier
2017-08-15 11:34 ` [PATCH 07/12] irqchip/bcm-6345-l1: " Marc Zyngier
2017-08-15 11:34 ` [PATCH 08/12] irqchip/bcm-7038-l1: " Marc Zyngier
2017-08-15 11:34 ` [PATCH 09/12] irqchip/metag-ext: " Marc Zyngier
2017-08-15 11:34 ` [PATCH 10/12] irqchip/hip04: " Marc Zyngier
2017-08-15 11:34 ` [PATCH 11/12] irqchip/mips-gic: " Marc Zyngier
2017-08-15 16:23 ` Paul Burton
2017-08-15 16:44 ` Marc Zyngier
2017-08-15 16:48 ` Paul Burton
2017-08-15 11:34 ` [PATCH 12/12] irqchip/xtensa-mx: " Marc Zyngier
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.