linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: stable@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Rashmica Gupta <rashmica.g@gmail.com>,
	Michael Ellerman <mpe@ellerman.id.au>,
	Sasha Levin <sashal@kernel.org>
Subject: [PATCH AUTOSEL 4.18 33/45] powerpc/memtrace: Remove memory in chunks
Date: Sun,  4 Nov 2018 08:52:28 -0500	[thread overview]
Message-ID: <20181104135240.88431-33-sashal@kernel.org> (raw)
In-Reply-To: <20181104135240.88431-1-sashal@kernel.org>

From: Rashmica Gupta <rashmica.g@gmail.com>

[ 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 <rashmica.g@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 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 b99283df8584..265669002da0 100644
--- a/arch/powerpc/platforms/powernv/memtrace.c
+++ b/arch/powerpc/platforms/powernv/memtrace.c
@@ -119,17 +119,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;
@@ -142,8 +140,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


  parent reply	other threads:[~2018-11-04 13:53 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-04 13:51 [PATCH AUTOSEL 4.18 01/45] mm: thp: fix MADV_DONTNEED vs migrate_misplaced_transhuge_page race condition Sasha Levin
2018-11-04 13:51 ` [PATCH AUTOSEL 4.18 02/45] mm: thp: fix mmu_notifier in migrate_misplaced_transhuge_page() Sasha Levin
2018-11-04 13:51 ` [PATCH AUTOSEL 4.18 03/45] mm: calculate deferred pages after skipping mirrored memory Sasha Levin
2018-11-04 13:51 ` [PATCH AUTOSEL 4.18 04/45] mm/vmstat.c: assert that vmstat_text is in sync with stat_items_size Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 05/45] userfaultfd: allow get_mempolicy(MPOL_F_NODE|MPOL_F_ADDR) to trigger userfaults Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 06/45] mm: don't miss the last page because of round-off error Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 07/45] mm: don't warn about large allocations for slab Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 08/45] powerpc/traps: restore recoverability of machine_check interrupts Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 09/45] powerpc/64/module: REL32 relocation range check Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 10/45] powerpc/mm: Fix page table dump to work on Radix Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 11/45] powerpc/mm: fix always true/false warning in slice.c Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 12/45] drm/amd/display: fix bug of accessing invalid memory Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 13/45] Input: wm97xx-ts - fix exit path Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 14/45] powerpc/Makefile: Fix PPC_BOOK3S_64 ASFLAGS Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 15/45] powerpc/eeh: Fix possible null deref in eeh_dump_dev_log() Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 16/45] tty: check name length in tty_find_polling_driver() Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 17/45] tracing/kprobes: Check the probe on unloaded module correctly Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 18/45] drm/amdgpu/powerplay: fix missing break in switch statements Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 19/45] ARM: imx_v6_v7_defconfig: Select CONFIG_TMPFS_POSIX_ACL Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 20/45] powerpc/nohash: fix undefined behaviour when testing page size support Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 21/45] powerpc/mm: Don't report hugepage tables as memory leaks when using kmemleak Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 22/45] watchdog: lantiq: update register names to better match spec Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 23/45] drm/omap: fix memory barrier bug in DMM driver Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 24/45] iio: adc: at91: fix wrong channel number in triggered buffer mode Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 25/45] iio: adc: at91: fix acking DRDY irq on simple conversions Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 26/45] drm/amd/display: fix gamma not being applied Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 27/45] drm/hisilicon: hibmc: Do not carry error code in HiBMC framebuffer pointer Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 28/45] media: pci: cx23885: handle adding to list failure Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 29/45] media: coda: don't overwrite h.264 profile_idc on decoder instance Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 30/45] iio: adc: imx25-gcq: Fix leak of device_node in mx25_gcq_setup_cfgs() Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 31/45] MIPS: kexec: Mark CPU offline before disabling local IRQ Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 32/45] powerpc/boot: Ensure _zimage_start is a weak symbol Sasha Levin
2018-11-04 13:52 ` Sasha Levin [this message]
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 34/45] MIPS/PCI: Call pcie_bus_configure_settings() to set MPS/MRRS Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 35/45] sc16is7xx: Fix for multi-channel stall Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 36/45] media: tvp5150: fix width alignment during set_selection() Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 37/45] powerpc/selftests: Wait all threads to join Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 38/45] staging:iio:ad7606: fix voltage scales Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 39/45] drm: rcar-du: Update Gen3 output limitations Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 40/45] drm/amdgpu: Fix SDMA TO after GPU reset v3 Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 41/45] staging: most: video: fix registration of an empty comp core_component Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 42/45] 9p locks: fix glock.client_id leak in do_lock Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 43/45] udf: Prevent write-unsupported filesystem to be remounted read-write Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 44/45] ARM: dts: imx6ull: keep IMX6UL_ prefix for signals on both i.MX6UL and i.MX6ULL Sasha Levin
2018-11-04 13:52 ` [PATCH AUTOSEL 4.18 45/45] 9p: clear dangling pointers in p9stat_free Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181104135240.88431-33-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mpe@ellerman.id.au \
    --cc=rashmica.g@gmail.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).