Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753631AbdDKO4U (ORCPT ); Tue, 11 Apr 2017 10:56:20 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:49982 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753017AbdDKO4S (ORCPT ); Tue, 11 Apr 2017 10:56:18 -0400 Date: Tue, 11 Apr 2017 15:56:04 +0100 From: Andrea Reale To: linux-arm-kernel@lists.infradead.org Cc: m.bielski@virtualopensystems.com, ar@linux.vnet.ibm.com, scott.branden@broadcom.com, will.deacon@arm.com, qiuxishi@huawei.com, f.fainelli@gmail.com, linux-kernel@vger.kernel.org Subject: [PATCH 5/5] Add "remove" probe driver for memory hot-remove References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-TM-AS-GCONF: 00 x-cbid: 17041114-0012-0000-0000-00000508185F X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17041114-0013-0000-0000-000018038FBD Message-Id: <0547052acd62958af1336281fcee8735c9d91d07.1491920514.git.ar@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-04-11_13:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1702020001 definitions=main-1704110115 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2460 Lines: 80 Allows to remove sections of memory that have been previously offlined from userspace. This is symmetric to the "memory probe" interface, as described in Documentation/memory-hotplug.txt. It can be used to manually notify the OS that one memory section has been removed. Please, remind that a memory section can only be removed after it has been logically off-lined; trying to remove a section which has not been previously off-lined is not supported and will have undefined (but most likely very bad) behaviour. To offline a section one can: # echo offline > /sys/devices/system/memory/memoryXXX/state To use the remove interface to remove the section: # echo $((0xYYYYYY)) > /sys/devices/system/memory/remove where 0xYYYYYY is the physical address of the memory section to remove. Signed-off-by: Andrea Reale Signed-off-by: Maciej Bielski --- drivers/base/memory.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/drivers/base/memory.c b/drivers/base/memory.c index cc4f1d0..8e033b5 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -511,7 +511,36 @@ static DEVICE_ATTR(auto_online_blocks, 0644, show_auto_online_blocks, } static DEVICE_ATTR(probe, S_IWUSR, NULL, memory_probe_store); -#endif + +#ifdef CONFIG_MEMORY_HOTREMOVE +static ssize_t +memory_remove_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + u64 phys_addr; + int nid, ret; + unsigned long pages_per_block = PAGES_PER_SECTION * sections_per_block; + + ret = kstrtoull(buf, 0, &phys_addr); + if (ret) + return ret; + + if (phys_addr & ((pages_per_block << PAGE_SHIFT) - 1)) + return -EINVAL; + + nid = memory_add_physaddr_to_nid(phys_addr); + ret = lock_device_hotplug_sysfs(); + if (ret) + return ret; + + remove_memory(nid, phys_addr, + MIN_MEMORY_BLOCK_SIZE * sections_per_block); + unlock_device_hotplug(); + return count; +} +static DEVICE_ATTR(remove, S_IWUSR, NULL, memory_remove_store); +#endif /* CONFIG_MEMORY_HOTREMOVE */ +#endif /* CONFIG_ARCH_MEMORY_PROBE */ #ifdef CONFIG_MEMORY_FAILURE /* @@ -776,6 +805,9 @@ bool is_memblock_offlined(struct memory_block *mem) static struct attribute *memory_root_attrs[] = { #ifdef CONFIG_ARCH_MEMORY_PROBE &dev_attr_probe.attr, +#ifdef CONFIG_MEMORY_HOTREMOVE + &dev_attr_remove.attr, +#endif #endif #ifdef CONFIG_MEMORY_FAILURE -- 1.9.1