|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v3 26/39] xen/riscv: introduce arch_move_irqs()
When migrating a vCPU between pCPUs the hypervisor must also migrate
the associated virtual interrupt state. arch_move_irqs() is the
per-arch hook called by generic code to trigger that.
Replace the static inline BUG_ON placeholder in asm/irq.h with a real
implementation in intc.c dispatching through a new move_irqs vintc_ops
callback. Wire it up in vAPLIC, which delegates to imsic_migrate_vcpu(),
only a stub for now.
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Baptiste Le Duc <baptiste.le-duc@xxxxxxxxxx>
---
Changes in v3:
- Update the commit message: drop the two last paragraphs as they are
stale.
- Add Acked-by: Jan Beulich <jbeulich@xxxxxxxx>.
- Add Reviewed-by: Baptiste Le Duc <baptiste.le-duc@xxxxxxxxxx>.
---
Changes in v2:
- New patch.
---
---
xen/arch/riscv/imsic.c | 5 +++++
xen/arch/riscv/include/asm/imsic.h | 2 ++
xen/arch/riscv/include/asm/intc.h | 3 +++
xen/arch/riscv/include/asm/irq.h | 5 +----
xen/arch/riscv/intc.c | 8 ++++++++
xen/arch/riscv/vaplic.c | 1 +
6 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/xen/arch/riscv/imsic.c b/xen/arch/riscv/imsic.c
index d633f59db20d..c5fcdcf13b00 100644
--- a/xen/arch/riscv/imsic.c
+++ b/xen/arch/riscv/imsic.c
@@ -690,3 +690,8 @@ int __init vimsic_make_domu_dt_node(struct kernel_info
*kinfo,
return fdt_end_node(fdt);
}
+
+void imsic_migrate_vcpu(struct vcpu *v)
+{
+ BUG_ON("unimplemented");
+}
diff --git a/xen/arch/riscv/include/asm/imsic.h
b/xen/arch/riscv/include/asm/imsic.h
index 5463fb4c31b2..22ce90e2e9b3 100644
--- a/xen/arch/riscv/include/asm/imsic.h
+++ b/xen/arch/riscv/include/asm/imsic.h
@@ -99,4 +99,6 @@ int vimsic_make_domu_dt_node(struct kernel_info *kinfo,
unsigned int *phandle);
void imsic_ctxt_switch_from(struct vcpu *p);
void imsic_ctxt_switch_to(struct vcpu *n);
+void imsic_migrate_vcpu(struct vcpu *v);
+
#endif /* ASM_RISCV_IMSIC_H */
diff --git a/xen/arch/riscv/include/asm/intc.h
b/xen/arch/riscv/include/asm/intc.h
index 59e12f3d3c6d..a22b46dae06c 100644
--- a/xen/arch/riscv/include/asm/intc.h
+++ b/xen/arch/riscv/include/asm/intc.h
@@ -70,6 +70,9 @@ struct vintc_ops {
/* Restore vINTC state of the vCPU being switched in */
void (*ctxt_switch_to)(struct vcpu *n);
+
+ /* Move interrupts of vCPU to a different pCPU */
+ void (*move_irqs)(struct vcpu *v);
};
struct vintc {
diff --git a/xen/arch/riscv/include/asm/irq.h b/xen/arch/riscv/include/asm/irq.h
index 57e814d90cf4..311af1d16fbb 100644
--- a/xen/arch/riscv/include/asm/irq.h
+++ b/xen/arch/riscv/include/asm/irq.h
@@ -41,10 +41,7 @@ struct irq_desc *irq_to_desc(unsigned int irq);
struct cpu_user_regs;
struct dt_device_node;
-static inline void arch_move_irqs(struct vcpu *v)
-{
- BUG_ON("unimplemented");
-}
+void arch_move_irqs(struct vcpu *v);
int platform_get_irq(const struct dt_device_node *device, int index);
diff --git a/xen/arch/riscv/intc.c b/xen/arch/riscv/intc.c
index 53ba2b04ab53..a51eec251563 100644
--- a/xen/arch/riscv/intc.c
+++ b/xen/arch/riscv/intc.c
@@ -192,3 +192,11 @@ void vintc_ctxt_switch_to(struct vcpu *n)
ops->ctxt_switch_to(n);
}
+
+/* Move vCPU's IRQs from one pCPU to another */
+void arch_move_irqs(struct vcpu *v)
+{
+ const struct vintc_ops *ops = v->domain->arch.vintc->ops;
+
+ ops->move_irqs(v);
+}
diff --git a/xen/arch/riscv/vaplic.c b/xen/arch/riscv/vaplic.c
index 4d87fdb5be42..601b79aae430 100644
--- a/xen/arch/riscv/vaplic.c
+++ b/xen/arch/riscv/vaplic.c
@@ -462,6 +462,7 @@ static const struct vintc_ops vintc_ops = {
*/
.ctxt_switch_from = imsic_ctxt_switch_from,
.ctxt_switch_to = imsic_ctxt_switch_to,
+ .move_irqs = imsic_migrate_vcpu,
};
int domain_vaplic_init(struct domain *d)
--
2.55.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |