Skip to content

Commit 705b089

Browse files
author
Fox Snowpatch
committed
1 parent a85c72f commit 705b089

File tree

9 files changed

+35
-101
lines changed

9 files changed

+35
-101
lines changed

arch/arm/kernel/machine_kexec.c

-23
Original file line numberDiff line numberDiff line change
@@ -127,29 +127,6 @@ void crash_smp_send_stop(void)
127127
cpus_stopped = 1;
128128
}
129129

130-
static void machine_kexec_mask_interrupts(void)
131-
{
132-
unsigned int i;
133-
struct irq_desc *desc;
134-
135-
for_each_irq_desc(i, desc) {
136-
struct irq_chip *chip;
137-
138-
chip = irq_desc_get_chip(desc);
139-
if (!chip)
140-
continue;
141-
142-
if (chip->irq_eoi && irqd_irq_inprogress(&desc->irq_data))
143-
chip->irq_eoi(&desc->irq_data);
144-
145-
if (chip->irq_mask)
146-
chip->irq_mask(&desc->irq_data);
147-
148-
if (chip->irq_disable && !irqd_irq_disabled(&desc->irq_data))
149-
chip->irq_disable(&desc->irq_data);
150-
}
151-
}
152-
153130
void machine_crash_shutdown(struct pt_regs *regs)
154131
{
155132
local_irq_disable();

arch/arm64/kernel/machine_kexec.c

-31
Original file line numberDiff line numberDiff line change
@@ -207,37 +207,6 @@ void machine_kexec(struct kimage *kimage)
207207
BUG(); /* Should never get here. */
208208
}
209209

210-
static void machine_kexec_mask_interrupts(void)
211-
{
212-
unsigned int i;
213-
struct irq_desc *desc;
214-
215-
for_each_irq_desc(i, desc) {
216-
struct irq_chip *chip;
217-
int ret;
218-
219-
chip = irq_desc_get_chip(desc);
220-
if (!chip)
221-
continue;
222-
223-
/*
224-
* First try to remove the active state. If this
225-
* fails, try to EOI the interrupt.
226-
*/
227-
ret = irq_set_irqchip_state(i, IRQCHIP_STATE_ACTIVE, false);
228-
229-
if (ret && irqd_irq_inprogress(&desc->irq_data) &&
230-
chip->irq_eoi)
231-
chip->irq_eoi(&desc->irq_data);
232-
233-
if (chip->irq_mask)
234-
chip->irq_mask(&desc->irq_data);
235-
236-
if (chip->irq_disable && !irqd_irq_disabled(&desc->irq_data))
237-
chip->irq_disable(&desc->irq_data);
238-
}
239-
}
240-
241210
/**
242211
* machine_crash_shutdown - shutdown non-crashing cpus and save registers
243212
*/

arch/powerpc/include/asm/kexec.h

-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ struct pt_regs;
6161
extern void kexec_smp_wait(void); /* get and clear naca physid, wait for
6262
master to copy new code to 0 */
6363
extern void default_machine_kexec(struct kimage *image);
64-
extern void machine_kexec_mask_interrupts(void);
6564

6665
void relocate_new_kernel(unsigned long indirection_page, unsigned long reboot_code_buffer,
6766
unsigned long start_address) __noreturn;

arch/powerpc/kexec/core.c

-22
Original file line numberDiff line numberDiff line change
@@ -22,28 +22,6 @@
2222
#include <asm/setup.h>
2323
#include <asm/firmware.h>
2424

25-
void machine_kexec_mask_interrupts(void) {
26-
unsigned int i;
27-
struct irq_desc *desc;
28-
29-
for_each_irq_desc(i, desc) {
30-
struct irq_chip *chip;
31-
32-
chip = irq_desc_get_chip(desc);
33-
if (!chip)
34-
continue;
35-
36-
if (chip->irq_eoi && irqd_irq_inprogress(&desc->irq_data))
37-
chip->irq_eoi(&desc->irq_data);
38-
39-
if (chip->irq_mask)
40-
chip->irq_mask(&desc->irq_data);
41-
42-
if (chip->irq_disable && !irqd_irq_disabled(&desc->irq_data))
43-
chip->irq_disable(&desc->irq_data);
44-
}
45-
}
46-
4725
#ifdef CONFIG_CRASH_DUMP
4826
void machine_crash_shutdown(struct pt_regs *regs)
4927
{

arch/riscv/kernel/machine_kexec.c

-23
Original file line numberDiff line numberDiff line change
@@ -114,29 +114,6 @@ void machine_shutdown(void)
114114
#endif
115115
}
116116

117-
static void machine_kexec_mask_interrupts(void)
118-
{
119-
unsigned int i;
120-
struct irq_desc *desc;
121-
122-
for_each_irq_desc(i, desc) {
123-
struct irq_chip *chip;
124-
125-
chip = irq_desc_get_chip(desc);
126-
if (!chip)
127-
continue;
128-
129-
if (chip->irq_eoi && irqd_irq_inprogress(&desc->irq_data))
130-
chip->irq_eoi(&desc->irq_data);
131-
132-
if (chip->irq_mask)
133-
chip->irq_mask(&desc->irq_data);
134-
135-
if (chip->irq_disable && !irqd_irq_disabled(&desc->irq_data))
136-
chip->irq_disable(&desc->irq_data);
137-
}
138-
}
139-
140117
/*
141118
* machine_crash_shutdown - Prepare to kexec after a kernel crash
142119
*

include/linux/irq.h

+3
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,9 @@ extern int irq_chip_request_resources_parent(struct irq_data *data);
694694
extern void irq_chip_release_resources_parent(struct irq_data *data);
695695
#endif
696696

697+
/* Shut down the interrupt */
698+
extern void irq_shutdown(struct irq_desc *desc);
699+
697700
/* Handling of unhandled and spurious interrupts: */
698701
extern void note_interrupt(struct irq_desc *desc, irqreturn_t action_ret);
699702

include/linux/kexec.h

+2
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,8 @@ extern void machine_kexec(struct kimage *image);
375375
extern int machine_kexec_prepare(struct kimage *image);
376376
extern void machine_kexec_cleanup(struct kimage *image);
377377
extern int kernel_kexec(void);
378+
extern void machine_kexec_mask_interrupts(void);
379+
378380
extern struct page *kimage_alloc_control_pages(struct kimage *image,
379381
unsigned int order);
380382

kernel/irq/internals.h

-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ extern int irq_activate(struct irq_desc *desc);
8888
extern int irq_activate_and_startup(struct irq_desc *desc, bool resend);
8989
extern int irq_startup(struct irq_desc *desc, bool resend, bool force);
9090

91-
extern void irq_shutdown(struct irq_desc *desc);
9291
extern void irq_shutdown_and_deactivate(struct irq_desc *desc);
9392
extern void irq_enable(struct irq_desc *desc);
9493
extern void irq_disable(struct irq_desc *desc);

kernel/kexec_core.c

+30
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
#include <linux/hugetlb.h>
4141
#include <linux/objtool.h>
4242
#include <linux/kmsg_dump.h>
43+
#include <linux/irqdesc.h>
44+
#include <linux/irq.h>
4345

4446
#include <asm/page.h>
4547
#include <asm/sections.h>
@@ -1072,3 +1074,31 @@ int kernel_kexec(void)
10721074
kexec_unlock();
10731075
return error;
10741076
}
1077+
1078+
void machine_kexec_mask_interrupts(void)
1079+
{
1080+
unsigned int i;
1081+
struct irq_desc *desc;
1082+
1083+
for_each_irq_desc(i, desc) {
1084+
struct irq_chip *chip;
1085+
int check_eoi = 1;
1086+
1087+
chip = irq_desc_get_chip(desc);
1088+
if (!chip || !irqd_is_started(&desc->irq_data))
1089+
continue;
1090+
1091+
if (IS_ENABLED(CONFIG_ARM64)) {
1092+
/*
1093+
* First try to remove the active state. If this fails, try to EOI the
1094+
* interrupt.
1095+
*/
1096+
check_eoi = irq_set_irqchip_state(i, IRQCHIP_STATE_ACTIVE, false);
1097+
}
1098+
1099+
if (check_eoi && chip->irq_eoi && irqd_irq_inprogress(&desc->irq_data))
1100+
chip->irq_eoi(&desc->irq_data);
1101+
1102+
irq_shutdown(desc);
1103+
}
1104+
}

0 commit comments

Comments
 (0)