From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: AB8JxZobGHUw3OllZHlRjZWA4DsKCkTkov4wte7+OsSSkao4Fp0dD6/9tMScXr/UBgLS/PphFIjz ARC-Seal: i=1; a=rsa-sha256; t=1525081381; cv=none; d=google.com; s=arc-20160816; b=Gp5mtjI7fdco2YSyCd+xOcxux9dX+6WPWyeYmeuwhBIG09gRP4C+9r3EiZia9dBnu9 Sju4/icLiDPxyLgorLywyGJcySAYjmTylKkVUOJ8A5YS7YVSg3sIrvauR7sDa/uBTl0i D1hfXRjI2fIFM2tFir6WCdZqGV8Ku6FlSWgnh5t0AjrzQ63NRcmcAhNwFyO0hSgeKvz6 S9Vbj49zCxfbSq96WuWfyLWVnr27U4KBvd9O6db31L3o0omTMy7XoIgX5itHpwIBQ4gH lIvxVRDagfQ95DqpEm/M/qpD6x7FbzUtWo4FzQ8iVh29goRKCV0+7pgWAQYW7qBNTIo+ 2WtQ== 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 :arc-authentication-results; bh=k/kevtbN8t5jjZysacuzGBelZ/sEJRGUtgakmDP3mIA=; b=S4qdngjDibCD3Ek/vp27UU9zEbjDOsKmBmw20PoF9KmrJ7/JJSnEcPkrP2NMzE1JmC skZw4y6MY22qyXOD8y9XQMHKw0f0o+CfyawJLLIwGMLkmmrZdBZXFn+bG/bFUkPq2qJe /VcLJtrZh9ZbF+9VflrBoRGENMDrrt50c4ica8P9gNNv0uJ1V00M6sKRnwOdCw1wm5Wi ETNcPDbC7kA3rPjGCIfhLvbMpfpyXysz3QU07nMpWjLjRRXoH6JKQnELHgdDZzzajMup sXjmk8Jal0xflKuqRZfpPQf5BDDvcVSBbhzA5S1vtRAtSBjoKY1geYcJ4NqhxDxqiIXi LLYQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of david@redhat.com designates 66.187.233.73 as permitted sender) smtp.mailfrom=david@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Authentication-Results: mx.google.com; spf=pass (google.com: domain of david@redhat.com designates 66.187.233.73 as permitted sender) smtp.mailfrom=david@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com 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 RCFv2 7/7] mm/memory_hotplug: allow online/offline memory by a kernel module Date: Mon, 30 Apr 2018 11:42:36 +0200 Message-Id: <20180430094236.29056-8-david@redhat.com> In-Reply-To: <20180430094236.29056-1-david@redhat.com> References: <20180430094236.29056-1-david@redhat.com> X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1599163734643507607?= X-GMAIL-MSGID: =?utf-8?q?1599163734643507607?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: 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 c47cc68341fc..849bf0543fb1 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) @@ -980,6 +982,7 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages, int online_typ memory_notify(MEM_CANCEL_ONLINE, &arg); return ret; } +EXPORT_SYMBOL(online_pages); #endif /* CONFIG_MEMORY_HOTPLUG_SPARSE */ static void reset_node_present_pages(pg_data_t *pgdat) @@ -1109,6 +1112,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; @@ -1197,8 +1219,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); @@ -1297,6 +1318,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. @@ -1759,6 +1781,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.14.3