[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 1/4] kvm: Introduce kvm_irqchip_update_msi_route
From: |
Jan Kiszka |
Subject: |
[Qemu-devel] [PATCH 1/4] kvm: Introduce kvm_irqchip_update_msi_route |
Date: |
Mon, 27 Aug 2012 08:28:38 +0200 |
From: Jan Kiszka <address@hidden>
This service allows to update an MSI route without releasing/reacquiring
the associated VIRQ. Will be used by PCI device assignment, later on
likely also by virtio/vhost and VFIO.
Signed-off-by: Jan Kiszka <address@hidden>
---
kvm-all.c | 42 ++++++++++++++++++++++++++++++++++++++++++
kvm.h | 1 +
2 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/kvm-all.c b/kvm-all.c
index d4d8a1f..fd9d9b4 100644
--- a/kvm-all.c
+++ b/kvm-all.c
@@ -963,6 +963,30 @@ static void kvm_add_routing_entry(KVMState *s,
kvm_irqchip_commit_routes(s);
}
+static int kvm_update_routing_entry(KVMState *s,
+ struct kvm_irq_routing_entry *new_entry)
+{
+ struct kvm_irq_routing_entry *entry;
+ int n;
+
+ for (n = 0; n < s->irq_routes->nr; n++) {
+ entry = &s->irq_routes->entries[n];
+ if (entry->gsi != new_entry->gsi) {
+ continue;
+ }
+
+ entry->type = new_entry->type;
+ entry->flags = new_entry->flags;
+ entry->u = new_entry->u;
+
+ kvm_irqchip_commit_routes(s);
+
+ return 0;
+ }
+
+ return -ESRCH;
+}
+
void kvm_irqchip_add_irq_route(KVMState *s, int irq, int irqchip, int pin)
{
struct kvm_irq_routing_entry e;
@@ -1125,6 +1149,24 @@ int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage
msg)
return virq;
}
+int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg)
+{
+ struct kvm_irq_routing_entry kroute;
+
+ if (!kvm_irqchip_in_kernel()) {
+ return -ENOSYS;
+ }
+
+ kroute.gsi = virq;
+ kroute.type = KVM_IRQ_ROUTING_MSI;
+ kroute.flags = 0;
+ kroute.u.msi.address_lo = (uint32_t)msg.address;
+ kroute.u.msi.address_hi = msg.address >> 32;
+ kroute.u.msi.data = msg.data;
+
+ return kvm_update_routing_entry(s, &kroute);
+}
+
static int kvm_irqchip_assign_irqfd(KVMState *s, int fd, int virq, bool assign)
{
struct kvm_irqfd irqfd = {
diff --git a/kvm.h b/kvm.h
index 37d1f81..5cefe3a 100644
--- a/kvm.h
+++ b/kvm.h
@@ -270,6 +270,7 @@ int kvm_set_ioeventfd_mmio(int fd, uint32_t adr, uint32_t
val, bool assign,
int kvm_set_ioeventfd_pio_word(int fd, uint16_t adr, uint16_t val, bool
assign);
int kvm_irqchip_add_msi_route(KVMState *s, MSIMessage msg);
+int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg);
void kvm_irqchip_release_virq(KVMState *s, int virq);
int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n, int virq);
--
1.7.3.4
- [Qemu-devel] [PATCH 0/4] uq/master: Add classic PCI device assignment, Jan Kiszka, 2012/08/27
- [Qemu-devel] [PATCH 1/4] kvm: Introduce kvm_irqchip_update_msi_route,
Jan Kiszka <=
- [Qemu-devel] [PATCH 2/4] kvm: Introduce kvm_has_intx_set_mask, Jan Kiszka, 2012/08/27
- [Qemu-devel] [PATCH 3/4] kvm: i386: Add services required for PCI device assignment, Jan Kiszka, 2012/08/27
- [Qemu-devel] [PATCH 4/4] kvm: i386: Add classic PCI device assignment, Jan Kiszka, 2012/08/27
- Re: [Qemu-devel] [PATCH 4/4] kvm: i386: Add classic PCI device assignment, Andreas Färber, 2012/08/27
- Re: [Qemu-devel] [PATCH 4/4] kvm: i386: Add classic PCI device assignment, Jan Kiszka, 2012/08/27
- Re: [Qemu-devel] [PATCH 4/4] kvm: i386: Add classic PCI device assignment, Peter Maydell, 2012/08/28
- Re: [Qemu-devel] [PATCH 4/4] kvm: i386: Add classic PCI device assignment, Jan Kiszka, 2012/08/29
- Re: [Qemu-devel] [PATCH 4/4] kvm: i386: Add classic PCI device assignment, Peter Maydell, 2012/08/29
- Re: [Qemu-devel] [PATCH 4/4] kvm: i386: Add classic PCI device assignment, Jan Kiszka, 2012/08/29
- Re: [Qemu-devel] [PATCH 4/4] kvm: i386: Add classic PCI device assignment, Anthony Liguori, 2012/08/28