All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <greg@kroah.com>
To: Sasha Levin <sashal@kernel.org>
Cc: stable@vger.kernel.org,
	Pasha Tatashin <pasha.tatashin@soleen.com>,
	Pratyush Yadav <pratyush@kernel.org>,
	"Mike Rapoport (Microsoft)" <rppt@kernel.org>,
	Alexander Graf <graf@amazon.com>,
	Changyuan Lyu <changyuanl@google.com>,
	Christian Brauner <brauner@kernel.org>,
	Jason Gunthorpe <jgg@nvidia.com>, Jason Gunthorpe <jgg@ziepe.ca>,
	Jonathan Corbet <corbet@lwn.net>,
	Masahiro Yamada <masahiroy@kernel.org>,
	Miguel Ojeda <ojeda@kernel.org>,
	Randy Dunlap <rdunlap@infradead.org>,
	Simon Horman <horms@kernel.org>, Tejun Heo <tj@kernel.org>,
	Zhu Yanjun <yanjun.zhu@linux.dev>,
	Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH 6.18.y 1/2] kho: add interfaces to unpreserve folios, page ranges, and vmalloc
Date: Thu, 30 Jul 2026 14:34:07 +0200	[thread overview]
Message-ID: <2026073055-lemon-uniformly-46b7@gregkh> (raw)
In-Reply-To: <2026073016-gulf-cushy-de29@gregkh>

On Thu, Jul 30, 2026 at 02:33:30PM +0200, Greg KH wrote:
> On Sat, Jul 25, 2026 at 06:54:32AM -0400, Sasha Levin wrote:
> > From: Pasha Tatashin <pasha.tatashin@soleen.com>
> > 
> > [ Upstream commit 36f8f7ef7fd2f238922e9d217e86c69838319d8c ]
> > 
> > Allow users of KHO to cancel the previous preservation by adding the
> > necessary interfaces to unpreserve folio, pages, and vmallocs.
> > 
> > Link: https://lkml.kernel.org/r/20251101142325.1326536-4-pasha.tatashin@soleen.com
> > Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
> > Reviewed-by: Pratyush Yadav <pratyush@kernel.org>
> > Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
> > Cc: Alexander Graf <graf@amazon.com>
> > Cc: Changyuan Lyu <changyuanl@google.com>
> > Cc: Christian Brauner <brauner@kernel.org>
> > Cc: Jason Gunthorpe <jgg@nvidia.com>
> > Cc: Jason Gunthorpe <jgg@ziepe.ca>
> > Cc: Jonathan Corbet <corbet@lwn.net>
> > Cc: Masahiro Yamada <masahiroy@kernel.org>
> > Cc: Miguel Ojeda <ojeda@kernel.org>
> > Cc: Randy Dunlap <rdunlap@infradead.org>
> > Cc: Simon Horman <horms@kernel.org>
> > Cc: Tejun Heo <tj@kernel.org>
> > Cc: Zhu Yanjun <yanjun.zhu@linux.dev>
> > Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> > Stable-dep-of: 0e39380a7316 ("kho: make sure scratch size is always aligned by CMA_MIN_ALIGNMENT_BYTES")
> > Signed-off-by: Sasha Levin <sashal@kernel.org>
> > ---
> >  include/linux/kexec_handover.h |  18 ++++++
> >  kernel/kexec_handover.c        | 104 ++++++++++++++++++++++++++++-----
> >  2 files changed, 109 insertions(+), 13 deletions(-)
> > 
> > diff --git a/include/linux/kexec_handover.h b/include/linux/kexec_handover.h
> > index 25042c1d8d54af..e1af332a262fba 100644
> > --- a/include/linux/kexec_handover.h
> > +++ b/include/linux/kexec_handover.h
> > @@ -52,8 +52,11 @@ bool kho_is_enabled(void);
> >  bool is_kho_boot(void);
> >  
> >  int kho_preserve_folio(struct folio *folio);
> > +int kho_unpreserve_folio(struct folio *folio);
> >  int kho_preserve_pages(struct page *page, unsigned int nr_pages);
> > +int kho_unpreserve_pages(struct page *page, unsigned int nr_pages);
> >  int kho_preserve_vmalloc(void *ptr, struct kho_vmalloc *preservation);
> > +int kho_unpreserve_vmalloc(struct kho_vmalloc *preservation);
> >  struct folio *kho_restore_folio(phys_addr_t phys);
> >  struct page *kho_restore_pages(phys_addr_t phys, unsigned int nr_pages);
> >  void *kho_restore_vmalloc(const struct kho_vmalloc *preservation);
> > @@ -83,17 +86,32 @@ static inline int kho_preserve_folio(struct folio *folio)
> >  	return -EOPNOTSUPP;
> >  }
> >  
> > +static inline int kho_unpreserve_folio(struct folio *folio)
> > +{
> > +	return -EOPNOTSUPP;
> > +}
> > +
> >  static inline int kho_preserve_pages(struct page *page, unsigned int nr_pages)
> >  {
> >  	return -EOPNOTSUPP;
> >  }
> >  
> > +static inline int kho_unpreserve_pages(struct page *page, unsigned int nr_pages)
> > +{
> > +	return -EOPNOTSUPP;
> > +}
> > +
> >  static inline int kho_preserve_vmalloc(void *ptr,
> >  				       struct kho_vmalloc *preservation)
> >  {
> >  	return -EOPNOTSUPP;
> >  }
> >  
> > +static inline int kho_unpreserve_vmalloc(struct kho_vmalloc *preservation)
> > +{
> > +	return -EOPNOTSUPP;
> > +}
> > +
> >  static inline struct folio *kho_restore_folio(phys_addr_t phys)
> >  {
> >  	return NULL;
> > diff --git a/kernel/kexec_handover.c b/kernel/kexec_handover.c
> > index c13b99f7c9891e..37e6048118e8b7 100644
> > --- a/kernel/kexec_handover.c
> > +++ b/kernel/kexec_handover.c
> > @@ -153,26 +153,33 @@ static void *xa_load_or_alloc(struct xarray *xa, unsigned long index)
> >  	return no_free_ptr(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 (WARN_ON_ONCE(!physxa))
> > +		return;
> >  
> > -		physxa = xa_load(&track->orders, order);
> > -		if (WARN_ON_ONCE(!physxa))
> > -			return;
> > +	bits = xa_load(&physxa->phys_bits, pfn_high / PRESERVE_BITS);
> > +	if (WARN_ON_ONCE(!bits))
> > +		return;
> > +
> > +	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;
> >  
> > -		bits = xa_load(&physxa->phys_bits, pfn_high / PRESERVE_BITS);
> > -		if (WARN_ON_ONCE(!bits))
> > -			return;
> > +	while (pfn < end_pfn) {
> > +		order = min(count_trailing_zeros(pfn), ilog2(end_pfn - pfn));
> >  
> > -		clear_bit(pfn_high % PRESERVE_BITS, bits->preserve);
> > +		__kho_unpreserve_order(track, pfn, order);
> >  
> >  		pfn += 1 << order;
> >  	}
> > @@ -739,6 +746,30 @@ 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. The provided @folio (pfn and order)
> > + * must exactly match a previously preserved folio.
> > + *
> > + * 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.track;
> > +
> > +	if (kho_out.finalized)
> > +		return -EBUSY;
> > +
> > +	__kho_unpreserve_order(track, pfn, order);
> > +	return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(kho_unpreserve_folio);
> > +
> >  /**
> >   * kho_preserve_pages - preserve contiguous pages across kexec
> >   * @page: first page in the list.
> > @@ -783,6 +814,33 @@ int kho_preserve_pages(struct page *page, unsigned int nr_pages)
> >  }
> >  EXPORT_SYMBOL_GPL(kho_preserve_pages);
> >  
> > +/**
> > + * kho_unpreserve_pages - unpreserve contiguous pages.
> > + * @page: first page in the list.
> > + * @nr_pages: number of pages.
> > + *
> > + * Instructs KHO to unpreserve @nr_pages contiguous pages starting from @page.
> > + * This must be called with the same @page and @nr_pages as the corresponding
> > + * kho_preserve_pages() call. Unpreserving arbitrary sub-ranges of larger
> > + * preserved blocks is not supported.
> > + *
> > + * Return: 0 on success, error code on failure
> > + */
> > +int kho_unpreserve_pages(struct page *page, unsigned int nr_pages)
> > +{
> > +	struct kho_mem_track *track = &kho_out.track;
> > +	const unsigned long start_pfn = page_to_pfn(page);
> > +	const unsigned long end_pfn = start_pfn + nr_pages;
> > +
> > +	if (kho_out.finalized)
> > +		return -EBUSY;
> > +
> > +	__kho_unpreserve(track, start_pfn, end_pfn);
> > +
> > +	return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(kho_unpreserve_pages);
> > +
> >  struct kho_vmalloc_hdr {
> >  	DECLARE_KHOSER_PTR(next, struct kho_vmalloc_chunk *);
> >  };
> > @@ -944,6 +1002,26 @@ int kho_preserve_vmalloc(void *ptr, struct kho_vmalloc *preservation)
> >  }
> >  EXPORT_SYMBOL_GPL(kho_preserve_vmalloc);
> >  
> > +/**
> > + * kho_unpreserve_vmalloc - unpreserve memory allocated with vmalloc()
> > + * @preservation: preservation metadata returned by kho_preserve_vmalloc()
> > + *
> > + * Instructs KHO to unpreserve the area in vmalloc address space that was
> > + * previously preserved with kho_preserve_vmalloc().
> > + *
> > + * Return: 0 on success, error code on failure
> > + */
> > +int kho_unpreserve_vmalloc(struct kho_vmalloc *preservation)
> > +{
> > +	if (kho_out.finalized)
> > +		return -EBUSY;
> > +
> > +	kho_vmalloc_free_chunks(preservation);
> > +
> > +	return 0;
> > +}
> > +EXPORT_SYMBOL_GPL(kho_unpreserve_vmalloc);
> > +
> >  /**
> >   * kho_restore_vmalloc - recreates and populates an area in vmalloc address
> >   * space from the preserved memory.
> > -- 
> > 2.53.0
> > 
> > 
> 
> Oops, nope, dropped this and patch 2/2 as this causes a build error :(
> 
> 

Actually patch 2/2 works just fine on it's own, so I've kept that.

      reply	other threads:[~2026-07-30 12:34 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-20 14:31 FAILED: patch "[PATCH] kho: make sure scratch size is always aligned by" failed to apply to 6.18-stable tree gregkh
2026-07-25 10:54 ` [PATCH 6.18.y 1/2] kho: add interfaces to unpreserve folios, page ranges, and vmalloc Sasha Levin
2026-07-25 10:54   ` [PATCH 6.18.y 2/2] kho: make sure scratch size is always aligned by CMA_MIN_ALIGNMENT_BYTES Sasha Levin
2026-07-30 12:33   ` [PATCH 6.18.y 1/2] kho: add interfaces to unpreserve folios, page ranges, and vmalloc Greg KH
2026-07-30 12:34     ` Greg KH [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2026073055-lemon-uniformly-46b7@gregkh \
    --to=greg@kroah.com \
    --cc=akpm@linux-foundation.org \
    --cc=brauner@kernel.org \
    --cc=changyuanl@google.com \
    --cc=corbet@lwn.net \
    --cc=graf@amazon.com \
    --cc=horms@kernel.org \
    --cc=jgg@nvidia.com \
    --cc=jgg@ziepe.ca \
    --cc=masahiroy@kernel.org \
    --cc=ojeda@kernel.org \
    --cc=pasha.tatashin@soleen.com \
    --cc=pratyush@kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=rppt@kernel.org \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=tj@kernel.org \
    --cc=yanjun.zhu@linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.