From patchwork Mon Mar 20 00:12:48 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haozhong Zhang X-Patchwork-Id: 9632919 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 59A296020B for ; Mon, 20 Mar 2017 00:18:06 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4D1ED27F60 for ; Mon, 20 Mar 2017 00:18:06 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 41EFF27F9F; Mon, 20 Mar 2017 00:18:06 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 7A09827F60 for ; Mon, 20 Mar 2017 00:18:05 +0000 (UTC) Received: from localhost ([::1]:58660 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cpl1Q-0000RF-GD for patchwork-qemu-devel@patchwork.kernel.org; Sun, 19 Mar 2017 20:18:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58293) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cpkwr-0005EQ-Tk for qemu-devel@nongnu.org; Sun, 19 Mar 2017 20:13:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cpkwq-0004yX-KN for qemu-devel@nongnu.org; Sun, 19 Mar 2017 20:13:21 -0400 Received: from mga03.intel.com ([134.134.136.65]:51743) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cpkwq-0004uJ-8I for qemu-devel@nongnu.org; Sun, 19 Mar 2017 20:13:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=intel.com; i=@intel.com; q=dns/txt; s=intel; t=1489968800; x=1521504800; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=tWbGmkXnBr/yuLZF2MbtBrwE0rs9/SOeA9mswqhoSNM=; b=oLDuFF6zw9A6xWnTPr863VuAXxmS+MtW0YCfI312gddqRUH0Pc5G1gbp vxmvTNs3OKSBKvYT0Mul1GDZtsBXvg==; Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Mar 2017 17:13:19 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,191,1486454400"; d="scan'208";a="78799207" Received: from hz-desktop.sh.intel.com (HELO localhost) ([10.239.159.153]) by fmsmga006.fm.intel.com with ESMTP; 19 Mar 2017 17:13:17 -0700 From: Haozhong Zhang To: qemu-devel@nongnu.org, xen-devel@lists.xen.org Date: Mon, 20 Mar 2017 08:12:48 +0800 Message-Id: <20170320001249.25521-10-haozhong.zhang@intel.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20170320001249.25521-1-haozhong.zhang@intel.com> References: <20170320001249.25521-1-haozhong.zhang@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.65 Subject: [Qemu-devel] [RFC QEMU PATCH v2 09/10] xen-hvm: create hotplug memory region on Xen X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Haozhong Zhang , Stefano Stabellini , Eduardo Habkost , "Michael S. Tsirkin" , xen-devel@lists.xenproject.org, Paolo Bonzini , Anthony Perard , Konrad Rzeszutek Wilk , Dan Williams , Richard Henderson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP The current QEMU implementation allocates guest physical address for vNVDIMM in the hotplug memory region, which was not created when QEMU is used as Xen device model. Reuse existing code in i386/pc.c to create the hotplug memory region for HVM domain on Xen, so that we can reuse other parts of NVDIMM implementation with minor modifications. Signed-off-by: Haozhong Zhang --- Cc: Paolo Bonzini Cc: Richard Henderson Cc: Eduardo Habkost Cc: "Michael S. Tsirkin" Cc: Stefano Stabellini Cc: Anthony Perard Cc: xen-devel@lists.xenproject.org --- hw/i386/pc.c | 82 ++++++++++++++++++++++++++++------------------------ include/hw/i386/pc.h | 1 + xen-hvm.c | 2 ++ 3 files changed, 47 insertions(+), 38 deletions(-) diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 6b76720c35..4ea6baa613 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -1356,6 +1356,49 @@ void xen_load_linux(PCMachineState *pcms) pcms->fw_cfg = fw_cfg; } +void pc_memory_hotplug_init(PCMachineState *pcms, MemoryRegion *system_memory) +{ + MachineState *machine = MACHINE(pcms); + PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms); + ram_addr_t hotplug_mem_size = machine->maxram_size - machine->ram_size;; + + if (!pcmc->has_reserved_memory || machine->ram_size >= machine->maxram_size) + return; + + if (machine->ram_slots > ACPI_MAX_RAM_SLOTS) { + error_report("unsupported amount of memory slots: %"PRIu64, + machine->ram_slots); + exit(EXIT_FAILURE); + } + + if (QEMU_ALIGN_UP(machine->maxram_size, + TARGET_PAGE_SIZE) != machine->maxram_size) { + error_report("maximum memory size must by aligned to multiple of " + "%d bytes", TARGET_PAGE_SIZE); + exit(EXIT_FAILURE); + } + + pcms->hotplug_memory.base = + ROUND_UP(0x100000000ULL + pcms->above_4g_mem_size, 1ULL << 30); + + if (pcmc->enforce_aligned_dimm) { + /* size hotplug region assuming 1G page max alignment per slot */ + hotplug_mem_size += (1ULL << 30) * machine->ram_slots; + } + + if ((pcms->hotplug_memory.base + hotplug_mem_size) < + hotplug_mem_size) { + error_report("unsupported amount of maximum memory: " RAM_ADDR_FMT, + machine->maxram_size); + exit(EXIT_FAILURE); + } + + memory_region_init(&pcms->hotplug_memory.mr, OBJECT(pcms), + "hotplug-memory", hotplug_mem_size); + memory_region_add_subregion(system_memory, pcms->hotplug_memory.base, + &pcms->hotplug_memory.mr); +} + void pc_memory_init(PCMachineState *pcms, MemoryRegion *system_memory, MemoryRegion *rom_memory, @@ -1407,44 +1450,7 @@ void pc_memory_init(PCMachineState *pcms, } /* initialize hotplug memory address space */ - if (pcmc->has_reserved_memory && - (machine->ram_size < machine->maxram_size)) { - ram_addr_t hotplug_mem_size = - machine->maxram_size - machine->ram_size; - - if (machine->ram_slots > ACPI_MAX_RAM_SLOTS) { - error_report("unsupported amount of memory slots: %"PRIu64, - machine->ram_slots); - exit(EXIT_FAILURE); - } - - if (QEMU_ALIGN_UP(machine->maxram_size, - TARGET_PAGE_SIZE) != machine->maxram_size) { - error_report("maximum memory size must by aligned to multiple of " - "%d bytes", TARGET_PAGE_SIZE); - exit(EXIT_FAILURE); - } - - pcms->hotplug_memory.base = - ROUND_UP(0x100000000ULL + pcms->above_4g_mem_size, 1ULL << 30); - - if (pcmc->enforce_aligned_dimm) { - /* size hotplug region assuming 1G page max alignment per slot */ - hotplug_mem_size += (1ULL << 30) * machine->ram_slots; - } - - if ((pcms->hotplug_memory.base + hotplug_mem_size) < - hotplug_mem_size) { - error_report("unsupported amount of maximum memory: " RAM_ADDR_FMT, - machine->maxram_size); - exit(EXIT_FAILURE); - } - - memory_region_init(&pcms->hotplug_memory.mr, OBJECT(pcms), - "hotplug-memory", hotplug_mem_size); - memory_region_add_subregion(system_memory, pcms->hotplug_memory.base, - &pcms->hotplug_memory.mr); - } + pc_memory_hotplug_init(pcms, system_memory); /* Initialize PC system firmware */ pc_system_firmware_init(rom_memory, !pcmc->pci_enabled); diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index f278b3ae89..7f0b3bc648 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -259,6 +259,7 @@ void pc_memory_init(PCMachineState *pcms, MemoryRegion *system_memory, MemoryRegion *rom_memory, MemoryRegion **ram_memory); +void pc_memory_hotplug_init(PCMachineState *pcms, MemoryRegion *system_memory); qemu_irq pc_allocate_cpu_irq(void); DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus); void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi, diff --git a/xen-hvm.c b/xen-hvm.c index 0c36dd11da..79cf871a53 100644 --- a/xen-hvm.c +++ b/xen-hvm.c @@ -252,6 +252,8 @@ static void xen_ram_init(PCMachineState *pcms, pcms->above_4g_mem_size); memory_region_add_subregion(sysmem, 0x100000000ULL, &ram_hi); } + + pc_memory_hotplug_init(pcms, sysmem); } void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size, MemoryRegion *mr,