From patchwork Mon Apr 26 18:50:55 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcelo Tosatti X-Patchwork-Id: 50997 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id C67D2B7D41 for ; Tue, 27 Apr 2010 04:55:06 +1000 (EST) Received: from localhost ([127.0.0.1]:37287 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O6TSR-0006kY-2A for incoming@patchwork.ozlabs.org; Mon, 26 Apr 2010 14:55:03 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1O6TOw-0003Si-Dr for qemu-devel@nongnu.org; Mon, 26 Apr 2010 14:51:26 -0400 Received: from [140.186.70.92] (port=38367 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1O6TOu-0003Q6-Mv for qemu-devel@nongnu.org; Mon, 26 Apr 2010 14:51:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1O6TOr-0007ke-Ld for qemu-devel@nongnu.org; Mon, 26 Apr 2010 14:51:24 -0400 Received: from mx1.redhat.com ([209.132.183.28]:23720) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1O6TOr-0007kQ-D1 for qemu-devel@nongnu.org; Mon, 26 Apr 2010 14:51:21 -0400 Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o3QIpImD024509 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 26 Apr 2010 14:51:18 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o3QIpHVm029173; Mon, 26 Apr 2010 14:51:18 -0400 Received: from amt.cnet (vpn-8-113.rdu.redhat.com [10.11.8.113]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id o3QIpGQt011550; Mon, 26 Apr 2010 14:51:16 -0400 Received: from amt.cnet (amt.cnet [127.0.0.1]) by amt.cnet (Postfix) with ESMTP id 4216068A0C9; Mon, 26 Apr 2010 15:50:59 -0300 (BRT) Received: (from marcelo@localhost) by amt.cnet (8.14.3/8.14.3/Submit) id o3QIoukt024636; Mon, 26 Apr 2010 15:50:56 -0300 Date: Mon, 26 Apr 2010 15:50:55 -0300 From: Marcelo Tosatti To: Anthony Liguori Message-ID: <20100426185055.GG21425@amt.cnet> References: <2e085c19aac78e6c4335eac4fffeb5cfca4bbb26.1272304746.git.mtosatti@redhat.com> <4BD5DB72.3030707@codemonkey.ws> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <4BD5DB72.3030707@codemonkey.ws> User-Agent: Mutt/1.5.20 (2009-08-17) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.16 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. Cc: Anthony Liguori , Cam Macdonell , qemu-devel@nongnu.org, kvm@vger.kernel.org Subject: [Qemu-devel] Re: [PATCH 10/10] introduce qemu_ram_map X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org On Mon, Apr 26, 2010 at 01:29:06PM -0500, Anthony Liguori wrote: > On 04/26/2010 12:59 PM, Marcelo Tosatti wrote: > >Which allows drivers to register an mmaped region into ram block mappings. > >To be used by device assignment driver. > > > > This is not kvm specific and not required by this pull request so it > shouldn't really be part of the pull. Something like this should > only be added when there's an actual consumer. The user will be hw/device-assignment.c in qemu-kvm. And also Cam has the need for a similar interface for shared memory drivers. Index: qemu-kvm/hw/device-assignment.c =================================================================== --- qemu-kvm.orig/hw/device-assignment.c 2010-04-22 16:21:30.000000000 -0400 +++ qemu-kvm/hw/device-assignment.c 2010-04-22 17:36:57.000000000 -0400 @@ -256,10 +256,7 @@ AssignedDevice *r_dev = container_of(pci_dev, AssignedDevice, dev); AssignedDevRegion *region = &r_dev->v_addrs[region_num]; PCIRegion *real_region = &r_dev->real_device.regions[region_num]; - pcibus_t old_ephys = region->e_physbase; - pcibus_t old_esize = region->e_size; - int first_map = (region->e_size == 0); - int ret = 0; + int ret = 0, flags = 0; DEBUG("e_phys=%08" FMT_PCIBUS " r_virt=%p type=%d len=%08" FMT_PCIBUS " region_num=%d \n", e_phys, region->u.r_virtbase, type, e_size, region_num); @@ -267,30 +264,22 @@ region->e_physbase = e_phys; region->e_size = e_size; - if (!first_map) - kvm_destroy_phys_mem(kvm_context, old_ephys, - TARGET_PAGE_ALIGN(old_esize)); - if (e_size > 0) { + + if (region_num == PCI_ROM_SLOT) + flags |= IO_MEM_ROM; + + cpu_register_physical_memory(e_phys, e_size, region->memory_index | flags); + /* deal with MSI-X MMIO page */ if (real_region->base_addr <= r_dev->msix_table_addr && real_region->base_addr + real_region->size >= r_dev->msix_table_addr) { int offset = r_dev->msix_table_addr - real_region->base_addr; - ret = munmap(region->u.r_virtbase + offset, TARGET_PAGE_SIZE); - if (ret == 0) - DEBUG("munmap done, virt_base 0x%p\n", - region->u.r_virtbase + offset); - else { - fprintf(stderr, "%s: fail munmap msix table!\n", __func__); - exit(1); - } + cpu_register_physical_memory(e_phys + offset, TARGET_PAGE_SIZE, r_dev->mmio_index); } - ret = kvm_register_phys_mem(kvm_context, e_phys, - region->u.r_virtbase, - TARGET_PAGE_ALIGN(e_size), 0); } if (ret != 0) { @@ -539,6 +528,15 @@ pci_dev->v_addrs[i].u.r_virtbase += (cur_region->base_addr & 0xFFF); + + if (!slow_map) { + void *virtbase = pci_dev->v_addrs[i].u.r_virtbase; + + pci_dev->v_addrs[i].memory_index = qemu_ram_map(cur_region->size, + virtbase); + } else + pci_dev->v_addrs[i].memory_index = 0; + pci_register_bar((PCIDevice *) pci_dev, i, cur_region->size, t, slow_map ? assigned_dev_iomem_map_slow @@ -726,10 +724,6 @@ kvm_remove_ioperm_data(region->u.r_baseport, region->r_size); continue; } else if (pci_region->type & IORESOURCE_MEM) { - if (region->e_size > 0) - kvm_destroy_phys_mem(kvm_context, region->e_physbase, - TARGET_PAGE_ALIGN(region->e_size)); - if (region->u.r_virtbase) { int ret = munmap(region->u.r_virtbase, (pci_region->size + 0xFFF) & 0xFFFFF000); Index: qemu-kvm/hw/device-assignment.h =================================================================== --- qemu-kvm.orig/hw/device-assignment.h 2010-04-22 16:21:30.000000000 -0400 +++ qemu-kvm/hw/device-assignment.h 2010-04-22 16:24:32.000000000 -0400 @@ -63,7 +63,7 @@ typedef struct { pcibus_t e_physbase; - uint32_t memory_index; + ram_addr_t memory_index; union { void *r_virtbase; /* mmapped access address for memory regions */ uint32_t r_baseport; /* the base guest port for I/O regions */