From patchwork Tue Apr 26 13:19:38 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 732672 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p3QDK4b0030160 for ; Tue, 26 Apr 2011 13:20:05 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755490Ab1DZNUA (ORCPT ); Tue, 26 Apr 2011 09:20:00 -0400 Received: from goliath.siemens.de ([192.35.17.28]:27490 "EHLO goliath.siemens.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755442Ab1DZNTr (ORCPT ); Tue, 26 Apr 2011 09:19:47 -0400 Received: from mail1.siemens.de (localhost [127.0.0.1]) by goliath.siemens.de (8.13.6/8.13.6) with ESMTP id p3QDJfZa006641; Tue, 26 Apr 2011 15:19:41 +0200 Received: from mchn199C.mchp.siemens.de ([139.25.109.49]) by mail1.siemens.de (8.13.6/8.13.6) with ESMTP id p3QDJepJ031993; Tue, 26 Apr 2011 15:19:41 +0200 From: Jan Kiszka To: Avi Kivity , Marcelo Tosatti Cc: kvm@vger.kernel.org, "Michael S. Tsirkin" Subject: [PATCH v2 8/9] qemu-kvm: Refresh MSI settings after vmload Date: Tue, 26 Apr 2011 15:19:38 +0200 Message-Id: <176082c85bcf4fb4b9f114f37bb726eea646d82c.1303823975.git.jan.kiszka@siemens.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: References: In-Reply-To: References: Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Tue, 26 Apr 2011 13:20:05 +0000 (UTC) Establish a post-load notification for the MSI subsystem so that KVM can refresh its IRQ routing after vmload. Signed-off-by: Jan Kiszka --- hw/msi.c | 13 +++++++++++++ hw/msi.h | 1 + hw/pci.c | 2 ++ 3 files changed, 16 insertions(+), 0 deletions(-) diff --git a/hw/msi.c b/hw/msi.c index 18f683b..0cbff17 100644 --- a/hw/msi.c +++ b/hw/msi.c @@ -453,3 +453,16 @@ unsigned int msi_nr_vectors_allocated(const PCIDevice *dev) uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev)); return msi_nr_vectors(flags); } + +void msi_post_load(PCIDevice *dev) +{ + uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev)); + + if (kvm_enabled() && kvm_irqchip_in_kernel()) { + kvm_msi_free(dev); + + if (flags & PCI_MSI_FLAGS_ENABLE) { + kvm_msi_update(dev); + } + } +} diff --git a/hw/msi.h b/hw/msi.h index 5766018..6ff0607 100644 --- a/hw/msi.h +++ b/hw/msi.h @@ -32,6 +32,7 @@ void msi_reset(PCIDevice *dev); void msi_notify(PCIDevice *dev, unsigned int vector); void msi_write_config(PCIDevice *dev, uint32_t addr, uint32_t val, int len); unsigned int msi_nr_vectors_allocated(const PCIDevice *dev); +void msi_post_load(PCIDevice *dev); static inline bool msi_present(const PCIDevice *dev) { diff --git a/hw/pci.c b/hw/pci.c index 82e0300..07ec4f9 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -34,6 +34,7 @@ #include "device-assignment.h" #include "qemu-objects.h" #include "range.h" +#include "msi.h" //#define DEBUG_PCI #ifdef DEBUG_PCI @@ -342,6 +343,7 @@ static int get_pci_config_device(QEMUFile *f, void *pv, size_t size) memcpy(s->config, config, size); pci_update_mappings(s); + msi_post_load(s); qemu_free(config); return 0;