From patchwork Fri Oct 9 06:49:59 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bharata B Rao X-Patchwork-Id: 528268 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from eggs.gnu.org (eggs.gnu.org [IPv6:2001:4830:134:3::10]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id DFB32140328 for ; Sat, 10 Oct 2015 02:43:50 +1100 (AEDT) Received: from lists.gnu.org ([208.118.235.17]:36850) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZkZpk-0001EW-Td for incoming@patchwork.ozlabs.org; Fri, 09 Oct 2015 11:43:48 -0400 Received: from localhost ([::1]:39412 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZkZpk-0005Ah-KF for incoming@patchwork.ozlabs.org; Fri, 09 Oct 2015 11:43:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53946) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZkRVQ-0004GS-5g for qemu-devel@nongnu.org; Fri, 09 Oct 2015 02:50:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZkRVM-0000CG-R7 for qemu-devel@nongnu.org; Fri, 09 Oct 2015 02:50:16 -0400 Received: from e28smtp06.in.ibm.com ([122.248.162.6]:43780) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZkRVM-00009i-5Q for qemu-devel@nongnu.org; Fri, 09 Oct 2015 02:50:12 -0400 Received: from /spool/local by e28smtp06.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 9 Oct 2015 12:20:10 +0530 Received: from d28dlp02.in.ibm.com (9.184.220.127) by e28smtp06.in.ibm.com (192.168.1.136) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 9 Oct 2015 12:20:06 +0530 X-Helo: d28dlp02.in.ibm.com X-MailFrom: bharata@linux.vnet.ibm.com X-RcptTo: qemu-devel@nongnu.org Received: from d28relay01.in.ibm.com (d28relay01.in.ibm.com [9.184.220.58]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id 629C63940053 for ; Fri, 9 Oct 2015 12:20:06 +0530 (IST) Received: from d28av04.in.ibm.com (d28av04.in.ibm.com [9.184.220.66]) by d28relay01.in.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t996o4On9109976 for ; Fri, 9 Oct 2015 12:20:05 +0530 Received: from d28av04.in.ibm.com (localhost [127.0.0.1]) by d28av04.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t996o3G7024098 for ; Fri, 9 Oct 2015 12:20:04 +0530 Received: from bharata.in.ibm.com ([9.79.198.111]) by d28av04.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t996o2qM023989; Fri, 9 Oct 2015 12:20:02 +0530 From: Bharata B Rao To: qemu-devel@nongnu.org Date: Fri, 9 Oct 2015 12:19:59 +0530 Message-Id: <1444373400-18423-2-git-send-email-bharata@linux.vnet.ibm.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1444373400-18423-1-git-send-email-bharata@linux.vnet.ibm.com> References: <1444373400-18423-1-git-send-email-bharata@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15100906-0021-0000-0000-000007CCB991 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 122.248.162.6 Cc: imammedo@redhat.com, mst@redhat.com, Bharata B Rao , david@gibson.dropbear.id.au Subject: [Qemu-devel] [RFC v1 1/2] spapr: Accommadate alignment gaps in hotplug memory region X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x Accommodate enough space in hotplug memory region so that it will be possible to align memory in each slot to 256M. When PowerPC memory hotplug enables inter-dimm gaps, then we could end up having unused/unassigned 256M memory chuck between DIMMs in the hotplug memory region. Hence create DRC objects spanning the entire alignment-adjusted hotplug memory region instead of just the acutal hotpluggable size (machine->maxram_size - machine->ram_size). In addition, pass 256M alignment to pc_dimm_memory_plug() so that the DIMM address gets aligned to 256M. Signed-off-by: Bharata B Rao Reviewed-by: Igor Mammedov --- hw/ppc/spapr.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index fc5e7d6..4a901f0 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -721,7 +721,7 @@ static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt) int ret, i, offset; uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE; uint32_t prop_lmb_size[] = {0, cpu_to_be32(lmb_size)}; - uint32_t nr_lmbs = (machine->maxram_size - machine->ram_size)/lmb_size; + uint32_t nr_lmbs = memory_region_size(&spapr->hotplug_memory.mr)/lmb_size; uint32_t *int_buf, *cur_index, buf_len; int nr_nodes = nb_numa_nodes ? nb_numa_nodes : 1; @@ -1614,9 +1614,8 @@ static void spapr_drc_reset(void *opaque) static void spapr_create_lmb_dr_connectors(sPAPRMachineState *spapr) { - MachineState *machine = MACHINE(spapr); uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE; - uint32_t nr_lmbs = (machine->maxram_size - machine->ram_size)/lmb_size; + uint32_t nr_lmbs = memory_region_size(&spapr->hotplug_memory.mr)/lmb_size; int i; for (i = 0; i < nr_lmbs; i++) { @@ -1792,6 +1791,20 @@ static void ppc_spapr_init(MachineState *machine) spapr->hotplug_memory.base = ROUND_UP(machine->ram_size, SPAPR_HOTPLUG_MEM_ALIGN); + + /* + * Ensure that there is enough space in the hotplug memory + * region to support a maximum alignment of 256M per slot. + * Though PowerPC has 16M and 16G huge pages, PowerKVM supports + * only 16M and hence 256M alignment works until we start + * supporting 1G hugepage. + * + * Instead of max hugepage size alignment, we go with 256M + * alignment because we require the DIMM address to be 256M + * aligned as we maintain DRC objects for every 256M memory + * chunk in the hotplug memory region. + */ + hotplug_mem_size += SPAPR_MEMORY_BLOCK_SIZE * machine->ram_slots; memory_region_init(&spapr->hotplug_memory.mr, OBJECT(spapr), "hotplug-memory", hotplug_mem_size); memory_region_add_subregion(sysmem, spapr->hotplug_memory.base, @@ -2114,7 +2127,7 @@ static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev, PCDIMMDevice *dimm = PC_DIMM(dev); PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm); MemoryRegion *mr = ddc->get_memory_region(dimm); - uint64_t align = memory_region_get_alignment(mr); + uint64_t align = SPAPR_MEMORY_BLOCK_SIZE; uint64_t size = memory_region_size(mr); uint64_t addr;