Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04e95761 authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Juergen Gross
Browse files

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: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Reviewed-by: default avatarJuergen Gross <jgross@suse.com>
Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
parent e1dab14c
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -1477,12 +1477,21 @@ static int xen_cpu_up_prepare_pv(unsigned int cpu)
		     cpu, rc);
		     cpu, rc);
		return rc;
		return rc;
	}
	}

	rc = xen_smp_intr_init_pv(cpu);
	if (rc) {
		WARN(1, "xen_smp_intr_init_pv() for CPU %d failed: %d\n",
		     cpu, rc);
		return rc;
	}

	return 0;
	return 0;
}
}


static int xen_cpu_dead_pv(unsigned int cpu)
static int xen_cpu_dead_pv(unsigned int cpu)
{
{
	xen_smp_intr_free(cpu);
	xen_smp_intr_free(cpu);
	xen_smp_intr_free_pv(cpu);


	xen_teardown_timer(cpu);
	xen_teardown_timer(cpu);


+18 −11
Original line number Original line Diff line number Diff line
@@ -133,9 +133,10 @@ void xen_smp_intr_free(unsigned int cpu)
		kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
		kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
		per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
		per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
	}
	}
	if (xen_hvm_domain())
}
		return;


void xen_smp_intr_free_pv(unsigned int cpu)
{
	if (per_cpu(xen_irq_work, cpu).irq >= 0) {
	if (per_cpu(xen_irq_work, cpu).irq >= 0) {
		unbind_from_irqhandler(per_cpu(xen_irq_work, cpu).irq, NULL);
		unbind_from_irqhandler(per_cpu(xen_irq_work, cpu).irq, NULL);
		per_cpu(xen_irq_work, cpu).irq = -1;
		per_cpu(xen_irq_work, cpu).irq = -1;
@@ -149,11 +150,12 @@ void xen_smp_intr_free(unsigned int cpu)
		kfree(per_cpu(xen_pmu_irq, cpu).name);
		kfree(per_cpu(xen_pmu_irq, cpu).name);
		per_cpu(xen_pmu_irq, cpu).name = NULL;
		per_cpu(xen_pmu_irq, cpu).name = NULL;
	}
	}
};
}

int xen_smp_intr_init(unsigned int cpu)
int xen_smp_intr_init(unsigned int cpu)
{
{
	int rc;
	int rc;
	char *resched_name, *callfunc_name, *debug_name, *pmu_name;
	char *resched_name, *callfunc_name, *debug_name;


	resched_name = kasprintf(GFP_KERNEL, "resched%d", cpu);
	resched_name = kasprintf(GFP_KERNEL, "resched%d", cpu);
	rc = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR,
	rc = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR,
@@ -200,13 +202,18 @@ int xen_smp_intr_init(unsigned int cpu)
	per_cpu(xen_callfuncsingle_irq, cpu).irq = rc;
	per_cpu(xen_callfuncsingle_irq, cpu).irq = rc;
	per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
	per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;


	/*
	 * The IRQ worker on PVHVM goes through the native path and uses the
	 * IPI mechanism.
	 */
	if (xen_hvm_domain())
	return 0;
	return 0;


 fail:
	xen_smp_intr_free(cpu);
	return rc;
}

int xen_smp_intr_init_pv(unsigned int cpu)
{
	int rc;
	char *callfunc_name, *pmu_name;

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


 fail:
 fail:
	xen_smp_intr_free(cpu);
	xen_smp_intr_free_pv(cpu);
	return rc;
	return rc;
}
}


+8 −0
Original line number Original line Diff line number Diff line
@@ -11,6 +11,8 @@ extern void xen_send_IPI_self(int vector);


extern int xen_smp_intr_init(unsigned int cpu);
extern int xen_smp_intr_init(unsigned int cpu);
extern void xen_smp_intr_free(unsigned int cpu);
extern void xen_smp_intr_free(unsigned int cpu);
int xen_smp_intr_init_pv(unsigned int cpu);
void xen_smp_intr_free_pv(unsigned int cpu);


#else /* CONFIG_SMP */
#else /* CONFIG_SMP */


@@ -19,6 +21,12 @@ static inline int xen_smp_intr_init(unsigned int cpu)
	return 0;
	return 0;
}
}
static inline void xen_smp_intr_free(unsigned int cpu) {}
static inline void xen_smp_intr_free(unsigned int cpu) {}

static inline int xen_smp_intr_init_pv(unsigned int cpu)
{
	return 0;
}
static inline void xen_smp_intr_free_pv(unsigned int cpu) {}
#endif /* CONFIG_SMP */
#endif /* CONFIG_SMP */


#endif
#endif