Skip to content

Commit 04e9576

Browse files
vittyvkjgross1
authored andcommitted
x86/xen: split xen_smp_intr_init()/xen_smp_intr_free()
xen_smp_intr_init() and xen_smp_intr_free() have PV-specific code and as a praparatory change to splitting smp.c we need to split these fucntions. Create xen_smp_intr_init_pv()/xen_smp_intr_free_pv(). Signed-off-by: Vitaly Kuznetsov <[email protected]> Reviewed-by: Juergen Gross <[email protected]> Signed-off-by: Juergen Gross <[email protected]>
1 parent e1dab14 commit 04e9576

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

arch/x86/xen/enlighten_pv.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,12 +1477,21 @@ static int xen_cpu_up_prepare_pv(unsigned int cpu)
14771477
cpu, rc);
14781478
return rc;
14791479
}
1480+
1481+
rc = xen_smp_intr_init_pv(cpu);
1482+
if (rc) {
1483+
WARN(1, "xen_smp_intr_init_pv() for CPU %d failed: %d\n",
1484+
cpu, rc);
1485+
return rc;
1486+
}
1487+
14801488
return 0;
14811489
}
14821490

14831491
static int xen_cpu_dead_pv(unsigned int cpu)
14841492
{
14851493
xen_smp_intr_free(cpu);
1494+
xen_smp_intr_free_pv(cpu);
14861495

14871496
xen_teardown_timer(cpu);
14881497

arch/x86/xen/smp.c

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,10 @@ void xen_smp_intr_free(unsigned int cpu)
133133
kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
134134
per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
135135
}
136-
if (xen_hvm_domain())
137-
return;
136+
}
138137

138+
void xen_smp_intr_free_pv(unsigned int cpu)
139+
{
139140
if (per_cpu(xen_irq_work, cpu).irq >= 0) {
140141
unbind_from_irqhandler(per_cpu(xen_irq_work, cpu).irq, NULL);
141142
per_cpu(xen_irq_work, cpu).irq = -1;
@@ -149,11 +150,12 @@ void xen_smp_intr_free(unsigned int cpu)
149150
kfree(per_cpu(xen_pmu_irq, cpu).name);
150151
per_cpu(xen_pmu_irq, cpu).name = NULL;
151152
}
152-
};
153+
}
154+
153155
int xen_smp_intr_init(unsigned int cpu)
154156
{
155157
int rc;
156-
char *resched_name, *callfunc_name, *debug_name, *pmu_name;
158+
char *resched_name, *callfunc_name, *debug_name;
157159

158160
resched_name = kasprintf(GFP_KERNEL, "resched%d", cpu);
159161
rc = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR,
@@ -200,12 +202,17 @@ int xen_smp_intr_init(unsigned int cpu)
200202
per_cpu(xen_callfuncsingle_irq, cpu).irq = rc;
201203
per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
202204

203-
/*
204-
* The IRQ worker on PVHVM goes through the native path and uses the
205-
* IPI mechanism.
206-
*/
207-
if (xen_hvm_domain())
208-
return 0;
205+
return 0;
206+
207+
fail:
208+
xen_smp_intr_free(cpu);
209+
return rc;
210+
}
211+
212+
int xen_smp_intr_init_pv(unsigned int cpu)
213+
{
214+
int rc;
215+
char *callfunc_name, *pmu_name;
209216

210217
callfunc_name = kasprintf(GFP_KERNEL, "irqwork%d", cpu);
211218
rc = bind_ipi_to_irqhandler(XEN_IRQ_WORK_VECTOR,
@@ -234,7 +241,7 @@ int xen_smp_intr_init(unsigned int cpu)
234241
return 0;
235242

236243
fail:
237-
xen_smp_intr_free(cpu);
244+
xen_smp_intr_free_pv(cpu);
238245
return rc;
239246
}
240247

arch/x86/xen/smp.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ extern void xen_send_IPI_self(int vector);
1111

1212
extern int xen_smp_intr_init(unsigned int cpu);
1313
extern void xen_smp_intr_free(unsigned int cpu);
14+
int xen_smp_intr_init_pv(unsigned int cpu);
15+
void xen_smp_intr_free_pv(unsigned int cpu);
1416

1517
#else /* CONFIG_SMP */
1618

@@ -19,6 +21,12 @@ static inline int xen_smp_intr_init(unsigned int cpu)
1921
return 0;
2022
}
2123
static inline void xen_smp_intr_free(unsigned int cpu) {}
24+
25+
static inline int xen_smp_intr_init_pv(unsigned int cpu)
26+
{
27+
return 0;
28+
}
29+
static inline void xen_smp_intr_free_pv(unsigned int cpu) {}
2230
#endif /* CONFIG_SMP */
2331

2432
#endif

0 commit comments

Comments
 (0)