From patchwork Mon Oct 15 15:30:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oscar Salvador X-Patchwork-Id: 10642051 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B0618925 for ; Mon, 15 Oct 2018 15:31:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A048529AF4 for ; Mon, 15 Oct 2018 15:31:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 94BA929B16; Mon, 15 Oct 2018 15:31:00 +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=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DEA2D29AF4 for ; Mon, 15 Oct 2018 15:30:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9B76D6B0006; Mon, 15 Oct 2018 11:30:56 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 923486B000D; Mon, 15 Oct 2018 11:30:56 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7B3356B000C; Mon, 15 Oct 2018 11:30:56 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-wr1-f70.google.com (mail-wr1-f70.google.com [209.85.221.70]) by kanga.kvack.org (Postfix) with ESMTP id 1EBB46B0006 for ; Mon, 15 Oct 2018 11:30:56 -0400 (EDT) Received: by mail-wr1-f70.google.com with SMTP id c16-v6so15959968wrr.8 for ; Mon, 15 Oct 2018 08:30:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=M/8yrxlW200FJawa7Woj1EViIDZtaPHRv0p62rhek+A=; b=My+kZRhBXDzaBpDmo05cvfK6JQHB8phPOeNQZZbrMjNHtB8TF+nb57vVNBxBrj4MCw 1+B9w4U2ZSDozkTnr52pwpGGr7qlpPz4X0rF+Oq53qOQmslum6xmJrls6ubzM7l60Akt jcFP0OmI0z5J2Ok0SJMaSFpULMHOEAGMkDGmkF1ug/a0gYvW91Ht8KDGrbG2FCqCzZWJ e4gLm684HdHZwJAIFzpgVTiULhSM10bl8r/BFb0u5jWM7ukjvjIbDqsjbXcip+tKr8Ge CEXbOEIKbf0JxF4vsV0SnhlD5PLv51HExVycUJlcF3ZrgxAxwrwzCrCak3pzHZcsKnyv EdwA== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Gm-Message-State: ABuFfohh2gPvHzR6Nbew7RAKKy4LrO7nkeoX29O9QtdXQ1OTMygbo7rF 6HwDPCGCpDDyXajwDVxmxWxvBjC1uS8CI2m8SDTd+mRYAQGJXrHrsN8taKA8FW42iaMj83KTziG /gdr9LPWHQd3snfgaWcUsYJXKT4mV0XNIJza6VoWAasdFzRn7uHJh+dD1JKlZvlhS2nqVlVZDs4 YkgrWeobKY/zvvuH2ccNmTRiJSFKFa/ZtJePdPsDdwGKnyZAWG/ieYNxedrfLJ8n9z8s1aaYM71 r0Jem3F1r7suyaO6d44Ck2o3c1bHzVfmf3RovNUsn9DjWEK8xYfQ0XRLUyAbV1doKoULnlVrqRT jw3TztAbh5oTdIDPN0JzHmjhDIjs9GAgmL7pjhS55zXMsaU3+DMcjLbLYoV8iGYVMx6eE/fafg= = X-Received: by 2002:a1c:4b15:: with SMTP id y21-v6mr13309264wma.122.1539617455598; Mon, 15 Oct 2018 08:30:55 -0700 (PDT) X-Received: by 2002:a1c:4b15:: with SMTP id y21-v6mr13309183wma.122.1539617454033; Mon, 15 Oct 2018 08:30:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539617454; cv=none; d=google.com; s=arc-20160816; b=DmLZ5X75RLiYVoNEzn0TVtLJ90uQDNtGLgn2WxRrCWVcCFuv0pC3ZlBkAJGqa66SJi Lxz8qJNlozLk84ZxEgXkmhWSOPCcMwlLYjA/BdkML/GGAe+AUNgS3BUEPY2S5A4XzHB3 Zj+1exiv/JLqTsjUADjts9eN1Aon4wIdb0zjR9hWSltAuxNe5baVNJ223hpUmvmsVNo1 1IqVkdcFQ/nA3qHvXK/Urt9RGN5nPVbKx8ak3y9r7k6Hw9VHDv9/VACBjkpW3GVMaQWg BLmYgjLLLjmRMwYEd1kDmCzQBCZ0wASJTd7zMl1Zonl9Psi5XLh7FpNbxsZSKKYyDft2 6YFA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from; bh=M/8yrxlW200FJawa7Woj1EViIDZtaPHRv0p62rhek+A=; b=teX33KRPrlLL5/WSTeD6xaSdEQCEPHgLPzPn0cST+f2QIL7ZFP5dmmRMkt63a5YMrw G/ZWy441FMU/rf2XF/A8EUHVlhbCGz4qHUtVpfMTqxYmpSlbcv4/cplOm3HAOSdheZ4b l6iBvhb44UMnuHd7l6/AmKyhMyKX/8DLPRR3pDmNS9PITjpDBL0FWwDcStsFCzUOGo2g z301YUURjNWGMJFDsPUVRn/4Nn9ukxINH3uPygMSjtkcYjFqZ51NMvS+41qTRSmoveNB ySkqFypyHuJqKMC/xYpB0gtXXHETs0HFSX+vFaixuINEasw5MgItuqPUaPIjGwVUkVaL guJg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id g4-v6sor6191617wru.17.2018.10.15.08.30.53 for (Google Transport Security); Mon, 15 Oct 2018 08:30:54 -0700 (PDT) Received-SPF: pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Google-Smtp-Source: ACcGV61Sm2BdNFDcCsz9hkSq0WPBtQuZFEC6+homGWRGv1XYJryBQrZu8b6IVh+k03STncx/NJ4Vow== X-Received: by 2002:a05:6000:11c1:: with SMTP id i1mr15300270wrx.310.1539617453584; Mon, 15 Oct 2018 08:30:53 -0700 (PDT) Received: from techadventures.net (techadventures.net. [62.201.165.239]) by smtp.gmail.com with ESMTPSA id e133-v6sm11353053wma.42.2018.10.15.08.30.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Oct 2018 08:30:52 -0700 (PDT) Received: from d104.suse.de (charybdis-ext.suse.de [195.135.221.2]) by techadventures.net (Postfix) with ESMTPA id 88CEF1259A6; Mon, 15 Oct 2018 17:30:51 +0200 (CEST) From: Oscar Salvador To: akpm@linux-foundation.org Cc: mhocko@suse.com, dan.j.williams@intel.com, yasu.isimatu@gmail.com, rppt@linux.vnet.ibm.com, malat@debian.org, linux-kernel@vger.kernel.org, pavel.tatashin@microsoft.com, jglisse@redhat.com, Jonathan.Cameron@huawei.com, rafael@kernel.org, david@redhat.com, dave.jiang@intel.com, linux-mm@kvack.org, alexander.h.duyck@linux.intel.com, Oscar Salvador Subject: [PATCH 1/5] mm/memory_hotplug: Add nid parameter to arch_remove_memory Date: Mon, 15 Oct 2018 17:30:30 +0200 Message-Id: <20181015153034.32203-2-osalvador@techadventures.net> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20181015153034.32203-1-osalvador@techadventures.net> References: <20181015153034.32203-1-osalvador@techadventures.net> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Oscar Salvador This patch is only a preparation for the following-up patches. The idea of passing the nid is that will allow us to get rid of the zone parameter in the patches that follow Signed-off-by: Oscar Salvador Reviewed-by: David Hildenbrand Reviewed-by: Pavel Tatashin --- arch/ia64/mm/init.c | 2 +- arch/powerpc/mm/mem.c | 3 ++- arch/s390/mm/init.c | 2 +- arch/sh/mm/init.c | 2 +- arch/x86/mm/init_32.c | 2 +- arch/x86/mm/init_64.c | 3 ++- include/linux/memory_hotplug.h | 2 +- kernel/memremap.c | 4 +++- mm/hmm.c | 4 +++- mm/memory_hotplug.c | 2 +- 10 files changed, 16 insertions(+), 10 deletions(-) diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index d5e12ff1d73c..904fe55e10fc 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c @@ -661,7 +661,7 @@ int arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap, } #ifdef CONFIG_MEMORY_HOTREMOVE -int arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 5551f5870dcc..6db8f527babb 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -139,7 +139,8 @@ int __meminit arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap * } #ifdef CONFIG_MEMORY_HOTREMOVE -int __meminit arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +int __meminit arch_remove_memory(int nid, u64 start, u64 size, + struct vmem_altmap *altmap) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c index 76d0708438e9..b7503f8b7725 100644 --- a/arch/s390/mm/init.c +++ b/arch/s390/mm/init.c @@ -242,7 +242,7 @@ int arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap, } #ifdef CONFIG_MEMORY_HOTREMOVE -int arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap) { /* * There is no hardware or firmware interface which could trigger a diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index c8c13c777162..a8e5c0e00fca 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c @@ -443,7 +443,7 @@ EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); #endif #ifdef CONFIG_MEMORY_HOTREMOVE -int arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap) { unsigned long start_pfn = PFN_DOWN(start); unsigned long nr_pages = size >> PAGE_SHIFT; diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 49ecf5ecf6d3..85c94f9a87f8 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c @@ -860,7 +860,7 @@ int arch_add_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap, } #ifdef CONFIG_MEMORY_HOTREMOVE -int arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 5fab264948c2..449958da97a4 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -1147,7 +1147,8 @@ kernel_physical_mapping_remove(unsigned long start, unsigned long end) remove_pagetable(start, end, true, NULL); } -int __ref arch_remove_memory(u64 start, u64 size, struct vmem_altmap *altmap) +int __ref arch_remove_memory(int nid, u64 start, u64 size, + struct vmem_altmap *altmap) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 84e9ae205930..786cdfc9a974 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -107,7 +107,7 @@ static inline bool movable_node_is_enabled(void) } #ifdef CONFIG_MEMORY_HOTREMOVE -extern int arch_remove_memory(u64 start, u64 size, +extern int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap); extern int __remove_pages(struct zone *zone, unsigned long start_pfn, unsigned long nr_pages, struct vmem_altmap *altmap); diff --git a/kernel/memremap.c b/kernel/memremap.c index 9eced2cc9f94..c95df6ed2d4a 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -87,6 +87,7 @@ static void devm_memremap_pages_release(void *data) struct resource *res = &pgmap->res; resource_size_t align_start, align_size; unsigned long pfn; + int nid; for_each_device_pfn(pfn, pgmap) put_page(pfn_to_page(pfn)); @@ -100,9 +101,10 @@ static void devm_memremap_pages_release(void *data) align_start = res->start & ~(SECTION_SIZE - 1); align_size = ALIGN(res->start + resource_size(res), SECTION_SIZE) - align_start; + nid = dev_to_node(dev); mem_hotplug_begin(); - arch_remove_memory(align_start, align_size, pgmap->altmap_valid ? + arch_remove_memory(nid, align_start, align_size, pgmap->altmap_valid ? &pgmap->altmap : NULL); kasan_remove_zero_shadow(__va(align_start), align_size); mem_hotplug_done(); diff --git a/mm/hmm.c b/mm/hmm.c index 774d684fa2b4..42d79bcc8aab 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -995,6 +995,7 @@ static void hmm_devmem_release(struct device *dev, void *data) unsigned long start_pfn, npages; struct zone *zone; struct page *page; + int nid; if (percpu_ref_tryget_live(&devmem->ref)) { dev_WARN(dev, "%s: page mapping is still live!\n", __func__); @@ -1007,12 +1008,13 @@ static void hmm_devmem_release(struct device *dev, void *data) page = pfn_to_page(start_pfn); zone = page_zone(page); + nid = zone->zone_pgdat->node_id; mem_hotplug_begin(); if (resource->desc == IORES_DESC_DEVICE_PRIVATE_MEMORY) __remove_pages(zone, start_pfn, npages, NULL); else - arch_remove_memory(start_pfn << PAGE_SHIFT, + arch_remove_memory(nid, start_pfn << PAGE_SHIFT, npages << PAGE_SHIFT, NULL); mem_hotplug_done(); diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index dbbb94547ad0..33d448314b3f 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1875,7 +1875,7 @@ void __ref __remove_memory(int nid, u64 start, u64 size) memblock_free(start, size); memblock_remove(start, size); - arch_remove_memory(start, size, NULL); + arch_remove_memory(nid, start, size, NULL); try_offline_node(nid); From patchwork Mon Oct 15 15:30:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oscar Salvador X-Patchwork-Id: 10642053 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 6EDC2112B for ; Mon, 15 Oct 2018 15:31:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5C14829AF4 for ; Mon, 15 Oct 2018 15:31:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4FF0E29B05; Mon, 15 Oct 2018 15:31:03 +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=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8B81829AF4 for ; Mon, 15 Oct 2018 15:31:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3B5126B000C; Mon, 15 Oct 2018 11:30:57 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 39B7E6B000A; Mon, 15 Oct 2018 11:30:57 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 103ED6B000E; Mon, 15 Oct 2018 11:30:56 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by kanga.kvack.org (Postfix) with ESMTP id 8E25C6B000A for ; Mon, 15 Oct 2018 11:30:56 -0400 (EDT) Received: by mail-wr1-f72.google.com with SMTP id e11-v6so16555819wrr.14 for ; Mon, 15 Oct 2018 08:30:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=LcedzQ9KbwO/uDel+s/QEII3xdfa0hfO6dWQDOtuNKg=; b=APQvNiB3+MB2USk4oqJOpLe1t/p8JcEVMcx2XTYSLxiX3bU8LM4j9JIk2AzbAMKmqb Ko/vR/q8iZ32rcQliMLcG+aGyDxZIDnww3IznQ66eyX9HALeC9YZG5s9+bjTpNuua0jl JuQhcX9FI9RRBf+Oo0OpqnuViETdHzFsAGEQ4+CTbXpngmC5qIqf91sMVFTrFRe40kxW TPH2bp6ay9C5tWmHlxR2ZqG0DHyq7tj9d+AHi0MptrJV9g4GIhFwxYjKEA9+j21GIhZv Aj+9Rd/LR+Xc2mpMpFCwpt3Sx+Zvce18oH9TeRsXQR8WZ7MA6ENOB3HZq3MBf+DOAGXV NU1w== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Gm-Message-State: ABuFfoi9fjhxlmisPyxvF1FCdetvHuCYj0bOWRzb5uJRECbvXJ7tTGcj VMQny5U2q+6ojts/SX5H0Fg0M8vfXFcWu2kV6qpH+8JbV5NHlnex047Nu9/2WNfajHJvJSS9iEP l6BhHPYPRu18Y1KICo16hYkKUspuaYAvF8WevZCP4ayJ7vwWWOMUfoJ4aGICwLBI0Xvnb33AiRL n0pXTWIfod9miI13WQiqsd7SoDxa5ocETBISoHnngdEEMRg54wJFYGUYwVwfJHM4qJ5ohFRnpl9 b/KGQIJLa+IT6uSvB3RqEOb4NqASbloaBvKGM30LPP/do6OQ/mBjDtQiPh0UNqG5IBYXOoFJiKc 5rUbez30rF5701/dK/T3fh/kVEkpwkKQQrhCc2FJcfcrjIUev1/1Kdyf+a54fQTQAKqXT+kRYw= = X-Received: by 2002:adf:8523:: with SMTP id 32-v6mr15627416wrh.72.1539617456037; Mon, 15 Oct 2018 08:30:56 -0700 (PDT) X-Received: by 2002:adf:8523:: with SMTP id 32-v6mr15627342wrh.72.1539617454778; Mon, 15 Oct 2018 08:30:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539617454; cv=none; d=google.com; s=arc-20160816; b=FXsapGS3/gpXqoJO4yMpUrVC51KQ6OhuUcbj2sn/6Y8DwdfDhpzkYLZMrhLfX2dwA0 Foy9+ayQCwoRMzC2CB1XnUqj1IKaiibwi7YK0Y9vaFjQ60VH8f/7B+caCCQNqMqAEKKB ivZOS9T3V6k8n49px120uuo3768CRiBibqQHtxqTeAfwp+4Mtod+HmdOTJ7yur9woADC GjdecDbgw9G5yj80UOD4ZdCNKamlXMgqHRxMU0ptR6qCfXnILNnqQBRsAcK+sHix0k0o RNRojFnhxmr0nYSN9kgdFRK55DiM0ltMZp+h7UUJDeJ8zhsqbQCE0dwK9UE/k2nBQU3C oPKg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from; bh=LcedzQ9KbwO/uDel+s/QEII3xdfa0hfO6dWQDOtuNKg=; b=T4tK8Vh88OT7W9uS9ZZICDoYDGP081EBxJqDWQ4BOpK32SzPXQbMvAuDwYgpe63MiW K3+hdC0grFP5G+NKUBh9jusvV3spOtnhzPFd/BkwuwsxK9TlcMNKd9yZKmjsFlwzztY3 BopW2SrViSUC62xiATtJdfJ/sBzT1lwx2jR4qWu+aNq42hwl0z3ObFb1b7MH7QE6MrX7 /lwtknBjzhFNLyV6kqj3WYzMw0j3KX5Oi+0xjyuq2acuJqA93+KqaVw5KGZOURrsMD9T jAoXh6vs0cg1y+0dlI9NorPqEFbGxC6lwe0BbJnWxLS6xroQOgbrRFu8kcpO3RaEn/kS nFog== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id 52-v6sor6075658wra.30.2018.10.15.08.30.54 for (Google Transport Security); Mon, 15 Oct 2018 08:30:54 -0700 (PDT) Received-SPF: pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Google-Smtp-Source: ACcGV62VjkJMdZfzajn6NL4EUmCICXo7Qqlk5YGPd7/P8ID+nao/J70uqjwIO322xUcznzUwLmMJWA== X-Received: by 2002:adf:c00e:: with SMTP id z14-v6mr14904281wre.268.1539617454236; Mon, 15 Oct 2018 08:30:54 -0700 (PDT) Received: from techadventures.net (techadventures.net. [62.201.165.239]) by smtp.gmail.com with ESMTPSA id e14-v6sm9812528wrt.76.2018.10.15.08.30.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Oct 2018 08:30:52 -0700 (PDT) Received: from d104.suse.de (charybdis-ext.suse.de [195.135.221.2]) by techadventures.net (Postfix) with ESMTPA id F3C211259A7; Mon, 15 Oct 2018 17:30:51 +0200 (CEST) From: Oscar Salvador To: akpm@linux-foundation.org Cc: mhocko@suse.com, dan.j.williams@intel.com, yasu.isimatu@gmail.com, rppt@linux.vnet.ibm.com, malat@debian.org, linux-kernel@vger.kernel.org, pavel.tatashin@microsoft.com, jglisse@redhat.com, Jonathan.Cameron@huawei.com, rafael@kernel.org, david@redhat.com, dave.jiang@intel.com, linux-mm@kvack.org, alexander.h.duyck@linux.intel.com, Oscar Salvador Subject: [PATCH 2/5] mm/memory_hotplug: Create add/del_device_memory functions Date: Mon, 15 Oct 2018 17:30:31 +0200 Message-Id: <20181015153034.32203-3-osalvador@techadventures.net> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20181015153034.32203-1-osalvador@techadventures.net> References: <20181015153034.32203-1-osalvador@techadventures.net> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Oscar Salvador HMM/devm have a particular handling of memory-hotplug. They do not go through the common path, and so, they do not call either offline_pages() or online_pages(). The operations they perform are the following ones: 1) Create the linear mapping in case the memory is not private 2) Initialize the pages and add the sections 3) Move the pages to ZONE_DEVICE Due to this particular handling of hot-add/remove memory from HMM/devm, I think it would be nice to provide a helper function in order to make this cleaner, and not populate other regions with code that should belong to memory-hotplug. The helpers are named: del_device_memory add_device_memory The idea is that add_device_memory will be in charge of: a) call either arch_add_memory() or add_pages(), depending on whether we want a linear mapping b) online the memory sections that correspond to the pfn range c) call move_pfn_range_to_zone() being zone ZONE_DEVICE to expand zone/pgdat spanned pages and initialize its pages del_device_memory, on the other hand, will be in charge of: a) offline the memory sections that correspond to the pfn range b) call shrink_zone_pgdat_pages(), which shrinks node/zone spanned pages. c) call either arch_remove_memory() or __remove_pages(), depending on whether we need to tear down the linear mapping or not The reason behind step b) from add_device_memory() and step a) from del_device_memory is that now find_smallest/biggest_section_pfn will have to check for online sections, and not for valid sections as they used to do, because we call offline_mem_sections() in offline_pages(). In order to split up better the patches and ease the review, this patch will only make a) case work for add_device_memory(), and case c) for del_device_memory. The other cases will be added in the next patch. These two functions have to be called from devm/HMM code: dd_device_memory: - devm_memremap_pages() - hmm_devmem_pages_create() del_device_memory: - hmm_devmem_release - devm_memremap_pages_release One thing I do not know is whether we can move kasan calls out of the hotplug lock or not. If we can, we could move the hotplug lock within add/del_device_memory(). Signed-off-by: Oscar Salvador Reviewed-by: David Hildenbrand Reviewed-by: Pavel Tatashin --- include/linux/memory_hotplug.h | 11 +++++++++++ kernel/memremap.c | 11 ++++------- mm/hmm.c | 33 +++++++++++++++++---------------- mm/memory_hotplug.c | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 23 deletions(-) diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 786cdfc9a974..cf014d5edbb2 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -111,8 +111,19 @@ extern int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap); extern int __remove_pages(struct zone *zone, unsigned long start_pfn, unsigned long nr_pages, struct vmem_altmap *altmap); + +#ifdef CONFIG_ZONE_DEVICE +extern int del_device_memory(int nid, unsigned long start, unsigned long size, + struct vmem_altmap *altmap, bool private_mem); +#endif + #endif /* CONFIG_MEMORY_HOTREMOVE */ +#ifdef CONFIG_ZONE_DEVICE +extern int add_device_memory(int nid, unsigned long start, unsigned long size, + struct vmem_altmap *altmap, bool private_mem); +#endif + /* reasonably generic interface to expand the physical pages */ extern int __add_pages(int nid, unsigned long start_pfn, unsigned long nr_pages, struct vmem_altmap *altmap, bool want_memblock); diff --git a/kernel/memremap.c b/kernel/memremap.c index c95df6ed2d4a..b86bba8713b9 100644 --- a/kernel/memremap.c +++ b/kernel/memremap.c @@ -86,6 +86,8 @@ static void devm_memremap_pages_release(void *data) struct device *dev = pgmap->dev; struct resource *res = &pgmap->res; resource_size_t align_start, align_size; + struct vmem_altmap *altmap = pgmap->altmap_valid ? + &pgmap->altmap : NULL; unsigned long pfn; int nid; @@ -104,8 +106,7 @@ static void devm_memremap_pages_release(void *data) nid = dev_to_node(dev); mem_hotplug_begin(); - arch_remove_memory(nid, align_start, align_size, pgmap->altmap_valid ? - &pgmap->altmap : NULL); + del_device_memory(nid, align_start, align_size, altmap, true); kasan_remove_zero_shadow(__va(align_start), align_size); mem_hotplug_done(); @@ -204,11 +205,7 @@ void *devm_memremap_pages(struct device *dev, struct dev_pagemap *pgmap) goto err_kasan; } - error = arch_add_memory(nid, align_start, align_size, altmap, false); - if (!error) - move_pfn_range_to_zone(&NODE_DATA(nid)->node_zones[ZONE_DEVICE], - align_start >> PAGE_SHIFT, - align_size >> PAGE_SHIFT, altmap); + error = add_device_memory(nid, align_start, align_size, altmap, true); mem_hotplug_done(); if (error) goto err_add_memory; diff --git a/mm/hmm.c b/mm/hmm.c index 42d79bcc8aab..d3e52ae71bd9 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -996,6 +996,7 @@ static void hmm_devmem_release(struct device *dev, void *data) struct zone *zone; struct page *page; int nid; + bool mapping; if (percpu_ref_tryget_live(&devmem->ref)) { dev_WARN(dev, "%s: page mapping is still live!\n", __func__); @@ -1010,12 +1011,15 @@ static void hmm_devmem_release(struct device *dev, void *data) zone = page_zone(page); nid = zone->zone_pgdat->node_id; - mem_hotplug_begin(); if (resource->desc == IORES_DESC_DEVICE_PRIVATE_MEMORY) - __remove_pages(zone, start_pfn, npages, NULL); + mapping = false; else - arch_remove_memory(nid, start_pfn << PAGE_SHIFT, - npages << PAGE_SHIFT, NULL); + mapping = true; + + mem_hotplug_begin(); + del_device_memory(nid, start_pfn << PAGE_SHIFT, npages << PAGE_SHIFT, + NULL, + mapping); mem_hotplug_done(); hmm_devmem_radix_release(resource); @@ -1026,6 +1030,7 @@ static int hmm_devmem_pages_create(struct hmm_devmem *devmem) resource_size_t key, align_start, align_size, align_end; struct device *device = devmem->device; int ret, nid, is_ram; + bool mapping; align_start = devmem->resource->start & ~(PA_SECTION_SIZE - 1); align_size = ALIGN(devmem->resource->start + @@ -1084,7 +1089,6 @@ static int hmm_devmem_pages_create(struct hmm_devmem *devmem) if (nid < 0) nid = numa_mem_id(); - mem_hotplug_begin(); /* * For device private memory we call add_pages() as we only need to * allocate and initialize struct page for the device memory. More- @@ -1096,20 +1100,17 @@ static int hmm_devmem_pages_create(struct hmm_devmem *devmem) * want the linear mapping and thus use arch_add_memory(). */ if (devmem->pagemap.type == MEMORY_DEVICE_PUBLIC) - ret = arch_add_memory(nid, align_start, align_size, NULL, - false); + mapping = true; else - ret = add_pages(nid, align_start >> PAGE_SHIFT, - align_size >> PAGE_SHIFT, NULL, false); - if (ret) { - mem_hotplug_done(); - goto error_add_memory; - } - move_pfn_range_to_zone(&NODE_DATA(nid)->node_zones[ZONE_DEVICE], - align_start >> PAGE_SHIFT, - align_size >> PAGE_SHIFT, NULL); + mapping = false; + + mem_hotplug_begin(); + ret = add_device_memory(nid, align_start, align_size, NULL, mapping); mem_hotplug_done(); + if (ret) + goto error_add_memory; + /* * Initialization of the pages has been deferred until now in order * to allow us to do the work while not holding the hotplug lock. diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 33d448314b3f..5874aceb81ac 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1889,4 +1889,45 @@ void remove_memory(int nid, u64 start, u64 size) unlock_device_hotplug(); } EXPORT_SYMBOL_GPL(remove_memory); + +#ifdef CONFIG_ZONE_DEVICE +int del_device_memory(int nid, unsigned long start, unsigned long size, + struct vmem_altmap *altmap, bool mapping) +{ + int ret; + unsigned long start_pfn = PHYS_PFN(start); + unsigned long nr_pages = size >> PAGE_SHIFT; + struct zone *zone = page_zone(pfn_to_page(pfn)); + + if (mapping) + ret = arch_remove_memory(nid, start, size, altmap); + else + ret = __remove_pages(zone, start_pfn, nr_pages, altmap); + + return ret; +} +#endif #endif /* CONFIG_MEMORY_HOTREMOVE */ + +#ifdef CONFIG_ZONE_DEVICE +int add_device_memory(int nid, unsigned long start, unsigned long size, + struct vmem_altmap *altmap, bool mapping) +{ + int ret; + unsigned long start_pfn = PHYS_PFN(start); + unsigned long nr_pages = size >> PAGE_SHIFT; + + if (mapping) + ret = arch_add_memory(nid, start, size, altmap, false); + else + ret = add_pages(nid, start_pfn, nr_pages, altmap, false); + + if (!ret) { + struct zone *zone = &NODE_DATA(nid)->node_zones[ZONE_DEVICE]; + + move_pfn_range_to_zone(zone, start_pfn, nr_pages, altmap); + } + + return ret; +} +#endif From patchwork Mon Oct 15 15:30:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oscar Salvador X-Patchwork-Id: 10642055 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B925B925 for ; Mon, 15 Oct 2018 15:31:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A6FDB29AF4 for ; Mon, 15 Oct 2018 15:31:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9AE0929B05; Mon, 15 Oct 2018 15:31:09 +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=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 38DE829AF4 for ; Mon, 15 Oct 2018 15:31:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CE4CB6B000E; Mon, 15 Oct 2018 11:30:57 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id C736E6B0010; Mon, 15 Oct 2018 11:30:57 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A51016B0266; Mon, 15 Oct 2018 11:30:57 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-wr1-f71.google.com (mail-wr1-f71.google.com [209.85.221.71]) by kanga.kvack.org (Postfix) with ESMTP id 2EEEC6B0010 for ; Mon, 15 Oct 2018 11:30:57 -0400 (EDT) Received: by mail-wr1-f71.google.com with SMTP id f13-v6so16579304wrr.4 for ; Mon, 15 Oct 2018 08:30:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=JKE318wIKCFxCuunfg2WJB1Hno/yv4pQr9QRB3MB9UE=; b=lH5PNMlUL7GlAK2c9TGJgVcuczTOsdGCQCzJOxykTI+cXeu3DJQtnP3v9eNT+pBjqY 5sOBUk+iyVfhRFSJrMXWlMFSOwOFdHBrQMmzZoo9r/jWry1K8MddjbEk5P9qrHkkPlgD i29ZZGZ0anqY5aJ4+JYMtPcWtx/X7mkSV5Ywfo53AX8pxNjdVt9db+hKi6VRHgUrBqpr bWLRo64sBAAJXFh01quBGorcp654ZnewBbEb2vfC1saMkK5IsSrnf2Rcb9+K26drRkjQ AHxWxtMaZrJxhIwocyVS6Jyk6JHvXfxWiQm/5riCNgioVpyml4p+OOdhyYyR+pWentKo bB3g== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Gm-Message-State: ABuFfogwNsWLc/8z+92ktIwV8i9HswarvqjfI3MloxVeQLLHuGDWcshm RcSqKchd43kUwtZbBjPUbJ5rDIRAEvgKp125BKgwK5Xw0HTCd3+ThKPSn3PdLfpYVMt6gLwYUcj Rfqx/MEgLwV5oGWhO7hzWzxyKQc+dQu+6SinhA2YwMrChhg0YSbgmYUCoXH7Mqw6hUwRiMZqaFX zagH2kaDPtxnN43vdKgwlRCXCL+MmxrDzbDQeLUqE83fUB9ozGm0PZQofxn/cttHHg9OHYwHlYe VZDtw88wUn2X/gE9+AAq85CLBZSvM2WKak6svNtUbuoGgPLykCNsmO8o1rni+zHnA2qF3TxrJCq AdYHZ2u6tbzT7NNaCc3slduk8LU6iPOFKeYFRg4BW3cexD6vLh4WA8gP0GeCaoOfQ4DkHR5abg= = X-Received: by 2002:adf:84e6:: with SMTP id 93-v6mr16024148wrg.144.1539617456708; Mon, 15 Oct 2018 08:30:56 -0700 (PDT) X-Received: by 2002:adf:84e6:: with SMTP id 93-v6mr16024072wrg.144.1539617455452; Mon, 15 Oct 2018 08:30:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539617455; cv=none; d=google.com; s=arc-20160816; b=U5cWHd3l8Nxr/NwDB2krWyNlh6QG8MRW2+gEdghJrofmpsHZ2A7OFM1wtilss3gicn a1h+PjGvBdSZRET8ag9A4n1EklfgaQiP3PkPc68GEtsZa/O7zWaHn/mNGSj+FJuPa6/1 /1mBV4oTUJaHnaxme9BrBK7jgttPRdayQeEspcVvblTjK/1lTHUwPLJEgZmPJ+OPD3M6 +K2ranY5zUPli+sngvU+pL7hqmXBMQh7tpJXZhI5uYD/Bt87hebKSLgvTiiVQutCBSlX xjwjK3vfhpqcWlvCRstiLXMlN4aYk9kmZlNQA2Hf0qTQ9ZPll1TC1s1HFoMRYvylWCR8 dLTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from; bh=JKE318wIKCFxCuunfg2WJB1Hno/yv4pQr9QRB3MB9UE=; b=IIzyIxCfdaWlVucv0AeYT9CMQpQ2xhkFadSXeejQkFrfv2D23oyhndOo7LhxSAJQHG jAribHlndkkhfh3ZndC9z7N04ZX3MRV2ngIRg6TfNkNJ2jRmiSQJ7C1fIb2pjJS84eGt +0Q4gZ+34jGXcPmLwMYvMEUrnvwSHRj5Rdg9LTTlg1Q9+vCC7kWP1Tfje2rGfPHKCnkf XsmM7Vt65gQ6NXuqmLoUa3/UrllAU/qOffvOgA5D3o3BkPakkSGWulqcgbZuE1vaUDGS LaCVeCHiXslEAIc2zKzPJS1G0pJCOifXWgFXUd3Oyv3S+304DeipB4hag84/UnG0ozAU golg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id k18-v6sor6205205wrv.2.2018.10.15.08.30.55 for (Google Transport Security); Mon, 15 Oct 2018 08:30:55 -0700 (PDT) Received-SPF: pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Google-Smtp-Source: ACcGV60wvEZ8JvfJapnVl+qBRKKwzhci+rtNmrhU40OZeeKHlRQJvUMi6foPtmo15PHXMVJtGnwGVw== X-Received: by 2002:adf:a352:: with SMTP id d18-v6mr14941988wrb.31.1539617455156; Mon, 15 Oct 2018 08:30:55 -0700 (PDT) Received: from techadventures.net (techadventures.net. [62.201.165.239]) by smtp.gmail.com with ESMTPSA id a1-v6sm8859580wrt.79.2018.10.15.08.30.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Oct 2018 08:30:54 -0700 (PDT) Received: from d104.suse.de (charybdis-ext.suse.de [195.135.221.2]) by techadventures.net (Postfix) with ESMTPA id 4B1191259A8; Mon, 15 Oct 2018 17:30:52 +0200 (CEST) From: Oscar Salvador To: akpm@linux-foundation.org Cc: mhocko@suse.com, dan.j.williams@intel.com, yasu.isimatu@gmail.com, rppt@linux.vnet.ibm.com, malat@debian.org, linux-kernel@vger.kernel.org, pavel.tatashin@microsoft.com, jglisse@redhat.com, Jonathan.Cameron@huawei.com, rafael@kernel.org, david@redhat.com, dave.jiang@intel.com, linux-mm@kvack.org, alexander.h.duyck@linux.intel.com, Oscar Salvador Subject: [PATCH 3/5] mm/memory_hotplug: Check for IORESOURCE_SYSRAM in release_mem_region_adjustable Date: Mon, 15 Oct 2018 17:30:32 +0200 Message-Id: <20181015153034.32203-4-osalvador@techadventures.net> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20181015153034.32203-1-osalvador@techadventures.net> References: <20181015153034.32203-1-osalvador@techadventures.net> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Oscar Salvador This is a preparation for the next patch. Currently, we only call release_mem_region_adjustable() in __remove_pages if the zone is not ZONE_DEVICE, because resources that belong to HMM/devm are being released by themselves with devm_release_mem_region. Since we do not want to touch any zone/page stuff during the removing of the memory (but during the offlining), we do not want to check for the zone here. So we need another way to tell release_mem_region_adjustable() to not realease the resource in case it belongs to HMM/devm. HMM/devm acquires/releases a resource through devm_request_mem_region/devm_release_mem_region. These resources have the flag IORESOURCE_MEM, while resources acquired by hot-add memory path (register_memory_resource()) contain IORESOURCE_SYSTEM_RAM. So, we can check for this flag in release_mem_region_adjustable, and if the resource does not contain such flag, we know that we are dealing with a HMM/devm resource, so we can back off. Signed-off-by: Oscar Salvador Reviewed-by: David Hildenbrand Reviewed-by: Pavel Tatashin --- kernel/resource.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/kernel/resource.c b/kernel/resource.c index 81937830a42f..c45decd7d6af 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -1272,6 +1272,22 @@ int release_mem_region_adjustable(struct resource *parent, continue; } + /* + * All memory regions added from memory-hotplug path + * have the flag IORESOURCE_SYSTEM_RAM. + * If the resource does not have this flag, we know that + * we are dealing with a resource coming from HMM/devm. + * HMM/devm use another mechanism to add/release a resource. + * This goes via devm_request_mem_region and + * devm_release_mem_region. + * HMM/devm take care to release their resources when they want, + * so if we are dealing with them, let us just back off here. + */ + if (!(res->flags & IORESOURCE_SYSRAM)) { + ret = 0; + break; + } + if (!(res->flags & IORESOURCE_MEM)) break; From patchwork Mon Oct 15 15:30:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oscar Salvador X-Patchwork-Id: 10642059 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id ABD23925 for ; Mon, 15 Oct 2018 15:31:17 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 971F329B01 for ; Mon, 15 Oct 2018 15:31:17 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 89A9129B0A; Mon, 15 Oct 2018 15:31:17 +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=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6F91329B01 for ; Mon, 15 Oct 2018 15:31:16 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 01A7A6B0010; Mon, 15 Oct 2018 11:31:00 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id E90576B0269; Mon, 15 Oct 2018 11:30:59 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C93B06B026A; Mon, 15 Oct 2018 11:30:59 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by kanga.kvack.org (Postfix) with ESMTP id 6A1F16B0010 for ; Mon, 15 Oct 2018 11:30:59 -0400 (EDT) Received: by mail-wm1-f69.google.com with SMTP id h67-v6so14554588wmh.0 for ; Mon, 15 Oct 2018 08:30:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=3g9o7Nt8+lLup8PtXVUtBhddDfaQmR8XNXgLSCW+34w=; b=g/bSemqRR4SHjCwMTOxMuHDLv5Tg4x7Lz2Vy/8YEtOkECo2ODOHUBwle4kwLsX+DGu KeE4bIyuphefoZQr7s7W1CthvW0WyVIwWAQ7JxlpSBWLU1VIs0mO7x6W5t6sx6QbrA2O 1OEvB8vHU35103Tlwzf+mwwr0//84djMghTEi2d3gTsJ2/sVWm3XMhLYME4Kmz5plvA5 HvHK6CMqLi7ItAcVCS+zv8VEvzF9f0GqTYmPWmlO010UtaKnigBQ6Jp2izUS7MS2ieXq xFN7GlQ/FZHWDMJNDiXVhlSmhjzMxj/gQPloUlr56DUO4WIIegnm/2lytpkYSWC2b+Jd d8vA== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Gm-Message-State: ABuFfoiT5QPwLoqbOTxTxkn9E30BzNerYJJrI/X5TsPWRyo5Jgo/DcAB hQMLK7pAN+umuKV567ftLCJ+9KulxwfzMFcNqRfuBhzbhANVQxilIv4OHDI8mlq4mi/43WM1AL0 QITNeNAfzXRlglYFFCJ9m7KaGeep7n/2ys9BXxyDW3exeugqpXfBhNri/VVATmlcxHSTbO//l3G JhiyRaBY4Kgez2hJCjD3h72RQjaSYYigUt0Vp5E1ip/jcpDo0CZq7sFLu5egz/dnHFGfcae6WRM TdSOBJxVFiFpfJd/oP6nxI7YozazGiXuGYKIY4RAoP3/QHy2ZDZIW2g8J7bTuX9qkaBw78SzKaN ZlBZEafM8H9Igaflgx4gHo9KMA0NASTQpmvY4ImAPMRUmuUNPhhdG15qtW+pZyJ1Yf9/pCIE8Q= = X-Received: by 2002:a1c:1c13:: with SMTP id c19-v6mr12805874wmc.85.1539617458776; Mon, 15 Oct 2018 08:30:58 -0700 (PDT) X-Received: by 2002:a1c:1c13:: with SMTP id c19-v6mr12805773wmc.85.1539617456886; Mon, 15 Oct 2018 08:30:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539617456; cv=none; d=google.com; s=arc-20160816; b=mQjZ/afRURqKSp1RrMjFK8eE4P5uI3KvsXo7KpuImQ5/EhlsihngMYg0ved49SGM5/ wYe9WofY0EH0G1IBOHMxYCu5K6VZm8y9wNUDBg1Ullsqv2o1oOYMIQP/y7qBb3d1AZGH UDg3dW53DbJeEU/WAYqfSmdcexa6ltFS/z+v/N8q1hl1vbJZbeFKDX2hVdgjizOS8ko9 g83yyAZpmkde5TMMBv3wCIh88rimEu4e1hvN3nTgRyA1dgqHei6YR+a1dLG2t8YatUj0 YyuoSofNoKh/vMBoVsiexFs0qXo9Ngoexrh6MnFaYfCcM2RWQvZ/NKhyLoBUg8vsDnC6 mJxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from; bh=3g9o7Nt8+lLup8PtXVUtBhddDfaQmR8XNXgLSCW+34w=; b=cXysjxcGxAeNQnni9Ivpc8kNy005/PA8xA0VRG3Nquw2LeQMI80ABYIJRaJ1QCudHf CbPo1v/pnKz+VPbuvQ+5t33M3hrOCJFCIMOzi62YC6GRWYtniKvnBVsQyrs4xh4H+J1y JyPY0GIVug/Sz60B5mEpj/C7lHHvD6bQ8K11KjJ5J/tK9qEccDTr+nob60IKgAfKHceE raaImZDv8MTe0PdjtvwKe+0jhQ/KLCU5wgebEG5PcbVud1loH03PHRpEvvz0J7Bu0xh+ rXzG1e8e+Em1VEJDVW6OGN1KBp/mXP9dm1q+LVcQtvmXWvDkKRPPMtPVo2CQYTKHjGzx f8rQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id o131-v6sor6097661wmd.8.2018.10.15.08.30.56 for (Google Transport Security); Mon, 15 Oct 2018 08:30:56 -0700 (PDT) Received-SPF: pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Google-Smtp-Source: ACcGV61EIJTVWGdHuBwbNe7i0Ly+frUOWJgDGXTNEMhQRToVw0j2DrRR2la1ckBZVexNQqV2ckKkSg== X-Received: by 2002:a1c:a9d4:: with SMTP id s203-v6mr13138375wme.58.1539617456135; Mon, 15 Oct 2018 08:30:56 -0700 (PDT) Received: from techadventures.net (techadventures.net. [62.201.165.239]) by smtp.gmail.com with ESMTPSA id e21-v6sm11992704wma.8.2018.10.15.08.30.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Oct 2018 08:30:54 -0700 (PDT) Received: from d104.suse.de (charybdis-ext.suse.de [195.135.221.2]) by techadventures.net (Postfix) with ESMTPA id 96AC71259A9; Mon, 15 Oct 2018 17:30:52 +0200 (CEST) From: Oscar Salvador To: akpm@linux-foundation.org Cc: mhocko@suse.com, dan.j.williams@intel.com, yasu.isimatu@gmail.com, rppt@linux.vnet.ibm.com, malat@debian.org, linux-kernel@vger.kernel.org, pavel.tatashin@microsoft.com, jglisse@redhat.com, Jonathan.Cameron@huawei.com, rafael@kernel.org, david@redhat.com, dave.jiang@intel.com, linux-mm@kvack.org, alexander.h.duyck@linux.intel.com, Oscar Salvador Subject: [PATCH 4/5] mm/memory_hotplug: Move zone/pages handling to offline stage Date: Mon, 15 Oct 2018 17:30:33 +0200 Message-Id: <20181015153034.32203-5-osalvador@techadventures.net> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20181015153034.32203-1-osalvador@techadventures.net> References: <20181015153034.32203-1-osalvador@techadventures.net> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Oscar Salvador Currently, we decrement zone/node spanned_pages during the hot-remove path. The picture we have now is: - hot-add memory: a) Allocate a new resource based on the hot-added memory b) Add memory sections for the hot-added memory - online memory: c) Re-adjust zone/pgdat nr of pages (managed, spanned, present) d) Initialize the pages from the new memory-range e) Online memory sections - offline memory: f) Offline memory sections g) Re-adjust zone/pgdat nr of managed/present pages - hot-remove memory: i) Re-adjust zone/pgdat nr of spanned pages j) Remove memory sections k) Release resource This, besides of not being consistent with the current code, implies that we can access steal pages if we never get to online that memory. So we should move i) to the offline stage. Hot-remove path should only care about memory sections and memory blocks. There is a particularity and that is HMM/devm. When the memory is being handled by HMM/devm, this memory is moved to ZONE_DEVICE by means of move_pfn_range_to_zone, but since this memory does not get "online", the sections do not get online either. This is a problem because shrink_zone_pgdat_pages will now look for online sections, so we need to explicitly offline the sections before calling in. add_device_memory takes care of online them, and del_device_memory offlines them. Finally, shrink_zone_pgdat_pages() is moved to offline_pages(), so now, all pages/zone handling is being taken care in online/offline stage. So now we will have: - hot-add memory: a) Allocate a new resource based on the hot-added memory b) Add memory sections for the hot-added memory - online memory: c) Re-adjust zone/pgdat nr of pages (managed, spanned, present) d) Initialize the pages from the new memory-range e) Online memory sections - offline memory: f) Offline memory sections g) Re-adjust zone/pgdat nr of managed/present/spanned pages - hot-remove memory: i) Remove memory sections j) Release resource Signed-off-by: Oscar Salvador --- arch/ia64/mm/init.c | 4 +- arch/powerpc/mm/mem.c | 11 +---- arch/sh/mm/init.c | 4 +- arch/x86/mm/init_32.c | 4 +- arch/x86/mm/init_64.c | 8 +--- include/linux/memory_hotplug.h | 8 ++-- mm/memory_hotplug.c | 99 ++++++++++++++++++++---------------------- mm/sparse.c | 6 +-- 8 files changed, 58 insertions(+), 86 deletions(-) diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index 904fe55e10fc..a6b5f351620c 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c @@ -665,11 +665,9 @@ int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; - struct zone *zone; int ret; - zone = page_zone(pfn_to_page(start_pfn)); - ret = __remove_pages(zone, start_pfn, nr_pages, altmap); + ret = __remove_pages(nid, start_pfn, nr_pages, altmap); if (ret) pr_warn("%s: Problem encountered in __remove_pages() as" " ret=%d\n", __func__, ret); diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index 6db8f527babb..14b6c859bc04 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c @@ -144,18 +144,9 @@ int __meminit arch_remove_memory(int nid, u64 start, u64 size, { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; - struct page *page; int ret; - /* - * If we have an altmap then we need to skip over any reserved PFNs - * when querying the zone. - */ - page = pfn_to_page(start_pfn); - if (altmap) - page += vmem_altmap_offset(altmap); - - ret = __remove_pages(page_zone(page), start_pfn, nr_pages, altmap); + ret = __remove_pages(nid, start_pfn, nr_pages, altmap); if (ret) return ret; diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index a8e5c0e00fca..6e80a7a50f8b 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c @@ -447,11 +447,9 @@ int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap) { unsigned long start_pfn = PFN_DOWN(start); unsigned long nr_pages = size >> PAGE_SHIFT; - struct zone *zone; int ret; - zone = page_zone(pfn_to_page(start_pfn)); - ret = __remove_pages(zone, start_pfn, nr_pages, altmap); + ret = __remove_pages(nid, start_pfn, nr_pages, altmap); if (unlikely(ret)) pr_warn("%s: Failed, __remove_pages() == %d\n", __func__, ret); diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 85c94f9a87f8..4719af142c10 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c @@ -864,10 +864,8 @@ int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap) { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; - struct zone *zone; - zone = page_zone(pfn_to_page(start_pfn)); - return __remove_pages(zone, start_pfn, nr_pages, altmap); + return __remove_pages(nid, start_pfn, nr_pages, altmap); } #endif #endif diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 449958da97a4..5f73b6deb794 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -1152,15 +1152,9 @@ int __ref arch_remove_memory(int nid, u64 start, u64 size, { unsigned long start_pfn = start >> PAGE_SHIFT; unsigned long nr_pages = size >> PAGE_SHIFT; - struct page *page = pfn_to_page(start_pfn); - struct zone *zone; int ret; - /* With altmap the first mapped page is offset from @start */ - if (altmap) - page += vmem_altmap_offset(altmap); - zone = page_zone(page); - ret = __remove_pages(zone, start_pfn, nr_pages, altmap); + ret = __remove_pages(nid, start_pfn, nr_pages, altmap); WARN_ON_ONCE(ret); kernel_physical_mapping_remove(start, start + size); diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index cf014d5edbb2..a1be5e76be14 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -109,8 +109,8 @@ static inline bool movable_node_is_enabled(void) #ifdef CONFIG_MEMORY_HOTREMOVE extern int arch_remove_memory(int nid, u64 start, u64 size, struct vmem_altmap *altmap); -extern int __remove_pages(struct zone *zone, unsigned long start_pfn, - unsigned long nr_pages, struct vmem_altmap *altmap); +extern int __remove_pages(int nid, unsigned long start_pfn, + unsigned long nr_pages, struct vmem_altmap *altmap); #ifdef CONFIG_ZONE_DEVICE extern int del_device_memory(int nid, unsigned long start, unsigned long size, @@ -346,8 +346,8 @@ extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages); extern bool is_memblock_offlined(struct memory_block *mem); extern int sparse_add_one_section(struct pglist_data *pgdat, unsigned long start_pfn, struct vmem_altmap *altmap); -extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms, - unsigned long map_offset, struct vmem_altmap *altmap); +extern void sparse_remove_one_section(int nid, struct mem_section *ms, + unsigned long map_offset, struct vmem_altmap *altmap); extern struct page *sparse_decode_mem_map(unsigned long coded_mem_map, unsigned long pnum); extern bool allow_online_pfn_range(int nid, unsigned long pfn, unsigned long nr_pages, diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 5874aceb81ac..6b98321aa52f 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -319,12 +319,10 @@ static unsigned long find_smallest_section_pfn(int nid, struct zone *zone, unsigned long start_pfn, unsigned long end_pfn) { - struct mem_section *ms; - for (; start_pfn < end_pfn; start_pfn += PAGES_PER_SECTION) { - ms = __pfn_to_section(start_pfn); + struct mem_section *ms = __pfn_to_section(start_pfn); - if (unlikely(!valid_section(ms))) + if (unlikely(!online_section(ms))) continue; if (unlikely(pfn_to_nid(start_pfn) != nid)) @@ -344,15 +342,14 @@ static unsigned long find_biggest_section_pfn(int nid, struct zone *zone, unsigned long start_pfn, unsigned long end_pfn) { - struct mem_section *ms; unsigned long pfn; /* pfn is the end pfn of a memory section. */ pfn = end_pfn - 1; for (; pfn >= start_pfn; pfn -= PAGES_PER_SECTION) { - ms = __pfn_to_section(pfn); + struct mem_section *ms = __pfn_to_section(pfn); - if (unlikely(!valid_section(ms))) + if (unlikely(!online_section(ms))) continue; if (unlikely(pfn_to_nid(pfn) != nid)) @@ -414,7 +411,7 @@ static void shrink_zone_span(struct zone *zone, unsigned long start_pfn, for (; pfn < zone_end_pfn; pfn += PAGES_PER_SECTION) { ms = __pfn_to_section(pfn); - if (unlikely(!valid_section(ms))) + if (unlikely(!online_section(ms))) continue; if (page_zone(pfn_to_page(pfn)) != zone) @@ -482,7 +479,7 @@ static void shrink_pgdat_span(struct pglist_data *pgdat, for (; pfn < pgdat_end_pfn; pfn += PAGES_PER_SECTION) { ms = __pfn_to_section(pfn); - if (unlikely(!valid_section(ms))) + if (unlikely(!online_section(ms))) continue; if (pfn_to_nid(pfn) != nid) @@ -501,23 +498,31 @@ static void shrink_pgdat_span(struct pglist_data *pgdat, pgdat->node_spanned_pages = 0; } -static void __remove_zone(struct zone *zone, unsigned long start_pfn) +static void shrink_zone_pgdat_pages(struct zone *zone, unsigned long start_pfn, + unsigned long end_pfn, unsigned long offlined_pages) { struct pglist_data *pgdat = zone->zone_pgdat; int nr_pages = PAGES_PER_SECTION; unsigned long flags; + unsigned long pfn; - pgdat_resize_lock(zone->zone_pgdat, &flags); - shrink_zone_span(zone, start_pfn, start_pfn + nr_pages); - shrink_pgdat_span(pgdat, start_pfn, start_pfn + nr_pages); - pgdat_resize_unlock(zone->zone_pgdat, &flags); + zone->present_pages -= offlined_pages; + clear_zone_contiguous(zone); + + pgdat_resize_lock(pgdat, &flags); + pgdat->node_present_pages -= offlined_pages; + for (pfn = start_pfn; pfn < end_pfn; pfn += nr_pages) { + shrink_zone_span(zone, pfn, pfn + nr_pages); + shrink_pgdat_span(pgdat, pfn, pfn + nr_pages); + } + pgdat_resize_unlock(pgdat, &flags); + + set_zone_contiguous(zone); } -static int __remove_section(struct zone *zone, struct mem_section *ms, - unsigned long map_offset, struct vmem_altmap *altmap) +static int __remove_section(int nid, struct mem_section *ms, + unsigned long map_offset, struct vmem_altmap *altmap) { - unsigned long start_pfn; - int scn_nr; int ret = -EINVAL; if (!valid_section(ms)) @@ -527,17 +532,13 @@ static int __remove_section(struct zone *zone, struct mem_section *ms, if (ret) return ret; - scn_nr = __section_nr(ms); - start_pfn = section_nr_to_pfn((unsigned long)scn_nr); - __remove_zone(zone, start_pfn); - - sparse_remove_one_section(zone, ms, map_offset, altmap); + sparse_remove_one_section(nid, ms, map_offset, altmap); return 0; } /** * __remove_pages() - remove sections of pages from a zone - * @zone: zone from which pages need to be removed + * @nid: nid from which pages belong to * @phys_start_pfn: starting pageframe (must be aligned to start of a section) * @nr_pages: number of pages to remove (must be multiple of section size) * @altmap: alternative device page map or %NULL if default memmap is used @@ -547,35 +548,28 @@ static int __remove_section(struct zone *zone, struct mem_section *ms, * sure that pages are marked reserved and zones are adjust properly by * calling offline_pages(). */ -int __remove_pages(struct zone *zone, unsigned long phys_start_pfn, - unsigned long nr_pages, struct vmem_altmap *altmap) +int __remove_pages(int nid, unsigned long phys_start_pfn, + unsigned long nr_pages, struct vmem_altmap *altmap) { unsigned long i; unsigned long map_offset = 0; int sections_to_remove, ret = 0; + resource_size_t start, size; - /* In the ZONE_DEVICE case device driver owns the memory region */ - if (is_dev_zone(zone)) { - if (altmap) - map_offset = vmem_altmap_offset(altmap); - } else { - resource_size_t start, size; + start = phys_start_pfn << PAGE_SHIFT; + size = nr_pages * PAGE_SIZE; - start = phys_start_pfn << PAGE_SHIFT; - size = nr_pages * PAGE_SIZE; + if (altmap) + map_offset = vmem_altmap_offset(altmap); - ret = release_mem_region_adjustable(&iomem_resource, start, - size); - if (ret) { - resource_size_t endres = start + size - 1; + ret = release_mem_region_adjustable(&iomem_resource, start, size); + if (ret) { + resource_size_t endres = start + size - 1; - pr_warn("Unable to release resource <%pa-%pa> (%d)\n", - &start, &endres, ret); - } + pr_warn("Unable to release resource <%pa-%pa> (%d)\n", + &start, &endres, ret); } - clear_zone_contiguous(zone); - /* * We can only remove entire sections */ @@ -586,15 +580,13 @@ int __remove_pages(struct zone *zone, unsigned long phys_start_pfn, for (i = 0; i < sections_to_remove; i++) { unsigned long pfn = phys_start_pfn + i*PAGES_PER_SECTION; - ret = __remove_section(zone, __pfn_to_section(pfn), map_offset, - altmap); + ret = __remove_section(nid, __pfn_to_section(pfn), map_offset, + altmap); map_offset = 0; if (ret) break; } - set_zone_contiguous(zone); - return ret; } #endif /* CONFIG_MEMORY_HOTREMOVE */ @@ -1566,7 +1558,6 @@ static int __ref __offline_pages(unsigned long start_pfn, unsigned long pfn, nr_pages; long offlined_pages; int ret, node; - unsigned long flags; unsigned long valid_start, valid_end; struct zone *zone; struct memory_notify arg; @@ -1644,11 +1635,9 @@ static int __ref __offline_pages(unsigned long start_pfn, undo_isolate_page_range(start_pfn, end_pfn, MIGRATE_MOVABLE); /* removal success */ adjust_managed_page_count(pfn_to_page(start_pfn), -offlined_pages); - zone->present_pages -= offlined_pages; - pgdat_resize_lock(zone->zone_pgdat, &flags); - zone->zone_pgdat->node_present_pages -= offlined_pages; - pgdat_resize_unlock(zone->zone_pgdat, &flags); + /* Here we will shrink zone/node's spanned/present_pages */ + shrink_zone_pgdat_pages(zone, valid_start, valid_end, offlined_pages); init_per_zone_wmark_min(); @@ -1899,10 +1888,13 @@ int del_device_memory(int nid, unsigned long start, unsigned long size, unsigned long nr_pages = size >> PAGE_SHIFT; struct zone *zone = page_zone(pfn_to_page(pfn)); + offline_mem_sections(start_pfn, start_pfn + nr_pages); + shrink_zone_pgdat_pages(zone, start_pfn, start_pfn + nr_pages, 0); + if (mapping) ret = arch_remove_memory(nid, start, size, altmap); else - ret = __remove_pages(zone, start_pfn, nr_pages, altmap); + ret = __remove_pages(nid, start_pfn, nr_pages, altmap); return ret; } @@ -1925,6 +1917,7 @@ int add_device_memory(int nid, unsigned long start, unsigned long size, if (!ret) { struct zone *zone = &NODE_DATA(nid)->node_zones[ZONE_DEVICE]; + online_mem_sections(start_pfn, start_pfn + nr_pages); move_pfn_range_to_zone(zone, start_pfn, nr_pages, altmap); } diff --git a/mm/sparse.c b/mm/sparse.c index 33307fc05c4d..76974479a14b 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -765,12 +765,12 @@ static void free_section_usemap(struct page *memmap, unsigned long *usemap, free_map_bootmem(memmap); } -void sparse_remove_one_section(struct zone *zone, struct mem_section *ms, - unsigned long map_offset, struct vmem_altmap *altmap) +void sparse_remove_one_section(int nid, struct mem_section *ms, + unsigned long map_offset, struct vmem_altmap *altmap) { struct page *memmap = NULL; unsigned long *usemap = NULL, flags; - struct pglist_data *pgdat = zone->zone_pgdat; + struct pglist_data *pgdat = NODE_DATA(nid); pgdat_resize_lock(pgdat, &flags); if (ms->section_mem_map) { From patchwork Mon Oct 15 15:30:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oscar Salvador X-Patchwork-Id: 10642057 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E7AB0925 for ; Mon, 15 Oct 2018 15:31:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D66D529AF4 for ; Mon, 15 Oct 2018 15:31:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CAAD129B0A; Mon, 15 Oct 2018 15:31:13 +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=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2F9D729AF4 for ; Mon, 15 Oct 2018 15:31:13 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6F1256B0266; Mon, 15 Oct 2018 11:30:59 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 6C7DF6B026A; Mon, 15 Oct 2018 11:30:59 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5BFC76B0269; Mon, 15 Oct 2018 11:30:59 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-wm1-f69.google.com (mail-wm1-f69.google.com [209.85.128.69]) by kanga.kvack.org (Postfix) with ESMTP id EADA16B0266 for ; Mon, 15 Oct 2018 11:30:58 -0400 (EDT) Received: by mail-wm1-f69.google.com with SMTP id 203-v6so14566790wmv.1 for ; Mon, 15 Oct 2018 08:30:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=Klahqg36Ibpp1aNBF2mqe1EkWDF8ejY5IvTH1L9cox0=; b=fTq3cThmJTz7Cjk63EeXAkvD79MeKc1YOd4RU+XMzx4WWgNS/fHFMwRudxKuowdGur jZTgm1bUvPY8rLkJrOLf8Tbks2nvcfFOs4rNXAGoEGX4CbVERCoshURMNIZeSWp0upAx Gk9SRZiX3j/+i3zNVhvB2m5tGNMq9FVBRaDychesslVfn54VVN+AwBULv4ZhibFpCE6+ qMflqCAZvgn202ATHIsBuV1BbTvsL1ccj3rbvV97j/iGY7B+BFfacTP6ODjlsVqtJ/a4 TvJhioTrSmvn8kTwp+2oR6lxDUYhQuWY1EDZK7r/dTGIrKD3k9n6VtZiVG2S1BpfA0s2 y2Xg== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Gm-Message-State: ABuFfohppLFtJQ53G3n2z8STjvCH3Jwe1fMoBjsG2K5x8tU7v8RK0Cqv RdaaW6H1vUMTs4B3q9fmT36hLKZzzK913skH18K+M6hwfZ4zrun4xx9DfXKc/VHRE2mun7vnGKa zDXGsdCTqghUrGyoaOs6C95rIYktDVwXKlSxTR3Vfsx84QhBsB8yF1O/99N+geaMqEXNkkA3OJY 32nwBaO3lcAQ3OgpWLaBy4tsujfoyRkZMxDpHwUHNtP1w2dSYlXn69EOfPrygJ2rdAxW6K/nh3h CUpcbmSgOEtFdHbRdmWKRNu6EZ2hxw+x5tZM2R9HxBtpvGuQbYPbF6Fk1Z9wkh3RDaTn3sK8G2f H8jRhDOXR1wC64L5Ip1uYuHMChX+mLn2V8fSGiAKjxa44W5gKMF4DlfE00vvKTqAXPwPg2aZjQ= = X-Received: by 2002:a1c:1fcd:: with SMTP id f196-v6mr13724462wmf.19.1539617458425; Mon, 15 Oct 2018 08:30:58 -0700 (PDT) X-Received: by 2002:a1c:1fcd:: with SMTP id f196-v6mr13724385wmf.19.1539617457135; Mon, 15 Oct 2018 08:30:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539617457; cv=none; d=google.com; s=arc-20160816; b=T5kJKwWB576IWFnQmIT3SPxmBHvwUXrMLirxkmE6aGcADFZbvF2X+UsGoNnzVDMG8o AxRFucEwHPHfO2qGgjvoqacujfcqsI/kwgRQAuGhJ8yP+GZSb9CzfJz6CvunfJgRFhZi UeC2I0xqw5BYc0C+KyzjDvmNOvgM8OMX9G99iTSngZS2aAbTUyWIzAWwh7vAUYVEHFx5 BMXDXz+mADDcJjuQ+Bv6svtweHXrMDqmddnNh45c3gghTSK3m70sx2J52YVMf3D+f+EI aEOEJclJ+3+3T+kM5mJSUn+xgxpjS6tx8OPVJWjE5C3btBN8AFQ1bh51/9pkQxU7K24R UoBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from; bh=Klahqg36Ibpp1aNBF2mqe1EkWDF8ejY5IvTH1L9cox0=; b=uLhSaOcQArkPBfG6M8EcsYg8GkHzf+nPuSL5DHsCTWd3bhTT3yEsCJ255H+dlWtiz6 dDIa4tuqutF8hOnyGj+mDKNb8JnDMu/l+gOoidlU/RleAjl3xvg+ejMZnZcS3HUMPUI1 +b6LUk6M4jXyACC5vQZCXmNjs918iiP10MRQCJ18M9uIvA+VWChrgmP24GYkt32ymJn3 1JjWlOFymiu4qlUvkNg7Ra45pBNi/C7ZCH4v/gJwmQ1YpDW81Axh2aKf1ATX6SxP4qgm wrOH+MNLvdvP0AusYgRLA1NSJBlyHSAM5IpMhZcrCcVEkZXIbnsqYKksc0htAI6BLc1M 7C3g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id n10-v6sor6181089wru.35.2018.10.15.08.30.56 for (Google Transport Security); Mon, 15 Oct 2018 08:30:57 -0700 (PDT) Received-SPF: pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; spf=pass (google.com: domain of osalvador.vilardaga@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=osalvador.vilardaga@gmail.com X-Google-Smtp-Source: ACcGV63nfd9R6AR3e3vbj7HTCbnZ88O29I9amv7MEzGUb9OehmaMgfI4iu+IKzdZbTsWPOrwkvXJBw== X-Received: by 2002:a5d:4409:: with SMTP id z9-v6mr13979691wrq.227.1539617456804; Mon, 15 Oct 2018 08:30:56 -0700 (PDT) Received: from techadventures.net (techadventures.net. [62.201.165.239]) by smtp.gmail.com with ESMTPSA id a1-v6sm8859612wrt.79.2018.10.15.08.30.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 15 Oct 2018 08:30:54 -0700 (PDT) Received: from d104.suse.de (charybdis-ext.suse.de [195.135.221.2]) by techadventures.net (Postfix) with ESMTPA id E588A1251F0; Mon, 15 Oct 2018 17:30:52 +0200 (CEST) From: Oscar Salvador To: akpm@linux-foundation.org Cc: mhocko@suse.com, dan.j.williams@intel.com, yasu.isimatu@gmail.com, rppt@linux.vnet.ibm.com, malat@debian.org, linux-kernel@vger.kernel.org, pavel.tatashin@microsoft.com, jglisse@redhat.com, Jonathan.Cameron@huawei.com, rafael@kernel.org, david@redhat.com, dave.jiang@intel.com, linux-mm@kvack.org, alexander.h.duyck@linux.intel.com, Oscar Salvador Subject: [PATCH 5/5] mm/memory-hotplug: Rework unregister_mem_sect_under_nodes Date: Mon, 15 Oct 2018 17:30:34 +0200 Message-Id: <20181015153034.32203-6-osalvador@techadventures.net> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20181015153034.32203-1-osalvador@techadventures.net> References: <20181015153034.32203-1-osalvador@techadventures.net> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Oscar Salvador This tries to address another issue about accessing unitiliazed pages. Jonathan reported a problem [1] where we can access steal pages in case we hot-remove memory without onlining it first. This time is in unregister_mem_sect_under_nodes. This function tries to get the nid from the pfn and then tries to remove the symlink between mem_blk <-> nid and vice versa. Since we already know the nid in remove_memory(), we can pass it down the chain to unregister_mem_sect_under_nodes. There we can just remove the symlinks without the need to look into the pages. [1] https://www.spinics.net/lists/linux-mm/msg161316.html Signed-off-by: Oscar Salvador Tested-by: Jonathan Cameron --- drivers/base/memory.c | 9 ++++----- drivers/base/node.c | 38 +++++++------------------------------- include/linux/memory.h | 2 +- include/linux/node.h | 9 ++++----- mm/memory_hotplug.c | 2 +- 5 files changed, 17 insertions(+), 43 deletions(-) diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 0e5985682642..3d8c65d84bea 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -744,8 +744,7 @@ unregister_memory(struct memory_block *memory) device_unregister(&memory->dev); } -static int remove_memory_section(unsigned long node_id, - struct mem_section *section, int phys_device) +static int remove_memory_section(unsigned long nid, struct mem_section *section) { struct memory_block *mem; @@ -759,7 +758,7 @@ static int remove_memory_section(unsigned long node_id, if (!mem) goto out_unlock; - unregister_mem_sect_under_nodes(mem, __section_nr(section)); + unregister_mem_sect_under_nodes(nid, mem); mem->section_count--; if (mem->section_count == 0) @@ -772,12 +771,12 @@ static int remove_memory_section(unsigned long node_id, return 0; } -int unregister_memory_section(struct mem_section *section) +int unregister_memory_section(int nid, struct mem_section *section) { if (!present_section(section)) return -EINVAL; - return remove_memory_section(0, section, 0); + return remove_memory_section(nid, section); } #endif /* CONFIG_MEMORY_HOTREMOVE */ diff --git a/drivers/base/node.c b/drivers/base/node.c index 86d6cd92ce3d..65bc5920bd3d 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c @@ -453,40 +453,16 @@ int register_mem_sect_under_node(struct memory_block *mem_blk, void *arg) return 0; } -/* unregister memory section under all nodes that it spans */ -int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, - unsigned long phys_index) +/* + * This mem_blk is going to be removed, so let us remove the link + * to the node and vice versa + */ +void unregister_mem_sect_under_nodes(int nid, struct memory_block *mem_blk) { - NODEMASK_ALLOC(nodemask_t, unlinked_nodes, GFP_KERNEL); - unsigned long pfn, sect_start_pfn, sect_end_pfn; - - if (!mem_blk) { - NODEMASK_FREE(unlinked_nodes); - return -EFAULT; - } - if (!unlinked_nodes) - return -ENOMEM; - nodes_clear(*unlinked_nodes); - - sect_start_pfn = section_nr_to_pfn(phys_index); - sect_end_pfn = sect_start_pfn + PAGES_PER_SECTION - 1; - for (pfn = sect_start_pfn; pfn <= sect_end_pfn; pfn++) { - int nid; - - nid = get_nid_for_pfn(pfn); - if (nid < 0) - continue; - if (!node_online(nid)) - continue; - if (node_test_and_set(nid, *unlinked_nodes)) - continue; - sysfs_remove_link(&node_devices[nid]->dev.kobj, + sysfs_remove_link(&node_devices[nid]->dev.kobj, kobject_name(&mem_blk->dev.kobj)); - sysfs_remove_link(&mem_blk->dev.kobj, + sysfs_remove_link(&mem_blk->dev.kobj, kobject_name(&node_devices[nid]->dev.kobj)); - } - NODEMASK_FREE(unlinked_nodes); - return 0; } int link_mem_sections(int nid, unsigned long start_pfn, unsigned long end_pfn) diff --git a/include/linux/memory.h b/include/linux/memory.h index a6ddefc60517..d75ec88ca09d 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h @@ -113,7 +113,7 @@ extern int register_memory_isolate_notifier(struct notifier_block *nb); extern void unregister_memory_isolate_notifier(struct notifier_block *nb); int hotplug_memory_register(int nid, struct mem_section *section); #ifdef CONFIG_MEMORY_HOTREMOVE -extern int unregister_memory_section(struct mem_section *); +extern int unregister_memory_section(int nid, struct mem_section *); #endif extern int memory_dev_init(void); extern int memory_notify(unsigned long val, void *v); diff --git a/include/linux/node.h b/include/linux/node.h index 257bb3d6d014..dddead9937ab 100644 --- a/include/linux/node.h +++ b/include/linux/node.h @@ -72,8 +72,8 @@ extern int register_cpu_under_node(unsigned int cpu, unsigned int nid); extern int unregister_cpu_under_node(unsigned int cpu, unsigned int nid); extern int register_mem_sect_under_node(struct memory_block *mem_blk, void *arg); -extern int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, - unsigned long phys_index); +extern void unregister_mem_sect_under_nodes(int nid, + struct memory_block *mem_blk); #ifdef CONFIG_HUGETLBFS extern void register_hugetlbfs_with_node(node_registration_func_t doregister, @@ -105,10 +105,9 @@ static inline int register_mem_sect_under_node(struct memory_block *mem_blk, { return 0; } -static inline int unregister_mem_sect_under_nodes(struct memory_block *mem_blk, - unsigned long phys_index) +static inline void unregister_mem_sect_under_nodes(int nid, + struct memory_block *mem_blk) { - return 0; } static inline void register_hugetlbfs_with_node(node_registration_func_t reg, diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 6b98321aa52f..66ccbb5b8a88 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -528,7 +528,7 @@ static int __remove_section(int nid, struct mem_section *ms, if (!valid_section(ms)) return ret; - ret = unregister_memory_section(ms); + ret = unregister_memory_section(nid, ms); if (ret) return ret;