Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp966234imm; Wed, 23 May 2018 08:13:46 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpdqV8HeTOz9Q/UBGHyNLBuuAYfDmC7q+4vSalKvG+Jk6VE6oZtFQDIl4OQXTVpMPQThMrD X-Received: by 2002:a62:4f0c:: with SMTP id d12-v6mr3296961pfb.220.1527088426035; Wed, 23 May 2018 08:13:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527088426; cv=none; d=google.com; s=arc-20160816; b=ShYIQSeGQeCPzWgCsyaPssyE7Af40QhxGZer0dKIPTD3KGQjxtwsfAOXA+zaf/4cEW E3IMZ058td6IzYsBPlD2xnnVDhXiTyi55ZfbMSnk+QNp9VBi/bxd0KOoyq1onPbQe4g2 UEUZpmNU5QYJ63prNZyMd6Ay2nUT6g6BrK7gj/z3QoBwZht+/tNtftb8sItAt3P3C2eY jbhvrVkCLvUsv38nu3AYlfShIfWoXs8WRRoPfSUtI7MfTJSssf8rkC1Aj3al6QiABTWt sXdY9x28YIL8XZY+q0CVYd2lC/glbCDs7X3nvZ0D9K5iCzsnbvjx5gG7jWf+FFDj19IU 3Xkw== 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:arc-authentication-results; bh=Qwwj2CNiUzK76G8PXIM9QFTz93z0/sWlkC4fahy3Glg=; b=Pjmtify90iqBIa60gLMMC68c7RQ1OIhKXaTZ4jTC4TCoqkz1h2NZEVWOWjjDp1czvj gMH4q66zIc3snuQQiO3nAubwB8r1GML6NjRVh8JCZ/cbuALWU9atJU3XQiLxj+PIjnOh WUar4lioT+FoAdvmrGdjbzJHDyBS0NDUcR0SpzWcY4TKl/+e9o1lGGoCLel7YIazBVo0 gEet/z4n8vQ9M5n4e0VdHB6eX5qcEJwDLRwwjD6pwI5AeWDCapisGSnxbuk8ufqGqirP vTYNWehH4W659oxUExv9eHibHmb3VkyY/MedS4WwNBjlM7BJGvOgzhgHussqH56Py2JN blsw== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y34-v6si19334908plb.317.2018.05.23.08.13.30; Wed, 23 May 2018 08:13:45 -0700 (PDT) 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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933600AbeEWPNC (ORCPT + 99 others); Wed, 23 May 2018 11:13:02 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:60038 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933563AbeEWPMf (ORCPT ); Wed, 23 May 2018 11:12:35 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9F92F818BAF8; Wed, 23 May 2018 15:12:34 +0000 (UTC) Received: from t460s.redhat.com (ovpn-116-112.ams2.redhat.com [10.36.116.112]) by smtp.corp.redhat.com (Postfix) with ESMTP id A418910C564A; Wed, 23 May 2018 15:12:30 +0000 (UTC) From: David Hildenbrand To: linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, David Hildenbrand , Greg Kroah-Hartman , Andrew Morton , Vlastimil Babka , Michal Hocko , Dan Williams , Pavel Tatashin , Joonsoo Kim , Thomas Gleixner Subject: [PATCH v1 10/10] mm/memory_hotplug: allow online/offline memory by a kernel module Date: Wed, 23 May 2018 17:11:51 +0200 Message-Id: <20180523151151.6730-11-david@redhat.com> In-Reply-To: <20180523151151.6730-1-david@redhat.com> References: <20180523151151.6730-1-david@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Wed, 23 May 2018 15:12:34 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Wed, 23 May 2018 15:12:34 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'david@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Kernel modules that want to control how/when memory is onlined/offlined need a proper interface to these functions. Also, for adding memory properly, memory_block_size_bytes is required. Cc: Greg Kroah-Hartman Cc: Andrew Morton Cc: Vlastimil Babka Cc: Michal Hocko Cc: Dan Williams Cc: Pavel Tatashin Cc: Joonsoo Kim Cc: Thomas Gleixner Signed-off-by: David Hildenbrand --- drivers/base/memory.c | 1 + include/linux/memory_hotplug.h | 2 ++ mm/memory_hotplug.c | 27 +++++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/drivers/base/memory.c b/drivers/base/memory.c index c785e4c01b23..0a7c79cfaaf8 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -88,6 +88,7 @@ unsigned long __weak memory_block_size_bytes(void) { return MIN_MEMORY_BLOCK_SIZE; } +EXPORT_SYMBOL(memory_block_size_bytes); static unsigned long get_memory_block_size(void) { diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index ae53017b54df..0e3e48410415 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -97,6 +97,8 @@ extern void __online_page_increment_counters(struct page *page); extern void __online_page_free(struct page *page); extern int try_online_node(int nid); +extern int online_memory_blocks(uint64_t start, uint64_t size); +extern int offline_memory_blocks(uint64_t start, uint64_t size); extern bool memhp_auto_online; /* If movable_node boot option specified */ diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 3a5845a33910..071976e5e7f6 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -89,12 +89,14 @@ void mem_hotplug_begin(void) cpus_read_lock(); percpu_down_write(&mem_hotplug_lock); } +EXPORT_SYMBOL(mem_hotplug_begin); void mem_hotplug_done(void) { percpu_up_write(&mem_hotplug_lock); cpus_read_unlock(); } +EXPORT_SYMBOL(mem_hotplug_done); /* add this memory to iomem resource */ static struct resource *register_memory_resource(u64 start, u64 size) @@ -995,6 +997,7 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages, int online_typ memory_notify(MEM_ONLINE, &arg); return 0; } +EXPORT_SYMBOL(online_pages); #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ static void reset_node_present_pages(pg_data_t *pgdat) @@ -1124,6 +1127,25 @@ static int online_memory_block(struct memory_block *mem, void *arg) return device_online(&mem->dev); } +static int offline_memory_block(struct memory_block *mem, void *arg) +{ + return device_offline(&mem->dev); +} + +int online_memory_blocks(uint64_t start, uint64_t size) +{ + return walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), + NULL, online_memory_block); +} +EXPORT_SYMBOL(online_memory_blocks); + +int offline_memory_blocks(uint64_t start, uint64_t size) +{ + return walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), + NULL, offline_memory_block); +} +EXPORT_SYMBOL(offline_memory_blocks); + static int mark_memory_block_driver_managed(struct memory_block *mem, void *arg) { mem->driver_managed = true; @@ -1212,8 +1234,7 @@ int __ref add_memory_resource(int nid, struct resource *res, bool online, /* online pages if requested */ if (online) - walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), - NULL, online_memory_block); + online_memory_blocks(start, size); else if (driver_managed) walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), NULL, mark_memory_block_driver_managed); @@ -1312,6 +1333,7 @@ bool is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages) /* All pageblocks in the memory block are likely to be hot-removable */ return true; } +EXPORT_SYMBOL(is_mem_section_removable); /* * Confirm all pages in a range [start, end) belong to the same zone. @@ -1774,6 +1796,7 @@ int offline_pages(unsigned long start_pfn, unsigned long nr_pages, { return __offline_pages(start_pfn, start_pfn + nr_pages, retry_forever); } +EXPORT_SYMBOL(offline_pages); #endif /* CONFIG_MEMORY_HOTREMOVE */ /** -- 2.17.0