From patchwork Fri Feb 6 08:58:25 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Han, Weidong" X-Patchwork-Id: 5851 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n168whQl029253 for ; Fri, 6 Feb 2009 08:58:43 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752956AbZBFI6b (ORCPT ); Fri, 6 Feb 2009 03:58:31 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752691AbZBFI6a (ORCPT ); Fri, 6 Feb 2009 03:58:30 -0500 Received: from mga02.intel.com ([134.134.136.20]:18292 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753050AbZBFI63 (ORCPT ); Fri, 6 Feb 2009 03:58:29 -0500 Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP; 06 Feb 2009 00:54:19 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.37,390,1231142400"; d="scan'208,223";a="487811223" Received: from unknown (HELO azsmsx601.amr.corp.intel.com) ([10.2.121.193]) by orsmga001.jf.intel.com with ESMTP; 06 Feb 2009 00:58:17 -0800 Received: from pdsmsx601.ccr.corp.intel.com (172.16.12.94) by azsmsx601.amr.corp.intel.com (10.2.121.193) with Microsoft SMTP Server (TLS) id 8.1.311.2; Fri, 6 Feb 2009 01:58:27 -0700 Received: from pdsmsx503.ccr.corp.intel.com ([172.16.12.95]) by pdsmsx601.ccr.corp.intel.com ([172.16.12.94]) with mapi; Fri, 6 Feb 2009 16:58:26 +0800 From: "Han, Weidong" To: "'Avi Kivity'" CC: "'kvm@vger.kernel.org'" Date: Fri, 6 Feb 2009 16:58:25 +0800 Subject: [PATCH 2/3] [RESEND] kvm: qemu: fix leak of ioperm data Thread-Topic: [PATCH 2/3] [RESEND] kvm: qemu: fix leak of ioperm data Thread-Index: AcmIORIfBziRNwK8QICftEo9EoLqGg== Message-ID: <715D42877B251141A38726ABF5CABF2C01957E5A51@pdsmsx503.ccr.corp.intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: acceptlanguage: en-US MIME-Version: 1.0 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org implement kvm_remove_ioperm_data to free ioperm data, and call it in free_assigned_device to avoid leak. Signed-off-by: Weidong Han Acked-by: Mark McLoughlin --- qemu/hw/device-assignment.c | 2 ++ qemu/qemu-kvm.c | 17 +++++++++++++++++ qemu/qemu-kvm.h | 1 + 3 files changed, 20 insertions(+), 0 deletions(-) diff --git a/qemu/hw/device-assignment.c b/qemu/hw/device-assignment.c index 5003611..82ff00a 100644 --- a/qemu/hw/device-assignment.c +++ b/qemu/hw/device-assignment.c @@ -457,6 +457,8 @@ void free_assigned_device(AssignedDevInfo *adev) if (!pci_region->valid || !(pci_region->type & IORESOURCE_MEM)) continue; + kvm_remove_ioperm_data(region->u.r_baseport, region->r_size); + if (region->u.r_virtbase) { int ret = munmap(region->u.r_virtbase, (pci_region->size + 0xFFF) & 0xFFFFF000); diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c index 5ff63ad..f14237e 100644 --- a/qemu/qemu-kvm.c +++ b/qemu/qemu-kvm.c @@ -1329,6 +1329,23 @@ void kvm_add_ioperm_data(struct ioperm_data *data) LIST_INSERT_HEAD(&ioperm_head, data, entries); } +void kvm_remove_ioperm_data(unsigned long start_port, unsigned long num) +{ + struct ioperm_data *data; + + data = LIST_FIRST(&ioperm_head); + while (data) { + struct ioperm_data *next = LIST_NEXT(data, entries); + + if (data->start_port == start_port && data->num == num) { + LIST_REMOVE(data, entries); + qemu_free(data); + } + + data = next; + } +} + void kvm_ioperm(CPUState *env, void *data) { if (kvm_enabled() && qemu_system_ready) diff --git a/qemu/qemu-kvm.h b/qemu/qemu-kvm.h index 042dd93..e7acd2e 100644 --- a/qemu/qemu-kvm.h +++ b/qemu/qemu-kvm.h @@ -127,6 +127,7 @@ struct ioperm_data; void kvm_ioperm(CPUState *env, void *data); void kvm_add_ioperm_data(struct ioperm_data *data); +void kvm_remove_ioperm_data(unsigned long start_port, unsigned long num); void kvm_arch_do_ioperm(void *_data); #endif