From nobody Wed Oct 1 22:26:28 2025 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BE9E12F7454; Fri, 26 Sep 2025 13:15:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758892559; cv=none; b=PNTaxTC+7tetyyDctwVx7B2XGgj1UKYXRfLOcAdWNf12NM942KvN+UomgMHffIQZoomIKUsTcJm7QR2f0Ktn90/B1l12moHZcLVRDAcK4ZBE6iEuapJgfYUcuynqxWaovlTVNqq6WxYsZWBX09d8kldiFVY46A48reUYG24dkE4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758892559; c=relaxed/simple; bh=vd4QO7h7AVG5D6x3E+nRE7qRIoPxwgud2I17nY68UPk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cnk/iaEGhtV5Q2ZVADE5ZtB7pXoRAPRdyVj2L57IX/y51/cCLcqfmlyxHL2zUPmi6z/uFzQ8JWX97RbLHBWmEVVJpNuV7cSR4Rg/fO5oc3qSv7VSYiVXbXWlpBky7/m1vGHvm8MR9wIMTHc3Dlkg78NMoJO3MBVsd4OhNfiVaFU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=i8at7bHM; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="i8at7bHM" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 58Q6PN0W029313; Fri, 26 Sep 2025 13:15:51 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=gV/IEYO2glJLkKDxG Eoo83TGM27QnjVGn/AU6yyi65I=; b=i8at7bHMSmijNym+1atYYowrVL+bSKVtj x/4WgjfylhVAL1j3sBwCPkubLwan9v4P869/wzHdkddFpBxaaB90EIk0aeZJ3OuC 8EldLj6YzK+MaC88//fkhpHr4B1fbSzVqT35Pz9rf9x4DgMuSV0SGy+E/AJBWuUX z8cBXS6jYZ3lY0jDSYvOipxqkKEsv1g6j+NbkSkZ9qWpkTlFy1hwjH/+YBXhFoUJ c1wE7eKu9G6bS5lW22nGfUQ7pKISSLbjIR6Km0znOHSl+Bms6Zt6D+a8O8cfsMxT MKp7pIheqlbOzo4tZNoQk4WtPsXHZOh2Z6av99PvXxTjNyokAooXA== Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49dbb3vmqf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 26 Sep 2025 13:15:51 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 58QAS9mk025764; Fri, 26 Sep 2025 13:15:49 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 49dawpv5ne-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 26 Sep 2025 13:15:49 +0000 Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 58QDFj7512714382 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Sep 2025 13:15:45 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3B2C920043; Fri, 26 Sep 2025 13:15:45 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 195CB20040; Fri, 26 Sep 2025 13:15:45 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 26 Sep 2025 13:15:45 +0000 (GMT) From: Sumanth Korikkar To: Andrew Morton , David Hildenbrand , linux-mm Cc: LKML , linux-s390 , Gerald Schaefer , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Sumanth Korikkar Subject: [PATCH 1/4] s390/mm: Support removal of boot-allocated virtual memory map Date: Fri, 26 Sep 2025 15:15:24 +0200 Message-ID: <20250926131527.3260733-2-sumanthk@linux.ibm.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250926131527.3260733-1-sumanthk@linux.ibm.com> References: <20250926131527.3260733-1-sumanthk@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTI1MDE3NCBTYWx0ZWRfX6Oh5o/lzj5MP UKbmwzir5HNZy/pxOsr7IuqzJr5E3LSLxG2NZCUjUBhjG3Wxy2xaQYVw5Muw1F1nj6QjnE6hiEr 1DjAQQmBcR+l9enQqAlqehxq3IKwtLM4lbR+kMhmilqLSA22KOOvVdmbPrP8Tg3ICSfXa6Jl9KY 1DsEnrPxLYaYhMFX3lf0qKxb1KPmQKeWLEESmqJZjsK91dSQJPGKgTDJlz7XkaE5x43afGfMXQR qymCMfuvcpPAvZYGLz4aGCtXkfQqSesE0xq9/soDeIjF8hTRVQNmO3gXVktsKc3a7M7YXAkbYS0 TCFZ0sBIP7IgfjY26TPz1P8kD9hhvFOY81ZMzpGLtmRfCfsDiT44vByOuwWEwdZu4tq4EB8T/K2 F0oLj+qEyYw7rhUUiRe09SzMwxA89Q== X-Proofpoint-GUID: -VOXTBMVfTR0bzdJ_cUwsiAfDhyR18vo X-Authority-Analysis: v=2.4 cv=T/qBjvKQ c=1 sm=1 tr=0 ts=68d69207 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=yJojWOMRYYMA:10 a=VnNF1IyMAAAA:8 a=To8m7Vbe2ZeGRMaUrlAA:9 a=cPQSjfK2_nFv0Q5t_7PE:22 X-Proofpoint-ORIG-GUID: -VOXTBMVfTR0bzdJ_cUwsiAfDhyR18vo X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-26_03,2025-09-26_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 priorityscore=1501 impostorscore=0 suspectscore=0 lowpriorityscore=0 spamscore=0 adultscore=0 clxscore=1015 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2509150000 definitions=main-2509250174 Content-Type: text/plain; charset="utf-8" On s390, memory blocks are not currently removed via arch_remove_memory(). With upcoming dynamic memory (de)configuration support, runtime removal of memory blocks is possible. This internally involves tearing down identity mapping, virtual memory mappings and freeing the physical memory backing the struct pages metadata. During early boot, physical memory used to back the struct pages metadata in vmemmap is allocated through: setup_arch() -> sparse_init() -> sparse_init_nid() -> __populate_section_memmap() -> vmemmap_alloc_block_buf() -> sparse_buffer_alloc() -> memblock_alloc() Here, sparse_init_nid() sets up virtual-to-physical mapping for struct pages backed by memblock_alloc(). This differs from runtime addition of hotplug memory which uses the buddy allocator later. To correctly free identity mappings, vmemmap mappings during hot-remove, boot-time and runtime allocations must be distinguished using the PageReserved bit: * Boot-time memory, such as identity-mapped page tables allocated via boot_crst_alloc() and reserved via reserve_pgtables() is marked PageReserved in memmap_init_reserved_pages(). * Physical memory backing vmemmap (struct pages from memblock_alloc()) is also marked PageReserved similarly. During teardown, PageReserved bit is checked to distinguish between boot-time allocation or buddy allocation. This is similar to commit 645d5ce2f7d6 ("powerpc/mm/radix: Fix PTE/PMD fragment count for early page table mappings") Reviewed-by: Heiko Carstens Signed-off-by: Sumanth Korikkar --- arch/s390/mm/pgalloc.c | 2 ++ arch/s390/mm/vmem.c | 21 ++++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/arch/s390/mm/pgalloc.c b/arch/s390/mm/pgalloc.c index ad3e0f7f7fc1..596c05244ed0 100644 --- a/arch/s390/mm/pgalloc.c +++ b/arch/s390/mm/pgalloc.c @@ -164,6 +164,8 @@ void page_table_free(struct mm_struct *mm, unsigned lon= g *table) { struct ptdesc *ptdesc =3D virt_to_ptdesc(table); =20 + if (pagetable_is_reserved(ptdesc)) + return free_reserved_ptdesc(ptdesc); pagetable_dtor_free(ptdesc); } =20 diff --git a/arch/s390/mm/vmem.c b/arch/s390/mm/vmem.c index f48ef361bc83..d96587b84e81 100644 --- a/arch/s390/mm/vmem.c +++ b/arch/s390/mm/vmem.c @@ -4,6 +4,7 @@ */ =20 #include +#include #include #include #include @@ -39,15 +40,21 @@ static void __ref *vmem_alloc_pages(unsigned int order) =20 static void vmem_free_pages(unsigned long addr, int order, struct vmem_alt= map *altmap) { + unsigned int nr_pages =3D 1 << order; + struct page *page; + if (altmap) { vmem_altmap_free(altmap, 1 << order); return; } - /* We don't expect boot memory to be removed ever. */ - if (!slab_is_available() || - WARN_ON_ONCE(PageReserved(virt_to_page((void *)addr)))) - return; - free_pages(addr, order); + page =3D virt_to_page((void *)addr); + if (PageReserved(page)) { + /* allocated from memblock */ + while (nr_pages--) + free_bootmem_page(page++); + } else { + free_pages(addr, order); + } } =20 void *vmem_crst_alloc(unsigned long val) @@ -79,10 +86,6 @@ pte_t __ref *vmem_pte_alloc(void) =20 static void vmem_pte_free(unsigned long *table) { - /* We don't expect boot memory to be removed ever. */ - if (!slab_is_available() || - WARN_ON_ONCE(PageReserved(virt_to_page(table)))) - return; page_table_free(&init_mm, table); } =20 --=20 2.48.1 From nobody Wed Oct 1 22:26:28 2025 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B07B92F747F; Fri, 26 Sep 2025 13:15:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758892560; cv=none; b=URaX5r7lMxdSKauVw1T2LkossbdxAmmSvR60S2sZB4Oj+QHpds2xce5br1EfOpqE1+hCAiApPGJV8NL+X/Qvj9KuHjHvXhh1yuG5O6cvWfIeFG10F2a0Iw6TA783VRv/cCm1SdXLBb4xouh9/n6swYdwoOGcQBNjQjy9dKp2OLA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758892560; c=relaxed/simple; bh=JHhjy8s8GeqjrAqPnBlHhkVqAFt4UXmwJNgXoyRhD0Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=g1LvRwcwovaDxfu3FxDujwArUSMoLIEqnZa3vidh5Vc1MW4wc+za5Xhj4B+sB3CJEaRJQW0mlXum/9wcqXF71J6f6ZCakcVnZtyEr83lOhxf16TqpjlIVbxulpYgeKIYUCq9OAxBa1A9dwGrVBmkw1pw/BQVFlx+abj4j/I8xg8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=ZeuFrUnp; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="ZeuFrUnp" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 58Q84hU5017942; Fri, 26 Sep 2025 13:15:52 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=CCMInHtj909hnirOt T6cwhAW5aiD5aGOznaoZ/fwXnE=; b=ZeuFrUnp38E4uyL9pa6tcSwWt9TLkWMbE Cq/mlGmg0dh3VN56afRJQPWvOYGzTXmBjT3HHF20Ak1CibQrp5vJ7kVoTnB96XGf akdnjhni92ZWipcGKJqkce9nzdMFBkviFxVhuBjQ2ikRnvNVzRlv7yUsH9CmHCS4 zBSGMMX7DhcOT14PKoqlmPiOIscrePgoVDmhrewoZdpURKWvHpVOcgm/mxsn4D7V o1DVaIx8+YKknQV+X+fJmp/W4VDHWOkXtilBmopdJCgbJTxUW2IruaVp85v8/xwM PfeMymrYMMd+Ic9etJZtRNANTgmWPQZfN9i0BS84YseYVrIZBHF3w== Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49dbbdcqc4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 26 Sep 2025 13:15:52 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 58QAEbFW014292; Fri, 26 Sep 2025 13:15:51 GMT Received: from smtprelay02.fra02v.mail.ibm.com ([9.218.2.226]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 49dawm44xk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 26 Sep 2025 13:15:51 +0000 Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay02.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 58QDFlPg51315030 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Sep 2025 13:15:47 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 32DD920043; Fri, 26 Sep 2025 13:15:47 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 002BF20040; Fri, 26 Sep 2025 13:15:47 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 26 Sep 2025 13:15:46 +0000 (GMT) From: Sumanth Korikkar To: Andrew Morton , David Hildenbrand , linux-mm Cc: LKML , linux-s390 , Gerald Schaefer , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Sumanth Korikkar Subject: [PATCH 2/4] s390/sclp: Add support for dynamic (de)configuration of memory Date: Fri, 26 Sep 2025 15:15:25 +0200 Message-ID: <20250926131527.3260733-3-sumanthk@linux.ibm.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250926131527.3260733-1-sumanthk@linux.ibm.com> References: <20250926131527.3260733-1-sumanthk@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=F/Jat6hN c=1 sm=1 tr=0 ts=68d69208 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=yJojWOMRYYMA:10 a=VwQbUJbxAAAA:8 a=20KFwNOVAAAA:8 a=VnNF1IyMAAAA:8 a=pwR9EbB1U1O9CTILHhwA:9 a=cPQSjfK2_nFv0Q5t_7PE:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTI1MDE3NCBTYWx0ZWRfXy2Gtu7DUbt3Y zeHnh/YNLdqGo5IaM392aFPK1BcChDKp+EGcxxMFtE5u9BqNlEmIKJ2EjJ07A0mshxDsXDY1YDQ sOhSLyDvNKQdLGmZcLe1utN8knanpILJfPcoCMbdPFiSkydZlPtyqXUfUCBdtDZdR17q/hqPPLy QeyY8I67ksbbdkgw7x58bCmgJxlmQbNQWI4HIXQPjrL9AGufocxbaf+4xPEMrUjdK0nLXej0r5G FY5jR0BElirMcXr6jXOcnGIkT5iEWsbGInAqvMcsaZqHHRHexegJtiu7poDVVy+X7lTy9Z/E39r EDGTke7lvHnC0Qa4pffLLcnbhd8+n0YXlPS3o4W8dlZw2EmGRpK0i+MJHpu4dKoeQK41ptFmbPK slVNn3iqT6WitrUoq53RSphR9796PQ== X-Proofpoint-GUID: Ef3v96XAo9LvaLjWrxJxSrUkulDATlB7 X-Proofpoint-ORIG-GUID: Ef3v96XAo9LvaLjWrxJxSrUkulDATlB7 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-26_04,2025-09-26_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 priorityscore=1501 malwarescore=0 spamscore=0 phishscore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2509150000 definitions=main-2509250174 Content-Type: text/plain; charset="utf-8" Provide a new interface for dynamic configuration and deconfiguration of hotplug memory, allowing with/without memmap_on_memory support. It is a follow up on the discussion with David when introducing memmap_on_memory support for s390 and support dynamic (de)configuration of memory: https://lore.kernel.org/all/ee492da8-74b4-4a97-8b24-73e07257f01d@redhat.com/ https://lore.kernel.org/all/20241202082732.3959803-1-sumanthk@linux.ibm.com/ The original motivation for introducing memmap_on_memory on s390 was to avoid using online memory to store struct pages metadata, particularly for standby memory blocks. This became critical in cases where there was an imbalance between standby and online memory, potentially leading to boot failures due to insufficient memory for metadata allocation. To address this, memmap_on_memory was utilized on s390. However, in its current form, it adds struct pages metadata at the start of each memory block at the time of addition and this configuration is static. It cannot be changed at runtime. (When the user needs continuous physical memory). Inorder to provide more flexibility to the user and overcome the above limitation, add option to dynamically configure and deconfigure hotpluggable memory block with/without memmap_on_memory. With the new interface, s390 will not add all possible hotplug memory in advance, like before, to make it visible in sysfs for online/offline actions. Instead, before memory block can be set online, it has to be configured via a new interface in /sys/firmware/memory/memoryX/config, which makes s390 similar to others. i.e. Adding of hotpluggable memory is controlled by the user instead of adding it at boottime. The s390 kernel sysfs interface to configure and deconfigure memory is as follows (considering the upcoming lsmem changes): * Initial memory layout: lsmem -o RANGE,SIZE,STATE,BLOCK,CONFIGURED,MEMMAP_ON_MEMORY RANGE SIZE STATE BLOCK CONFIGURED MEMMAP_ON_MEMORY 0x00000000-0x7fffffff 2G online 0-15 yes no 0x80000000-0xffffffff 2G offline 16-31 no yes * Configure memory sys=3D"/sys" echo 1 > $sys/firmware/memory/memory16/config lsmem -o RANGE,SIZE,STATE,BLOCK,CONFIGURED,MEMMAP_ON_MEMORY RANGE SIZE STATE BLOCK CONFIGURED MEMMAP_ON_MEMORY 0x00000000-0x7fffffff 2G online 0-15 yes no 0x80000000-0x87ffffff 128M offline 16 yes yes 0x88000000-0xffffffff 1.9G offline 17-31 no yes * Deconfigure memory echo 0 > $sys/firmware/memory/memory16/config lsmem -o RANGE,SIZE,STATE,BLOCK,CONFIGURED,MEMMAP_ON_MEMORY RANGE SIZE STATE BLOCK CONFIGURED MEMMAP_ON_MEMORY 0x00000000-0x7fffffff 2G online 0-15 yes no 0x80000000-0xffffffff 2G offline 16-31 no yes 3. Enable memmap_on_memory and online it. echo 0 > $sys/devices/system/memory/memory5/online echo 0 > $sys/firmware/memory/memory5/config lsmem -o RANGE,SIZE,STATE,BLOCK,CONFIGURED,MEMMAP_ON_MEMORY RANGE SIZE STATE BLOCK CONFIGURED MEMMAP_ON_MEMORY 0x00000000-0x27ffffff 640M online 0-4 yes no 0x28000000-0x2fffffff 128M offline 5 no no 0x30000000-0x7fffffff 1.3G online 6-15 yes no 0x80000000-0xffffffff 2G offline 16-31 no yes echo 1 > $sys/firmware/memory/memory5/memmap_on_memory echo 1 > $sys/firmware/memory/memory5/config echo 1 > $sys/devices/system/memory/memory5/online lsmem -o RANGE,SIZE,STATE,BLOCK,CONFIGURED,MEMMAP_ON_MEMORY RANGE SIZE STATE BLOCK CONFIGURED MEMMAP_ON_MEMORY 0x00000000-0x27ffffff 640M online 0-4 yes no 0x28000000-0x2fffffff 128M online 5 yes yes 0x30000000-0x7fffffff 1.3G online 6-15 yes no 0x80000000-0xffffffff 2G offline 16-31 no yes 4. Disable memmap_on_memory and online it. echo 0 > $sys/devices/system/memory/memory5/online echo 0 > $sys/firmware/memory/memory5/config lsmem -o RANGE,SIZE,STATE,BLOCK,CONFIGURED,MEMMAP_ON_MEMORY RANGE SIZE STATE BLOCK CONFIGURED MEMMAP_ON_MEMORY 0x00000000-0x27ffffff 640M online 0-4 yes no 0x28000000-0x2fffffff 128M offline 5 no yes 0x30000000-0x7fffffff 1.3G online 6-15 yes no 0x80000000-0xffffffff 2G offline 16-31 no yes echo 0 > $sys/firmware/memory/memory5/memmap_on_memory echo 1 > $sys/firmware/memory/memory5/config echo 1 > $sys/devices/system/memory/memory5/online lsmem -o RANGE,SIZE,STATE,BLOCK,CONFIGURED,MEMMAP_ON_MEMORY RANGE SIZE STATE BLOCK CONFIGURED MEMMAP_ON_MEMORY 0x00000000-0x7fffffff 2G online 0-15 yes no 0x80000000-0xffffffff 2G offline 16-31 no yes Acked-by: Heiko Carstens Signed-off-by: Sumanth Korikkar --- drivers/s390/char/sclp_mem.c | 291 +++++++++++++++++++++++++++++------ 1 file changed, 241 insertions(+), 50 deletions(-) diff --git a/drivers/s390/char/sclp_mem.c b/drivers/s390/char/sclp_mem.c index 27f49f5fd358..802439230294 100644 --- a/drivers/s390/char/sclp_mem.c +++ b/drivers/s390/char/sclp_mem.c @@ -9,9 +9,12 @@ #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt =20 #include +#include #include #include #include +#include +#include #include #include #include @@ -27,7 +30,6 @@ #define SCLP_CMDW_ASSIGN_STORAGE 0x000d0001 #define SCLP_CMDW_UNASSIGN_STORAGE 0x000c0001 =20 -static DEFINE_MUTEX(sclp_mem_mutex); static LIST_HEAD(sclp_mem_list); static u8 sclp_max_storage_id; static DECLARE_BITMAP(sclp_storage_ids, 256); @@ -38,6 +40,18 @@ struct memory_increment { int standby; }; =20 +struct mblock { + struct kobject kobj; + unsigned int id; + unsigned int memmap_on_memory; + unsigned int config; +}; + +struct memory_block_arg { + struct mblock *mblocks; + struct kset *kset; +}; + struct assign_storage_sccb { struct sccb_header header; u16 rn; @@ -185,15 +199,11 @@ static int sclp_mem_notifier(struct notifier_block *n= b, { unsigned long start, size; struct memory_notify *arg; - unsigned char id; int rc =3D 0; =20 arg =3D data; start =3D arg->start_pfn << PAGE_SHIFT; size =3D arg->nr_pages << PAGE_SHIFT; - mutex_lock(&sclp_mem_mutex); - for_each_clear_bit(id, sclp_storage_ids, sclp_max_storage_id + 1) - sclp_attach_storage(id); switch (action) { case MEM_GOING_OFFLINE: /* @@ -204,45 +214,201 @@ static int sclp_mem_notifier(struct notifier_block *= nb, if (contains_standby_increment(start, start + size)) rc =3D -EPERM; break; - case MEM_PREPARE_ONLINE: - /* - * Access the altmap_start_pfn and altmap_nr_pages fields - * within the struct memory_notify specifically when dealing - * with only MEM_PREPARE_ONLINE/MEM_FINISH_OFFLINE notifiers. - * - * When altmap is in use, take the specified memory range - * online, which includes the altmap. - */ - if (arg->altmap_nr_pages) { - start =3D PFN_PHYS(arg->altmap_start_pfn); - size +=3D PFN_PHYS(arg->altmap_nr_pages); - } - rc =3D sclp_mem_change_state(start, size, 1); - if (rc || !arg->altmap_nr_pages) - break; - /* - * Set CMMA state to nodat here, since the struct page memory - * at the beginning of the memory block will not go through the - * buddy allocator later. - */ - __arch_set_page_nodat((void *)__va(start), arg->altmap_nr_pages); + default: break; - case MEM_FINISH_OFFLINE: + } + return rc ? NOTIFY_BAD : NOTIFY_OK; +} + +static ssize_t config_mblock_show(struct kobject *kobj, struct kobj_attrib= ute *attr, char *buf) +{ + struct mblock *mblock =3D container_of(kobj, struct mblock, kobj); + + return sysfs_emit(buf, "%u\n", READ_ONCE(mblock->config)); +} + +static ssize_t config_mblock_store(struct kobject *kobj, struct kobj_attri= bute *attr, + const char *buf, size_t count) +{ + unsigned long long addr, block_size; + struct memory_block *mem; + struct mblock *mblock; + unsigned char id; + bool value; + int rc; + + rc =3D kstrtobool(buf, &value); + if (rc) + return rc; + mblock =3D container_of(kobj, struct mblock, kobj); + block_size =3D memory_block_size_bytes(); + addr =3D mblock->id * block_size; + /* + * Hold device_hotplug_lock when adding/removing memory blocks. + * Additionally, also protect calls to find_memory_block() and + * sclp_attach_storage(). + */ + rc =3D lock_device_hotplug_sysfs(); + if (rc) + goto out; + for_each_clear_bit(id, sclp_storage_ids, sclp_max_storage_id + 1) + sclp_attach_storage(id); + if (value) { + if (mblock->config) + goto out_unlock; + rc =3D sclp_mem_change_state(addr, block_size, 1); + if (rc) + goto out_unlock; /* - * When altmap is in use, take the specified memory range - * offline, which includes the altmap. + * Set entire memory block CMMA state to nodat. Later, when + * page tables pages are allocated via __add_memory(), those + * regions are marked __arch_set_page_dat(). */ - if (arg->altmap_nr_pages) { - start =3D PFN_PHYS(arg->altmap_start_pfn); - size +=3D PFN_PHYS(arg->altmap_nr_pages); + __arch_set_page_nodat((void *)__va(addr), block_size >> PAGE_SHIFT); + rc =3D __add_memory(0, addr, block_size, + mblock->memmap_on_memory ? + MHP_MEMMAP_ON_MEMORY | MHP_OFFLINE_INACCESSIBLE : MHP_NONE); + if (rc) + goto out_unlock; + mem =3D find_memory_block(pfn_to_section_nr(PFN_DOWN(addr))); + put_device(&mem->dev); + WRITE_ONCE(mblock->config, 1); + } else { + if (!mblock->config) + goto out_unlock; + mem =3D find_memory_block(pfn_to_section_nr(PFN_DOWN(addr))); + if (mem->state !=3D MEM_OFFLINE) { + put_device(&mem->dev); + rc =3D -EBUSY; + goto out_unlock; } - sclp_mem_change_state(start, size, 0); - break; - default: - break; + /* drop the ref just got via find_memory_block() */ + put_device(&mem->dev); + sclp_mem_change_state(addr, block_size, 0); + __remove_memory(addr, block_size); + WRITE_ONCE(mblock->config, 0); } - mutex_unlock(&sclp_mem_mutex); - return rc ? NOTIFY_BAD : NOTIFY_OK; +out_unlock: + unlock_device_hotplug(); +out: + return rc ? rc : count; +} + +static ssize_t memmap_on_memory_show(struct kobject *kobj, struct kobj_att= ribute *attr, char *buf) +{ + struct mblock *mblock =3D container_of(kobj, struct mblock, kobj); + + return sysfs_emit(buf, "%u\n", READ_ONCE(mblock->memmap_on_memory)); +} + +static ssize_t memmap_on_memory_store(struct kobject *kobj, struct kobj_at= tribute *attr, + const char *buf, size_t count) +{ + unsigned long block_size; + struct memory_block *mem; + struct mblock *mblock; + bool value; + int rc; + + rc =3D kstrtobool(buf, &value); + if (rc) + return rc; + rc =3D lock_device_hotplug_sysfs(); + if (rc) + return rc; + block_size =3D memory_block_size_bytes(); + mblock =3D container_of(kobj, struct mblock, kobj); + mem =3D find_memory_block(pfn_to_section_nr(PFN_DOWN(mblock->id * block_s= ize))); + if (!mem) { + WRITE_ONCE(mblock->memmap_on_memory, value); + } else { + put_device(&mem->dev); + rc =3D -EBUSY; + } + unlock_device_hotplug(); + return rc ? rc : count; +} + +static void mblock_sysfs_release(struct kobject *kobj) +{ + struct mblock *mblock =3D container_of(kobj, struct mblock, kobj); + + kfree(mblock); +} + +static const struct kobj_type ktype =3D { + .release =3D mblock_sysfs_release, + .sysfs_ops =3D &kobj_sysfs_ops, +}; + +static struct kobj_attribute memmap_attr =3D + __ATTR(memmap_on_memory, 0644, memmap_on_memory_show, memmap_on_memory_st= ore); +static struct kobj_attribute config_attr =3D + __ATTR(config, 0644, config_mblock_show, config_mblock_store); + +static struct attribute *mblock_attrs[] =3D { + &memmap_attr.attr, + &config_attr.attr, + NULL, +}; + +static struct attribute_group mblock_attr_group =3D { + .attrs =3D mblock_attrs, +}; + +static int create_mblock(struct mblock *mblock, struct kset *kset, + unsigned int id, bool config, bool memmap_on_memory) +{ + int rc; + + mblock->memmap_on_memory =3D memmap_on_memory; + mblock->config =3D config; + mblock->id =3D id; + kobject_init(&mblock->kobj, &ktype); + rc =3D kobject_add(&mblock->kobj, &kset->kobj, "memory%d", id); + if (rc) + return rc; + rc =3D sysfs_create_group(&mblock->kobj, &mblock_attr_group); + if (rc) + kobject_put(&mblock->kobj); + return rc; +} + +/* + * Create /sys/firmware/memory/memoryX for boottime configured online memo= ry + * blocks + */ +static int create_online_mblock(struct memory_block *mem, void *argument) +{ + struct memory_block_arg *arg; + struct mblock *mblocks; + struct kset *kset; + unsigned int id; + + id =3D mem->dev.id; + arg =3D (struct memory_block_arg *)argument; + mblocks =3D arg->mblocks; + kset =3D arg->kset; + return create_mblock(&mblocks[id], kset, id, true, false); +} + +static int __init create_initial_online_mblocks(struct mblock *mblocks, st= ruct kset *kset) +{ + struct memory_block_arg arg; + + arg.mblocks =3D mblocks; + arg.kset =3D kset; + return for_each_memory_block(&arg, create_online_mblock); +} + +static struct mblock * __init allocate_mblocks(void) +{ + u64 max_mblocks; + u64 block_size; + + block_size =3D memory_block_size_bytes(); + max_mblocks =3D roundup(sclp.rnmax * sclp.rzm, block_size) / block_size; + return kcalloc(max_mblocks, sizeof(struct mblock), GFP_KERNEL); } =20 static struct notifier_block sclp_mem_nb =3D { @@ -264,14 +430,17 @@ static void __init align_to_block_size(unsigned long = *start, *size =3D size_align; } =20 -static void __init add_memory_merged(u16 rn) +static int __init create_standby_mblocks_merged(struct mblock *mblocks, + struct kset *kset, u16 rn) { unsigned long start, size, addr, block_size; static u16 first_rn, num; + unsigned int id; + int rc =3D 0; =20 if (rn && first_rn && (first_rn + num =3D=3D rn)) { num++; - return; + return rc; } if (!first_rn) goto skip_add; @@ -286,24 +455,31 @@ static void __init add_memory_merged(u16 rn) if (!size) goto skip_add; for (addr =3D start; addr < start + size; addr +=3D block_size) { - add_memory(0, addr, block_size, - cpu_has_edat1() ? - MHP_MEMMAP_ON_MEMORY | MHP_OFFLINE_INACCESSIBLE : MHP_NONE); + id =3D addr / block_size; + rc =3D create_mblock(&mblocks[id], kset, id, false, mhp_supports_memmap_= on_memory()); + if (rc) + break; } skip_add: first_rn =3D rn; num =3D 1; + return rc; } =20 -static void __init sclp_add_standby_memory(void) +static int __init create_standby_mblocks(struct mblock *mblocks, struct ks= et *kset) { struct memory_increment *incr; + int rc =3D 0; =20 list_for_each_entry(incr, &sclp_mem_list, list) { if (incr->standby) - add_memory_merged(incr->rn); + rc =3D create_standby_mblocks_merged(mblocks, kset, incr->rn); + if (rc) + goto out; } - add_memory_merged(0); + rc =3D create_standby_mblocks_merged(mblocks, kset, 0); +out: + return rc; } =20 static void __init insert_increment(u16 rn, int standby, int assigned) @@ -336,10 +512,12 @@ static void __init insert_increment(u16 rn, int stand= by, int assigned) list_add(&new_incr->list, prev); } =20 -static int __init sclp_detect_standby_memory(void) +static int __init sclp_setup_memory(void) { struct read_storage_sccb *sccb; int i, id, assigned, rc; + struct mblock *mblocks; + struct kset *kset; =20 /* No standby memory in kdump mode */ if (oldmem_data.start) @@ -391,9 +569,22 @@ static int __init sclp_detect_standby_memory(void) rc =3D register_memory_notifier(&sclp_mem_nb); if (rc) goto out; - sclp_add_standby_memory(); + mblocks =3D allocate_mblocks(); + if (!mblocks) { + rc =3D -ENOMEM; + goto out; + } + kset =3D kset_create_and_add("memory", NULL, firmware_kobj); + if (!kset) { + rc =3D -ENOMEM; + goto out; + } + rc =3D create_initial_online_mblocks(mblocks, kset); + if (rc) + goto out; + rc =3D create_standby_mblocks(mblocks, kset); out: free_page((unsigned long)sccb); return rc; } -__initcall(sclp_detect_standby_memory); +__initcall(sclp_setup_memory); --=20 2.48.1 From nobody Wed Oct 1 22:26:28 2025 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DAFAC2F7AA3; Fri, 26 Sep 2025 13:15:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758892560; cv=none; b=ofDYhx335JnRMe6HrsTAftGD1odLOxbGw7n5oUNNb5/ozz+gRz5UmxY4gVFocXYMLF/l+9m93HNZ8UJq8hBkJlqTLFNsapkdjONNXga2zcTFwnNoObskpfqSktUrjSjtQS4oE+CV7DDrG6MwiMnH5Yocu26FL0mEJ5J1uUOjpws= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758892560; c=relaxed/simple; bh=tdgLgatgEVJpMzjlKVgPI2OptBOd77BUr/W6B8VcBHc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N+UXY5vjy1R+2F20rAS5F3vDyD2hJCNa7l1tNMNJsYhguakj7qRXbRsFcNusS8f+wtwmHDdpTE8uLtHRsPy4k6TT73LNJQMbm3W51GwUxEGm/7dh14xLiC04v0zNgpOsObaUgSJJi8f9iIviJLMPsrhtVnMMI7O2JQuwrfAxGzg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=G4fYiew5; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="G4fYiew5" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 58Q5O1f6028832; Fri, 26 Sep 2025 13:15:53 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=CtgZ8+iO1ueeY3gMX Ex6CkqtU3/2YuF7qvH0Ti5mWwc=; b=G4fYiew5oiyGM9+Hq/2lvYxVOOqrejTcR yPFrlULLKknEfAxcATDP/WUwvfI02pM9GBlUr5GUrBZCoMQx0vrD32DsU/Siy45h v48XOPiOCZnDtfwGc9otACGsrM3GDth54qCCN772cDUmRvdt4lBhlhZoj25nlqY4 4oGQf5JAK+ZuwYz4lSDqh8dIrErp5JiEFmNqD8jso/YKIJAJEtUXMqj7142WO7dK hkQYmm8vj3MGQX5xnZRD6ZTtuBTS48Wx146aa1O4SNmZvLy8LGQpGDZiLvXACEpG oQCy5OMrofDiEdCjgkOlp8eUY5aEb2YlW2//Bbl3lGz77vCu/uYVA== Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49dbbbmpny-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 26 Sep 2025 13:15:53 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 58QAVUWG010035; Fri, 26 Sep 2025 13:15:52 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 49dawq450v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 26 Sep 2025 13:15:52 +0000 Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 58QDFmH329688108 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Sep 2025 13:15:49 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D301520043; Fri, 26 Sep 2025 13:15:48 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A8DC420040; Fri, 26 Sep 2025 13:15:48 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 26 Sep 2025 13:15:48 +0000 (GMT) From: Sumanth Korikkar To: Andrew Morton , David Hildenbrand , linux-mm Cc: LKML , linux-s390 , Gerald Schaefer , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Sumanth Korikkar Subject: [PATCH 3/4] s390/sclp: Remove MHP_OFFLINE_INACCESSIBLE Date: Fri, 26 Sep 2025 15:15:26 +0200 Message-ID: <20250926131527.3260733-4-sumanthk@linux.ibm.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250926131527.3260733-1-sumanthk@linux.ibm.com> References: <20250926131527.3260733-1-sumanthk@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: hN-2WtSxn6u81hiCYsJmqwsZzqsrdF5H X-Authority-Analysis: v=2.4 cv=LakxKzfi c=1 sm=1 tr=0 ts=68d69209 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=yJojWOMRYYMA:10 a=VnNF1IyMAAAA:8 a=f30ByJGsKnh_ESHQSg4A:9 a=cPQSjfK2_nFv0Q5t_7PE:22 X-Proofpoint-GUID: hN-2WtSxn6u81hiCYsJmqwsZzqsrdF5H X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTI1MDE3NCBTYWx0ZWRfX/ptYI8Up3RKz ehXD+jkDZjRogvAlsPYmrMzoscb9zKvUFFS1FXnP1pd6hi5rYdlDaQJWaRUr0RgHhIK5yBqije0 uJQigGWv34T8A8mWXYT5iUJdMPwyjroeDo37g906ocBgpoTomVcpY3Tn9OoGT/jtdCzvizTRaf3 02Gw7Ek6HZ8L8b6BRlpQW/EwL8Ae/RCuIUeYGAD2rPdQa60bHuIJd5JYozvHEH4VvOLKsYup8TR qpundNvgS0nzGKGBpz0XHtD1ydyDMNZYjyx3f6lKO1QaKgGSDeDnSLxThXbroLejUvwEjL2w9Dg m4DXNrfXXU4X0lx8BCpSEYrysxZ3SGRwinEpnxl/tGVglZnLUpOVfuFukAp9K32ODv0VywLXt5j B4cys4jC4SA73y3TRl36M126XeOZ5g== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-26_04,2025-09-26_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 spamscore=0 bulkscore=0 adultscore=0 clxscore=1015 impostorscore=0 priorityscore=1501 malwarescore=0 phishscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2509150000 definitions=main-2509250174 Content-Type: text/plain; charset="utf-8" mhp_flag MHP_OFFLINE_INACCESSIBLE was used to mark memory as not accessible until memory hotplug online phase begins. Earlier, standby memory blocks were added upfront during boottime and MHP_OFFLINE_INACCESSIBLE flag avoided page_init_poison() on memmap during mhp addtion phase. However with dynamic runtime configuration of memory, standby memory can be brought to accessible state before performing add_memory(). Hence, remove MHP_OFFLINE_INACCESSIBLE. Acked-by: Heiko Carstens Signed-off-by: Sumanth Korikkar --- drivers/s390/char/sclp_mem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/s390/char/sclp_mem.c b/drivers/s390/char/sclp_mem.c index 802439230294..f49b8457e721 100644 --- a/drivers/s390/char/sclp_mem.c +++ b/drivers/s390/char/sclp_mem.c @@ -267,7 +267,7 @@ static ssize_t config_mblock_store(struct kobject *kobj= , struct kobj_attribute * __arch_set_page_nodat((void *)__va(addr), block_size >> PAGE_SHIFT); rc =3D __add_memory(0, addr, block_size, mblock->memmap_on_memory ? - MHP_MEMMAP_ON_MEMORY | MHP_OFFLINE_INACCESSIBLE : MHP_NONE); + MHP_MEMMAP_ON_MEMORY : MHP_NONE); if (rc) goto out_unlock; mem =3D find_memory_block(pfn_to_section_nr(PFN_DOWN(addr))); --=20 2.48.1 From nobody Wed Oct 1 22:26:28 2025 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B59132FBDF2; Fri, 26 Sep 2025 13:16:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758892564; cv=none; b=ExYQvTN/5Zl+L3q/Qhejhb6bMm/nFyUVdiPR5zbTfOWRFhEgRpTsttJfVPxfw/wqf9Gq3iPWrsGY0Fc4bLZ6B4uIKIhXYgUWwJbTXyHoGiiQGWRwkbjRPlgpLEL1XvQJfLbHx9/KGXu5Etao9j4Mm+zSq7cyd8NVsqB/7MknkHs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758892564; c=relaxed/simple; bh=Tr3BS1kXKpPCpI+bBzlyko7U56zoI+WhQoCJGijVl14=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DT5dsIpt6P1pTUGHXgkZtVN0/Q11tHA01kaSSfU7Zc3u4S72SyqBT4262saBjyd6bEHwo8zZ0T0HoSf/Xs464Dq++lgCLmcCU8Sr5dyqAPEtTx+fwIu/vb8nYf9SgIHMIEP6f79EuziP9plZpTTZd+oXGxvkKvo6NJOaHNZ8gjk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=I8s2oBiz; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="I8s2oBiz" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 58Q7Va1M017943; Fri, 26 Sep 2025 13:15:56 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=lH43ym57j6oeb9QqS BHnLDAMK6emsEJ0+JYF/U+O3AU=; b=I8s2oBizyYzr8Gm62B9PYypKw4IMdmFsU o7p2moc7cMcP6VHKAfySeaLp0lv74XjVcD7gtvNLKKPSy18AL+6+05Sy2N5bbauB yT9QAE8iN38XrggyX+S7Cr0SII5E1cBnsdeveRdMMuWOi+X7CD4KKzVV8RanYD/F wNQ6mEiVmwSzVzRN4hOg5EGy63HftyU8vOCgRTmx5/p2u3tDlppaSEwIUglqUs90 KnVpN/yMPjsojL7BvptMACjC63ZkvUzV0be3ymmFXgEleLUb4Qg//AZKxL14lNIX t6IghYmkfAz9pKzzkMyb/yYiYbWJfP7KCunRrTW1aZ2JTZ1Grk4uw== Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49dbbdcqcd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 26 Sep 2025 13:15:55 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 58Q9qEa8023724; Fri, 26 Sep 2025 13:15:54 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 49ddbd3dsu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 26 Sep 2025 13:15:54 +0000 Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 58QDFoaU62521654 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Sep 2025 13:15:50 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B9DEA20043; Fri, 26 Sep 2025 13:15:50 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 90F2B20040; Fri, 26 Sep 2025 13:15:50 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Fri, 26 Sep 2025 13:15:50 +0000 (GMT) From: Sumanth Korikkar To: Andrew Morton , David Hildenbrand , linux-mm Cc: LKML , linux-s390 , Gerald Schaefer , Heiko Carstens , Vasily Gorbik , Alexander Gordeev , Sumanth Korikkar Subject: [PATCH 4/4] mm/memory_hotplug: Remove MEM_PREPARE_ONLINE/MEM_FINISH_OFFLINE notifiers Date: Fri, 26 Sep 2025 15:15:27 +0200 Message-ID: <20250926131527.3260733-5-sumanthk@linux.ibm.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250926131527.3260733-1-sumanthk@linux.ibm.com> References: <20250926131527.3260733-1-sumanthk@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=F/Jat6hN c=1 sm=1 tr=0 ts=68d6920c cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=yJojWOMRYYMA:10 a=VnNF1IyMAAAA:8 a=rQaNfnSK3a-WYbhgV1gA:9 a=cPQSjfK2_nFv0Q5t_7PE:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTI1MDE3NCBTYWx0ZWRfX0hjtkqhGmUCt bd6Gg5GGexm8M2i0HtXWlmTWzhEURzPt1XNWNjmCJ5adV5cp0mBi4Kdnii373Dlp/G7wao2fxBK y/r7EJuNQ5Y+2MTYEFMVGXje5u5w+bpDsvLajE3c/yEuawpqOYdusFm57fuNiyI15+eBTslD3ji PxxBO2/uOXhTVcc1qHEzlpWpJf1Dx887sSE6sLsEpLj/GCVO76gUDUtcUvB4G+Q6DKXY2inSJn0 Y6ZOsa6v5BYqHqpC3UycwArZQQ5dNN6UGkuviMFoEaI2a/j8xNKCa6eM3h66WhF9exHgQTT87XD LPtM1Kid7COtUzHeU5Uiy5n3cOPkqUCo9EDlGiwQWaPwkOo1Vxejz5C+K8Y+N6fSpOGcnETGQlT q2x9FWA7lZZFj2SIy/dd24pOFZqcfQ== X-Proofpoint-GUID: M4_GZJeR_0qDItlTmbLDGVsgp0Ovpx-3 X-Proofpoint-ORIG-GUID: M4_GZJeR_0qDItlTmbLDGVsgp0Ovpx-3 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-26_04,2025-09-26_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 priorityscore=1501 malwarescore=0 spamscore=0 phishscore=0 lowpriorityscore=0 clxscore=1015 adultscore=0 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2509150000 definitions=main-2509250174 Content-Type: text/plain; charset="utf-8" MEM_PREPARE_ONLINE/MEM_FINISH_OFFLINE memory notifiers were introduced to prepare the transition of memory to and from a physically accessible state. This enhancement was crucial for implementing the "memmap on memory" feature for s390. With introduction of dynamic (de)configuration of hotpluggable memory, memory can be brought to accessible state before add_memory(). Memory can be brought to inaccessible state before remove_memory(). Hence, there is no need of MEM_PREPARE_ONLINE/MEM_FINISH_OFFLINE memory notifiers anymore. This basically reverts commit c5f1e2d18909 ("mm/memory_hotplug: introduce MEM_PREPARE_ONLINE/MEM_FINISH_O= FFLINE notifiers") Additionally, apply minor adjustments to the function parameters of move_pfn_range_to_zone() and mhp_supports_memmap_on_memory() to ensure compatibility with the latest branch. Signed-off-by: Sumanth Korikkar --- drivers/base/memory.c | 23 +---------------------- include/linux/memory.h | 9 --------- include/linux/memory_hotplug.h | 18 +----------------- include/linux/memremap.h | 1 - mm/memory_hotplug.c | 17 +++-------------- mm/sparse.c | 3 +-- 6 files changed, 6 insertions(+), 65 deletions(-) diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 5c6c1d6bb59f..67a41575ac77 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -226,7 +226,6 @@ static int memory_block_online(struct memory_block *mem) unsigned long start_pfn =3D section_nr_to_pfn(mem->start_section_nr); unsigned long nr_pages =3D PAGES_PER_SECTION * sections_per_block; unsigned long nr_vmemmap_pages =3D 0; - struct memory_notify arg; struct zone *zone; int ret; =20 @@ -246,19 +245,9 @@ static int memory_block_online(struct memory_block *me= m) if (mem->altmap) nr_vmemmap_pages =3D mem->altmap->free; =20 - arg.altmap_start_pfn =3D start_pfn; - arg.altmap_nr_pages =3D nr_vmemmap_pages; - arg.start_pfn =3D start_pfn + nr_vmemmap_pages; - arg.nr_pages =3D nr_pages - nr_vmemmap_pages; mem_hotplug_begin(); - ret =3D memory_notify(MEM_PREPARE_ONLINE, &arg); - ret =3D notifier_to_errno(ret); - if (ret) - goto out_notifier; - if (nr_vmemmap_pages) { - ret =3D mhp_init_memmap_on_memory(start_pfn, nr_vmemmap_pages, - zone, mem->altmap->inaccessible); + ret =3D mhp_init_memmap_on_memory(start_pfn, nr_vmemmap_pages, zone); if (ret) goto out; } @@ -280,11 +269,7 @@ static int memory_block_online(struct memory_block *me= m) nr_vmemmap_pages); =20 mem->zone =3D zone; - mem_hotplug_done(); - return ret; out: - memory_notify(MEM_FINISH_OFFLINE, &arg); -out_notifier: mem_hotplug_done(); return ret; } @@ -297,7 +282,6 @@ static int memory_block_offline(struct memory_block *me= m) unsigned long start_pfn =3D section_nr_to_pfn(mem->start_section_nr); unsigned long nr_pages =3D PAGES_PER_SECTION * sections_per_block; unsigned long nr_vmemmap_pages =3D 0; - struct memory_notify arg; int ret; =20 if (!mem->zone) @@ -329,11 +313,6 @@ static int memory_block_offline(struct memory_block *m= em) mhp_deinit_memmap_on_memory(start_pfn, nr_vmemmap_pages); =20 mem->zone =3D NULL; - arg.altmap_start_pfn =3D start_pfn; - arg.altmap_nr_pages =3D nr_vmemmap_pages; - arg.start_pfn =3D start_pfn + nr_vmemmap_pages; - arg.nr_pages =3D nr_pages - nr_vmemmap_pages; - memory_notify(MEM_FINISH_OFFLINE, &arg); out: mem_hotplug_done(); return ret; diff --git a/include/linux/memory.h b/include/linux/memory.h index 40eb70ccb09d..e42534b5c5ec 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h @@ -96,17 +96,8 @@ int set_memory_block_size_order(unsigned int order); #define MEM_GOING_ONLINE (1<<3) #define MEM_CANCEL_ONLINE (1<<4) #define MEM_CANCEL_OFFLINE (1<<5) -#define MEM_PREPARE_ONLINE (1<<6) -#define MEM_FINISH_OFFLINE (1<<7) =20 struct memory_notify { - /* - * The altmap_start_pfn and altmap_nr_pages fields are designated for - * specifying the altmap range and are exclusively intended for use in - * MEM_PREPARE_ONLINE/MEM_FINISH_OFFLINE notifiers. - */ - unsigned long altmap_start_pfn; - unsigned long altmap_nr_pages; unsigned long start_pfn; unsigned long nr_pages; }; diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h index 23f038a16231..f2f16cdd73ee 100644 --- a/include/linux/memory_hotplug.h +++ b/include/linux/memory_hotplug.h @@ -58,22 +58,6 @@ typedef int __bitwise mhp_t; * implies the node id (nid). */ #define MHP_NID_IS_MGID ((__force mhp_t)BIT(2)) -/* - * The hotplugged memory is completely inaccessible while the memory is - * offline. The memory provider will handle MEM_PREPARE_ONLINE / - * MEM_FINISH_OFFLINE notifications and make the memory accessible. - * - * This flag is only relevant when used along with MHP_MEMMAP_ON_MEMORY, - * because the altmap cannot be written (e.g., poisoned) when adding - * memory -- before it is set online. - * - * This allows for adding memory with an altmap that is not currently - * made available by a hypervisor. When onlining that memory, the - * hypervisor can be instructed to make that memory available, and - * the onlining phase will not require any memory allocations, which is - * helpful in low-memory situations. - */ -#define MHP_OFFLINE_INACCESSIBLE ((__force mhp_t)BIT(3)) =20 /* * Extended parameters for memory hotplug: @@ -123,7 +107,7 @@ extern void adjust_present_page_count(struct page *page, long nr_pages); /* VM interface that may be used by firmware interface */ extern int mhp_init_memmap_on_memory(unsigned long pfn, unsigned long nr_p= ages, - struct zone *zone, bool mhp_off_inaccessible); + struct zone *zone); extern void mhp_deinit_memmap_on_memory(unsigned long pfn, unsigned long n= r_pages); extern int online_pages(unsigned long pfn, unsigned long nr_pages, struct zone *zone, struct memory_group *group); diff --git a/include/linux/memremap.h b/include/linux/memremap.h index 4aa151914eab..7467035d4f29 100644 --- a/include/linux/memremap.h +++ b/include/linux/memremap.h @@ -25,7 +25,6 @@ struct vmem_altmap { unsigned long free; unsigned long align; unsigned long alloc; - bool inaccessible; }; =20 /* diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 74318c787715..db95933daa4c 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1088,7 +1088,7 @@ void adjust_present_page_count(struct page *page, str= uct memory_group *group, } =20 int mhp_init_memmap_on_memory(unsigned long pfn, unsigned long nr_pages, - struct zone *zone, bool mhp_off_inaccessible) + struct zone *zone) { unsigned long end_pfn =3D pfn + nr_pages; int ret, i; @@ -1097,15 +1097,6 @@ int mhp_init_memmap_on_memory(unsigned long pfn, uns= igned long nr_pages, if (ret) return ret; =20 - /* - * Memory block is accessible at this stage and hence poison the struct - * pages now. If the memory block is accessible during memory hotplug - * addition phase, then page poisining is already performed in - * sparse_add_section(). - */ - if (mhp_off_inaccessible) - page_init_poison(pfn_to_page(pfn), sizeof(struct page) * nr_pages); - move_pfn_range_to_zone(zone, pfn, nr_pages, NULL, MIGRATE_UNMOVABLE, false); =20 @@ -1444,7 +1435,7 @@ static void remove_memory_blocks_and_altmaps(u64 star= t, u64 size) } =20 static int create_altmaps_and_memory_blocks(int nid, struct memory_group *= group, - u64 start, u64 size, mhp_t mhp_flags) + u64 start, u64 size) { unsigned long memblock_size =3D memory_block_size_bytes(); u64 cur_start; @@ -1460,8 +1451,6 @@ static int create_altmaps_and_memory_blocks(int nid, = struct memory_group *group, }; =20 mhp_altmap.free =3D memory_block_memmap_on_memory_pages(); - if (mhp_flags & MHP_OFFLINE_INACCESSIBLE) - mhp_altmap.inaccessible =3D true; params.altmap =3D kmemdup(&mhp_altmap, sizeof(struct vmem_altmap), GFP_KERNEL); if (!params.altmap) { @@ -1547,7 +1536,7 @@ int add_memory_resource(int nid, struct resource *res= , mhp_t mhp_flags) */ if ((mhp_flags & MHP_MEMMAP_ON_MEMORY) && mhp_supports_memmap_on_memory()) { - ret =3D create_altmaps_and_memory_blocks(nid, group, start, size, mhp_fl= ags); + ret =3D create_altmaps_and_memory_blocks(nid, group, start, size); if (ret) goto error; } else { diff --git a/mm/sparse.c b/mm/sparse.c index e6075b622407..24323122f6cb 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -951,8 +951,7 @@ int __meminit sparse_add_section(int nid, unsigned long= start_pfn, * Poison uninitialized struct pages in order to catch invalid flags * combinations. */ - if (!altmap || !altmap->inaccessible) - page_init_poison(memmap, sizeof(struct page) * nr_pages); + page_init_poison(memmap, sizeof(struct page) * nr_pages); =20 ms =3D __nr_to_section(section_nr); set_section_nid(section_nr, nid); --=20 2.48.1