From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id B4C7FC5B549 for ; Wed, 4 Jun 2025 15:00:35 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 527146B05F9; Wed, 4 Jun 2025 11:00:35 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4FEFF6B05FC; Wed, 4 Jun 2025 11:00:35 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 416A66B05FD; Wed, 4 Jun 2025 11:00:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 271856B05F9 for ; Wed, 4 Jun 2025 11:00:35 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id C17BD818F6 for ; Wed, 4 Jun 2025 15:00:34 +0000 (UTC) X-FDA: 83518029588.30.B562CB8 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf19.hostedemail.com (Postfix) with ESMTP id E436C1A0012 for ; Wed, 4 Jun 2025 15:00:32 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=SBlukFFj; spf=pass (imf19.hostedemail.com: domain of pratyush@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=pratyush@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1749049233; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=2XrlZe5AqHXAAN9gvZtjzIDIcBuHDi/87I+3tgQBcoA=; b=ZYCVYcwSbHjcTHtt5ar51e0WiTIX+ZWuphKCFFmdWQRcEnDiHM9jTtySJ+VUowHxoDFAQ4 4uAkETGdRi+AswR3/8vU/0WLYC6c3GI/aVsFNppsv3axt3QsM1jyj1+oiFerWbpOjvj71W rt25kdmZE5Z6QccNfM7y+5GQ46uvUiQ= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=SBlukFFj; spf=pass (imf19.hostedemail.com: domain of pratyush@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=pratyush@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1749049233; a=rsa-sha256; cv=none; b=TX8UcArkGZMETvyPuNJikoY0oZbg6z8lz1/Nvm68GO4xGygr2JSTfIEclUl0rLHn4DGeKG nER9C2ZtYBcNnHKnHdX7yy997O42EnBml1KokZrMB4eexV1q9ZCgnEsI0p5WusQDMNsmex yLVxGs7aArC15zKbOHLq8TUoJzzOSIc= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id CAC495C57D4; Wed, 4 Jun 2025 14:58:14 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B9152C4CEE4; Wed, 4 Jun 2025 15:00:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1749049231; bh=tFfAHcuK1W9KZi2uebnSCQzC+lwDGxGFdWFkTKf2Z6I=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From; b=SBlukFFjpJ1mIv0NLRqQpI74YVsrOObNpomOPkCc7NlBRH9jGWvdX3wC8Nt1z6JtB gJ0+N1rihS2+NMjjNr6bNhfxulu4wiJIKPMzh6MVjsPPECsidDpjepDyLS1X8Qleys 9iQHhQuYQ4odYKySw2Bkt+ywB5ctGUYHtedjp/LOpmmUsUS8RyjSmNIO5Jou+Itspd aGNeZbJ+8bIAhIB8bySQlr8eZYenT3OvlZllsBm9bI3D53D/NnaVNbnjOqMciBQ5Z0 B/UewvPiREBuKskP2z5+L++/1X++z4Nowo0ZKRpIabW0pxcBum+1PqpqOcr2yh1j4q UrqicyP2DUbeQ== From: Pratyush Yadav To: Pasha Tatashin Cc: pratyush@kernel.org, jasonmiu@google.com, graf@amazon.com, changyuanl@google.com, rppt@kernel.org, dmatlack@google.com, rientjes@google.com, corbet@lwn.net, rdunlap@infradead.org, ilpo.jarvinen@linux.intel.com, kanie@linux.alibaba.com, ojeda@kernel.org, aliceryhl@google.com, masahiroy@kernel.org, akpm@linux-foundation.org, tj@kernel.org, yoann.congal@smile.fr, mmaurer@google.com, roman.gushchin@linux.dev, chenridong@huawei.com, axboe@kernel.dk, mark.rutland@arm.com, jannh@google.com, vincent.guittot@linaro.org, hannes@cmpxchg.org, dan.j.williams@intel.com, david@redhat.com, joel.granados@kernel.org, rostedt@goodmis.org, anna.schumaker@oracle.com, song@kernel.org, zhangguopeng@kylinos.cn, linux@weissschuh.net, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-mm@kvack.org, gregkh@linuxfoundation.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, rafael@kernel.org, dakr@kernel.org, bartosz.golaszewski@linaro.org, cw00.choi@samsung.com, myungjoo.ham@samsung.com, yesanishhere@gmail.com, Jonathan.Cameron@huawei.com, quic_zijuhu@quicinc.com, aleksander.lobakin@intel.com, ira.weiny@intel.com, andriy.shevchenko@linux.intel.com, leon@kernel.org, lukas@wunner.de, bhelgaas@google.com, wagi@kernel.org, djeffery@redhat.com, stuart.w.hayes@gmail.com Subject: Re: [RFC v2 03/16] kho: add kho_unpreserve_folio/phys In-Reply-To: <20250515182322.117840-4-pasha.tatashin@soleen.com> References: <20250515182322.117840-1-pasha.tatashin@soleen.com> <20250515182322.117840-4-pasha.tatashin@soleen.com> Date: Wed, 04 Jun 2025 17:00:22 +0200 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Rspamd-Queue-Id: E436C1A0012 X-Stat-Signature: ryag9xunt6exi86dxsa1bkn18axxd58i X-Rspam-User: X-Rspamd-Server: rspam07 X-HE-Tag: 1749049232-773011 X-HE-Meta: U2FsdGVkX19rWA6ALxSd1+4O2aqlX5zeHh20LCgdGSr2yiefa4VKyp8jM303KrWOHbK+y2MfxrTMqyewf6hE2qFwkvgQCqByivVYhIbEhC4RJGTP1hUqGk2QMLyS4F/jHsm+XvuBJqthTr/Jk5fH5+XmBY/UH6PvpeMsZzETxPQYy3kTim8YErBNKkFQ6zWMq8sdHGmHSWs48+/2FQ/4n9rDCcLNdJ5NScWe617IJ8RjTUDQbseVPP5GmOccZz7+OOFmSwCiISq9vzay0nzuCRrLRUZWSjdAIjmwTR0rrR7KBXAXYmELd6Y1qjvgQNDG0fzBwbgZdKcT5x+wiw4Mq0p3+fXn9Y6CbvWdqBZI0Zw00faMKK0ye9FxMZvl3M0dzyVIW3UZumSoLWbz32myI/N8r08gzRFnjA28iWHL5ORjgeOPj4u0RWpY2ABFKpyQEJKkip8yOjV2sB2bo95iPS4ElMRTOrPOm+y6mUlr79mec/5wnzJI9PufpERcsYbdV+QN6jKONdrcwqPL6eTcMDjw53juE5W6J72fcpHDi84GPTCN5Y8AJF79/Rvun43reNhIny/UlRgzHo8sqSWK8KjyLKq6xUoz+3/zFQmjAFsYHWtSai5x86qCaarzikUeO4JwJiuwJHRxl0oA7uueWXqWmwQQZjfRz4XRXiy1rXT218nNrrMHijz7AcNn3hsB7pGNGzvXEc70saoFMVQjrxN7GL+GRY/Jn6wNQBAusB2t7Ph1zSJzPSQDQ1tGLUM/Wqit8pc+HpqRX5zV8Mor6B3iBKLH0ND5kkm414rhMGMJguyA923Vl2ZPB8vDem4g3t7t6+7Wq6Pu9xtlvOPkPk0mUS/MmbyIOmu06RUjlDVoGOnmFWuP7+mtZ8soB2pn31jKvsaRXpIwjMFsEUL3h+VPfH0h5ruzfVwcX2jbQzPzhSNgmS/bo0otasbVm0Ab7kCk62pMwmlssJc3klL rNFhp4ca Gf+qZ3wB7U2F5jtlxj5aocuh4VwD2dGnzpAPeQhOroNsH9C/wmUkFS3X1H3Au4sPDuLFMfNGUZH6spSFsh6NP947T4KXoO2gJAANZZdB3TqeoddekZiZGfiOZw9LJ8Th2eOK6JzEt22FrvhWTcv6DdhcYvtu6r/zUBo7EaRbNJ+aD3/k2IqDYCHen8pzsKMAgL0P4gs5h7akWLLxVQiA+KC0beIJKXu0i444LhSKzg8du6EcsEzsfIBSZwQY6teQ2fbntdrpTSR7rlJeWa1bvSq08k1gRi1uIvNj3bH5jHVOxiwZZwdCtqaCvdhYqxmFftwULOjvoHPwd49inYUN+SexsdRFDJqT1yGd19S7eYfrE7+C/AN3S9Jtz2Q== 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: List-Subscribe: List-Unsubscribe: On Thu, May 15 2025, Pasha Tatashin wrote: > From: Changyuan Lyu > > Allow users of KHO to cancel the previous preservation by adding the > necessary interfaces to unpreserve folio. > > Signed-off-by: Changyuan Lyu > Co-developed-by: Pasha Tatashin > Signed-off-by: Pasha Tatashin > --- > include/linux/kexec_handover.h | 12 +++++ > kernel/kexec_handover.c | 84 ++++++++++++++++++++++++++++------ > 2 files changed, 83 insertions(+), 13 deletions(-) > [...] > diff --git a/kernel/kexec_handover.c b/kernel/kexec_handover.c > index 8ff561e36a87..eb305e7e6129 100644 > --- a/kernel/kexec_handover.c > +++ b/kernel/kexec_handover.c > @@ -101,26 +101,33 @@ static void *xa_load_or_alloc(struct xarray *xa, unsigned long index, size_t sz) > return elm; > } > > -static void __kho_unpreserve(struct kho_mem_track *track, unsigned long pfn, > - unsigned long end_pfn) > +static void __kho_unpreserve_order(struct kho_mem_track *track, unsigned long pfn, > + unsigned int order) > { > struct kho_mem_phys_bits *bits; > struct kho_mem_phys *physxa; > + const unsigned long pfn_high = pfn >> order; > > - while (pfn < end_pfn) { > - const unsigned int order = > - min(count_trailing_zeros(pfn), ilog2(end_pfn - pfn)); > - const unsigned long pfn_high = pfn >> order; > + physxa = xa_load(&track->orders, order); > + if (!physxa) > + return; > > - physxa = xa_load(&track->orders, order); > - if (!physxa) > - continue; > + bits = xa_load(&physxa->phys_bits, pfn_high / PRESERVE_BITS); > + if (!bits) > + return; > > - bits = xa_load(&physxa->phys_bits, pfn_high / PRESERVE_BITS); > - if (!bits) > - continue; > + clear_bit(pfn_high % PRESERVE_BITS, bits->preserve); > +} > > - clear_bit(pfn_high % PRESERVE_BITS, bits->preserve); > +static void __kho_unpreserve(struct kho_mem_track *track, unsigned long pfn, > + unsigned long end_pfn) > +{ > + unsigned int order; > + > + while (pfn < end_pfn) { > + order = min(count_trailing_zeros(pfn), ilog2(end_pfn - pfn)); This is fragile. If the preserve call spans say 4 PFNs, then it gets preserved as a order 2 allocation, but if the PFNs are unpreserved one-by-one, __kho_unpreserve_order() will unpreserve from the order 0 xarray, which will end up doing nothing, leaking those pages. It should either look through all orders to find the PFN, or at least have a requirement in the API that the same phys and size combination as the preserve call must be given to unpreserve. > + > + __kho_unpreserve_order(track, pfn, order); > > pfn += 1 << order; > } > @@ -607,6 +614,29 @@ int kho_preserve_folio(struct folio *folio) > } > EXPORT_SYMBOL_GPL(kho_preserve_folio); > > +/** > + * kho_unpreserve_folio - unpreserve a folio. > + * @folio: folio to unpreserve. > + * > + * Instructs KHO to unpreserve a folio that was preserved by > + * kho_preserve_folio() before. > + * > + * Return: 0 on success, error code on failure > + */ > +int kho_unpreserve_folio(struct folio *folio) > +{ > + const unsigned long pfn = folio_pfn(folio); > + const unsigned int order = folio_order(folio); > + struct kho_mem_track *track = &kho_out.ser.track; > + > + if (kho_out.finalized) > + return -EBUSY; > + > + __kho_unpreserve_order(track, pfn, order); > + return 0; > +} > +EXPORT_SYMBOL_GPL(kho_unpreserve_folio); > + > /** > * kho_preserve_phys - preserve a physically contiguous range across kexec. > * @phys: physical address of the range. > @@ -652,6 +682,34 @@ int kho_preserve_phys(phys_addr_t phys, size_t size) > } > EXPORT_SYMBOL_GPL(kho_preserve_phys); > > +/** > + * kho_unpreserve_phys - unpreserve a physically contiguous range across kexec. > + * @phys: physical address of the range. > + * @size: size of the range. > + * > + * Instructs KHO to unpreserve the memory range from @phys to @phys + @size > + * across kexec. > + * > + * Return: 0 on success, error code on failure > + */ > +int kho_unpreserve_phys(phys_addr_t phys, size_t size) > +{ > + struct kho_mem_track *track = &kho_out.ser.track; > + unsigned long pfn = PHYS_PFN(phys); > + unsigned long end_pfn = PHYS_PFN(phys + size); > + > + if (kho_out.finalized) > + return -EBUSY; > + > + if (!PAGE_ALIGNED(phys) || !PAGE_ALIGNED(size)) > + return -EINVAL; > + > + __kho_unpreserve(track, pfn, end_pfn); > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(kho_unpreserve_phys); > + > int __kho_abort(void) > { > int err; -- Regards, Pratyush Yadav