提交 d01d3274 编写于 作者: D Davidlohr Bueso 提交者: Marc Zyngier

irqchip/gic: Update supports_deactivate static key to modern api

No changes in semantics -- key init is true; replace

static_key_slow_dec       with   static_branch_disable
static_key_true           with   static_branch_likely

The first is because we never actually do any couterpart incs,
thus there is really no reference counting semantics going on.
Use the more proper static_branch_disable() construct.

Also added a '_key' suffix to supports_deactivate, for better
self documentation.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jason Cooper <jason@lakedaemon.net>
Signed-off-by: NDavidlohr Bueso <dbueso@suse.de>
Signed-off-by: NMarc Zyngier <marc.zyngier@arm.com>
上级 6eb486b6
...@@ -61,7 +61,7 @@ struct gic_chip_data { ...@@ -61,7 +61,7 @@ struct gic_chip_data {
}; };
static struct gic_chip_data gic_data __read_mostly; static struct gic_chip_data gic_data __read_mostly;
static struct static_key supports_deactivate = STATIC_KEY_INIT_TRUE; static DEFINE_STATIC_KEY_TRUE(supports_deactivate_key);
static struct gic_kvm_info gic_v3_kvm_info; static struct gic_kvm_info gic_v3_kvm_info;
static DEFINE_PER_CPU(bool, has_rss); static DEFINE_PER_CPU(bool, has_rss);
...@@ -354,7 +354,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs ...@@ -354,7 +354,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs
if (likely(irqnr > 15 && irqnr < 1020) || irqnr >= 8192) { if (likely(irqnr > 15 && irqnr < 1020) || irqnr >= 8192) {
int err; int err;
if (static_key_true(&supports_deactivate)) if (static_branch_likely(&supports_deactivate_key))
gic_write_eoir(irqnr); gic_write_eoir(irqnr);
else else
isb(); isb();
...@@ -362,7 +362,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs ...@@ -362,7 +362,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs
err = handle_domain_irq(gic_data.domain, irqnr, regs); err = handle_domain_irq(gic_data.domain, irqnr, regs);
if (err) { if (err) {
WARN_ONCE(true, "Unexpected interrupt received!\n"); WARN_ONCE(true, "Unexpected interrupt received!\n");
if (static_key_true(&supports_deactivate)) { if (static_branch_likely(&supports_deactivate_key)) {
if (irqnr < 8192) if (irqnr < 8192)
gic_write_dir(irqnr); gic_write_dir(irqnr);
} else { } else {
...@@ -373,7 +373,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs ...@@ -373,7 +373,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs
} }
if (irqnr < 16) { if (irqnr < 16) {
gic_write_eoir(irqnr); gic_write_eoir(irqnr);
if (static_key_true(&supports_deactivate)) if (static_branch_likely(&supports_deactivate_key))
gic_write_dir(irqnr); gic_write_dir(irqnr);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* /*
...@@ -576,7 +576,7 @@ static void gic_cpu_sys_reg_init(void) ...@@ -576,7 +576,7 @@ static void gic_cpu_sys_reg_init(void)
*/ */
gic_write_bpr1(0); gic_write_bpr1(0);
if (static_key_true(&supports_deactivate)) { if (static_branch_likely(&supports_deactivate_key)) {
/* EOI drops priority only (mode 1) */ /* EOI drops priority only (mode 1) */
gic_write_ctlr(ICC_CTLR_EL1_EOImode_drop); gic_write_ctlr(ICC_CTLR_EL1_EOImode_drop);
} else { } else {
...@@ -884,7 +884,7 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq, ...@@ -884,7 +884,7 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
{ {
struct irq_chip *chip = &gic_chip; struct irq_chip *chip = &gic_chip;
if (static_key_true(&supports_deactivate)) if (static_branch_likely(&supports_deactivate_key))
chip = &gic_eoimode1_chip; chip = &gic_eoimode1_chip;
/* SGIs are private to the core kernel */ /* SGIs are private to the core kernel */
...@@ -1075,9 +1075,9 @@ static int __init gic_init_bases(void __iomem *dist_base, ...@@ -1075,9 +1075,9 @@ static int __init gic_init_bases(void __iomem *dist_base,
int err; int err;
if (!is_hyp_mode_available()) if (!is_hyp_mode_available())
static_key_slow_dec(&supports_deactivate); static_branch_disable(&supports_deactivate_key);
if (static_key_true(&supports_deactivate)) if (static_branch_likely(&supports_deactivate_key))
pr_info("GIC: Using split EOI/Deactivate mode\n"); pr_info("GIC: Using split EOI/Deactivate mode\n");
gic_data.fwnode = handle; gic_data.fwnode = handle;
...@@ -1312,7 +1312,7 @@ static int __init gic_of_init(struct device_node *node, struct device_node *pare ...@@ -1312,7 +1312,7 @@ static int __init gic_of_init(struct device_node *node, struct device_node *pare
gic_populate_ppi_partitions(node); gic_populate_ppi_partitions(node);
if (static_key_true(&supports_deactivate)) if (static_branch_likely(&supports_deactivate_key))
gic_of_setup_kvm_info(node); gic_of_setup_kvm_info(node);
return 0; return 0;
...@@ -1614,7 +1614,7 @@ gic_acpi_init(struct acpi_subtable_header *header, const unsigned long end) ...@@ -1614,7 +1614,7 @@ gic_acpi_init(struct acpi_subtable_header *header, const unsigned long end)
acpi_set_irq_model(ACPI_IRQ_MODEL_GIC, domain_handle); acpi_set_irq_model(ACPI_IRQ_MODEL_GIC, domain_handle);
if (static_key_true(&supports_deactivate)) if (static_branch_likely(&supports_deactivate_key))
gic_acpi_setup_kvm_info(); gic_acpi_setup_kvm_info();
return 0; return 0;
......
...@@ -121,7 +121,7 @@ static DEFINE_RAW_SPINLOCK(cpu_map_lock); ...@@ -121,7 +121,7 @@ static DEFINE_RAW_SPINLOCK(cpu_map_lock);
#define NR_GIC_CPU_IF 8 #define NR_GIC_CPU_IF 8
static u8 gic_cpu_map[NR_GIC_CPU_IF] __read_mostly; static u8 gic_cpu_map[NR_GIC_CPU_IF] __read_mostly;
static struct static_key supports_deactivate = STATIC_KEY_INIT_TRUE; static DEFINE_STATIC_KEY_TRUE(supports_deactivate_key);
static struct gic_chip_data gic_data[CONFIG_ARM_GIC_MAX_NR] __read_mostly; static struct gic_chip_data gic_data[CONFIG_ARM_GIC_MAX_NR] __read_mostly;
...@@ -361,7 +361,7 @@ static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) ...@@ -361,7 +361,7 @@ static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
irqnr = irqstat & GICC_IAR_INT_ID_MASK; irqnr = irqstat & GICC_IAR_INT_ID_MASK;
if (likely(irqnr > 15 && irqnr < 1020)) { if (likely(irqnr > 15 && irqnr < 1020)) {
if (static_key_true(&supports_deactivate)) if (static_branch_likely(&supports_deactivate_key))
writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI); writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);
isb(); isb();
handle_domain_irq(gic->domain, irqnr, regs); handle_domain_irq(gic->domain, irqnr, regs);
...@@ -369,7 +369,7 @@ static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) ...@@ -369,7 +369,7 @@ static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
} }
if (irqnr < 16) { if (irqnr < 16) {
writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI); writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);
if (static_key_true(&supports_deactivate)) if (static_branch_likely(&supports_deactivate_key))
writel_relaxed(irqstat, cpu_base + GIC_CPU_DEACTIVATE); writel_relaxed(irqstat, cpu_base + GIC_CPU_DEACTIVATE);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
/* /*
...@@ -466,7 +466,7 @@ static void gic_cpu_if_up(struct gic_chip_data *gic) ...@@ -466,7 +466,7 @@ static void gic_cpu_if_up(struct gic_chip_data *gic)
u32 mode = 0; u32 mode = 0;
int i; int i;
if (gic == &gic_data[0] && static_key_true(&supports_deactivate)) if (gic == &gic_data[0] && static_branch_likely(&supports_deactivate_key))
mode = GIC_CPU_CTRL_EOImodeNS; mode = GIC_CPU_CTRL_EOImodeNS;
if (gic_check_gicv2(cpu_base)) if (gic_check_gicv2(cpu_base))
...@@ -1219,11 +1219,11 @@ static int __init __gic_init_bases(struct gic_chip_data *gic, ...@@ -1219,11 +1219,11 @@ static int __init __gic_init_bases(struct gic_chip_data *gic,
"irqchip/arm/gic:starting", "irqchip/arm/gic:starting",
gic_starting_cpu, NULL); gic_starting_cpu, NULL);
set_handle_irq(gic_handle_irq); set_handle_irq(gic_handle_irq);
if (static_key_true(&supports_deactivate)) if (static_branch_likely(&supports_deactivate_key))
pr_info("GIC: Using split EOI/Deactivate mode\n"); pr_info("GIC: Using split EOI/Deactivate mode\n");
} }
if (static_key_true(&supports_deactivate) && gic == &gic_data[0]) { if (static_branch_likely(&supports_deactivate_key) && gic == &gic_data[0]) {
name = kasprintf(GFP_KERNEL, "GICv2"); name = kasprintf(GFP_KERNEL, "GICv2");
gic_init_chip(gic, NULL, name, true); gic_init_chip(gic, NULL, name, true);
} else { } else {
...@@ -1250,7 +1250,7 @@ void __init gic_init(unsigned int gic_nr, int irq_start, ...@@ -1250,7 +1250,7 @@ void __init gic_init(unsigned int gic_nr, int irq_start,
* Non-DT/ACPI systems won't run a hypervisor, so let's not * Non-DT/ACPI systems won't run a hypervisor, so let's not
* bother with these... * bother with these...
*/ */
static_key_slow_dec(&supports_deactivate); static_branch_disable(&supports_deactivate_key);
gic = &gic_data[gic_nr]; gic = &gic_data[gic_nr];
gic->raw_dist_base = dist_base; gic->raw_dist_base = dist_base;
...@@ -1430,7 +1430,7 @@ static void __init gic_of_setup_kvm_info(struct device_node *node) ...@@ -1430,7 +1430,7 @@ static void __init gic_of_setup_kvm_info(struct device_node *node)
if (ret) if (ret)
return; return;
if (static_key_true(&supports_deactivate)) if (static_branch_likely(&supports_deactivate_key))
gic_set_kvm_info(&gic_v2_kvm_info); gic_set_kvm_info(&gic_v2_kvm_info);
} }
...@@ -1457,7 +1457,7 @@ gic_of_init(struct device_node *node, struct device_node *parent) ...@@ -1457,7 +1457,7 @@ gic_of_init(struct device_node *node, struct device_node *parent)
* or the CPU interface is too small. * or the CPU interface is too small.
*/ */
if (gic_cnt == 0 && !gic_check_eoimode(node, &gic->raw_cpu_base)) if (gic_cnt == 0 && !gic_check_eoimode(node, &gic->raw_cpu_base))
static_key_slow_dec(&supports_deactivate); static_branch_disable(&supports_deactivate_key);
ret = __gic_init_bases(gic, -1, &node->fwnode); ret = __gic_init_bases(gic, -1, &node->fwnode);
if (ret) { if (ret) {
...@@ -1638,7 +1638,7 @@ static int __init gic_v2_acpi_init(struct acpi_subtable_header *header, ...@@ -1638,7 +1638,7 @@ static int __init gic_v2_acpi_init(struct acpi_subtable_header *header,
* interface will always be the right size. * interface will always be the right size.
*/ */
if (!is_hyp_mode_available()) if (!is_hyp_mode_available())
static_key_slow_dec(&supports_deactivate); static_branch_disable(&supports_deactivate_key);
/* /*
* Initialize GIC instance zero (no multi-GIC support). * Initialize GIC instance zero (no multi-GIC support).
...@@ -1663,7 +1663,7 @@ static int __init gic_v2_acpi_init(struct acpi_subtable_header *header, ...@@ -1663,7 +1663,7 @@ static int __init gic_v2_acpi_init(struct acpi_subtable_header *header,
if (IS_ENABLED(CONFIG_ARM_GIC_V2M)) if (IS_ENABLED(CONFIG_ARM_GIC_V2M))
gicv2m_init(NULL, gic_data[0].domain); gicv2m_init(NULL, gic_data[0].domain);
if (static_key_true(&supports_deactivate)) if (static_branch_likely(&supports_deactivate_key))
gic_acpi_setup_kvm_info(); gic_acpi_setup_kvm_info();
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册