Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp1601081imd; Sun, 4 Nov 2018 06:07:15 -0800 (PST) X-Google-Smtp-Source: AJdET5cydeuO4uuZSE30Vj93PBk/c84JZFFWx59MHFpSas7cVuYMm6PlJGV9eHlc8tH9XU2nne4H X-Received: by 2002:a63:c24c:: with SMTP id l12mr17095520pgg.146.1541340435037; Sun, 04 Nov 2018 06:07:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541340435; cv=none; d=google.com; s=arc-20160816; b=derMk1Qzv2HGO8V594MOGIk6Wr2fdtR+WT4DcfJb1vxOOv98pu/oF4dL1Z3F63clZ5 N7pKaQnIHkH9pkM1upUxFA6MOJhGwP70Ao7yjkU1T5tZsI3Bu6LB69LF3ihDQVk/VG3F Rl9INvWynpgGbkrIFuPvhusdwqPYY1uhsO8BhYCiZHExb3VDACIgRFonGF7eIbuBQzlF GFGzyybzXSed8h4Up8iU4vpvx3+LUtR5D0xorLxSIxrxENEKPqwll/HmC6VJTABps2p4 lCf8h/ge8TyiBvWIJPeg5ksLVAc42s91nrzq3pLuiH1LP31ruQLXQnKEz2L+Ofij1Wkg xVlg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=QhDzEn3G1RvatpAKGS6wcvUNhzYAaGKW2WVCtn8AKqk=; b=qcaEt4TBFua6fc4K3lKi2b25oRUJ950zMb2QejT8UBYCnHOXyrBM8TCdoqaCcIrmpD UxIDkPZTeSarFHIpgVRVnx5ViOYCj1JstrzDoPfWSPYAbXvQVoDhvnLpRxu2YVM7zawa AzUDmo05Mvvp6ZxAtsxtziS8L4ZF4L5WB5dw39jZZoIwCLhSRVSTlnirTiLWnSbdu3du EiZ5fm8GTqoS/5oPyQp0Fnno5gTW0CtfX21MiRoovGFC0wA08tR09182P1wh7dIhopgw sXFRvITfGdkUDuAYRri7efJXsssUhZGP+01hfSOKNwedvS+AwEN+wcfhG2Er/VSJOpV+ i7nA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Y0Kag5ty; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c1-v6si16802327pld.11.2018.11.04.06.07.00; Sun, 04 Nov 2018 06:07:14 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Y0Kag5ty; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730357AbeKDXH3 (ORCPT + 99 others); Sun, 4 Nov 2018 18:07:29 -0500 Received: from mail.kernel.org ([198.145.29.99]:45296 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730312AbeKDXH3 (ORCPT ); Sun, 4 Nov 2018 18:07:29 -0500 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7F2DC2086C; Sun, 4 Nov 2018 13:52:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1541339545; bh=f9Fwt7wArCsQhl23jOfutLii1mm7ZDNb+2+6udC2SQU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Y0Kag5tynrJBgS7FR4rNDtcJVT1Vat4N69xA/u8lV45lUhQAPouMxKqGo+FHPr4yk duzEVISu7NOxJyKVwYTwh2wAT6PsfEtVnKeV0du4rX37NFwevJkKHnbs3Sy5lQjYJd QlnMiaUj2ITJUqH2rEc1ZbxmLZ3MX8ci7T2E93Kw= From: Sasha Levin To: stable@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Rashmica Gupta , Michael Ellerman , Sasha Levin Subject: [PATCH AUTOSEL 4.19 40/57] powerpc/memtrace: Remove memory in chunks Date: Sun, 4 Nov 2018 08:51:27 -0500 Message-Id: <20181104135144.88324-40-sashal@kernel.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181104135144.88324-1-sashal@kernel.org> References: <20181104135144.88324-1-sashal@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Rashmica Gupta [ Upstream commit 3f7daf3d7582dc6628ac40a9045dd1bbd80c5f35 ] When hot-removing memory release_mem_region_adjustable() splits iomem resources if they are not the exact size of the memory being hot-deleted. Adding this memory back to the kernel adds a new resource. Eg a node has memory 0x0 - 0xfffffffff. Hot-removing 1GB from 0xf40000000 results in the single resource 0x0-0xfffffffff being split into two resources: 0x0-0xf3fffffff and 0xf80000000-0xfffffffff. When we hot-add the memory back we now have three resources: 0x0-0xf3fffffff, 0xf40000000-0xf7fffffff, and 0xf80000000-0xfffffffff. This is an issue if we try to remove some memory that overlaps resources. Eg when trying to remove 2GB at address 0xf40000000, release_mem_region_adjustable() fails as it expects the chunk of memory to be within the boundaries of a single resource. We then get the warning: "Unable to release resource" and attempting to use memtrace again gives us this error: "bash: echo: write error: Resource temporarily unavailable" This patch makes memtrace remove memory in chunks that are always the same size from an address that is always equal to end_of_memory - n*size, for some n. So hotremoving and hotadding memory of different sizes will now not attempt to remove memory that spans multiple resources. Signed-off-by: Rashmica Gupta Signed-off-by: Michael Ellerman Signed-off-by: Sasha Levin --- arch/powerpc/platforms/powernv/memtrace.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/arch/powerpc/platforms/powernv/memtrace.c b/arch/powerpc/platforms/powernv/memtrace.c index 51dc398ae3f7..a29fdf8a2e56 100644 --- a/arch/powerpc/platforms/powernv/memtrace.c +++ b/arch/powerpc/platforms/powernv/memtrace.c @@ -90,17 +90,15 @@ static bool memtrace_offline_pages(u32 nid, u64 start_pfn, u64 nr_pages) walk_memory_range(start_pfn, end_pfn, (void *)MEM_OFFLINE, change_memblock_state); - lock_device_hotplug(); - remove_memory(nid, start_pfn << PAGE_SHIFT, nr_pages << PAGE_SHIFT); - unlock_device_hotplug(); return true; } static u64 memtrace_alloc_node(u32 nid, u64 size) { - u64 start_pfn, end_pfn, nr_pages; + u64 start_pfn, end_pfn, nr_pages, pfn; u64 base_pfn; + u64 bytes = memory_block_size_bytes(); if (!node_spanned_pages(nid)) return 0; @@ -113,8 +111,21 @@ static u64 memtrace_alloc_node(u32 nid, u64 size) end_pfn = round_down(end_pfn - nr_pages, nr_pages); for (base_pfn = end_pfn; base_pfn > start_pfn; base_pfn -= nr_pages) { - if (memtrace_offline_pages(nid, base_pfn, nr_pages) == true) + if (memtrace_offline_pages(nid, base_pfn, nr_pages) == true) { + /* + * Remove memory in memory block size chunks so that + * iomem resources are always split to the same size and + * we never try to remove memory that spans two iomem + * resources. + */ + lock_device_hotplug(); + end_pfn = base_pfn + nr_pages; + for (pfn = base_pfn; pfn < end_pfn; pfn += bytes>> PAGE_SHIFT) { + remove_memory(nid, pfn << PAGE_SHIFT, bytes); + } + unlock_device_hotplug(); return base_pfn << PAGE_SHIFT; + } } return 0; -- 2.17.1