]> www.infradead.org Git - users/hch/misc.git/commitdiff
kho: replace kho_preserve_phys() with kho_preserve_pages()
authorMike Rapoport (Microsoft) <rppt@kernel.org>
Sun, 21 Sep 2025 05:44:56 +0000 (08:44 +0300)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 7 Oct 2025 20:48:55 +0000 (13:48 -0700)
to make it clear that KHO operates on pages rather than on a random
physical address.

The kho_preserve_pages() will be also used in upcoming support for vmalloc
preservation.

Link: https://lkml.kernel.org/r/20250921054458.4043761-3-rppt@kernel.org
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Pratyush Yadav <pratyush@kernel.org>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Cc: Alexander Graf <graf@amazon.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Changyuan Lyu <changyuanl@google.com>
Cc: Chris Li <chrisl@kernel.org>
Cc: Pasha Tatashin <pasha.tatashin@soleen.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/kexec_handover.h
kernel/kexec_handover.c
mm/memblock.c

index 559d13a3bc442694aacf8be13119e9ade50f7121..cec663b39861aa70a7fd4839cfb2ddbc801aef8a 100644 (file)
@@ -18,6 +18,7 @@ enum kho_event {
 
 struct folio;
 struct notifier_block;
+struct page;
 
 #define DECLARE_KHOSER_PTR(name, type) \
        union {                        \
@@ -43,7 +44,7 @@ bool kho_is_enabled(void);
 bool is_kho_boot(void);
 
 int kho_preserve_folio(struct folio *folio);
-int kho_preserve_phys(phys_addr_t phys, size_t size);
+int kho_preserve_pages(struct page *page, unsigned int nr_pages);
 struct folio *kho_restore_folio(phys_addr_t phys);
 int kho_add_subtree(struct kho_serialization *ser, const char *name, void *fdt);
 int kho_retrieve_subtree(const char *name, phys_addr_t *phys);
@@ -71,7 +72,7 @@ static inline int kho_preserve_folio(struct folio *folio)
        return -EOPNOTSUPP;
 }
 
-static inline int kho_preserve_phys(phys_addr_t phys, size_t size)
+static inline int kho_preserve_pages(struct page *page, unsigned int nr_pages)
 {
        return -EOPNOTSUPP;
 }
index b8d0d63f614516262b2f30f97309d9fda3274190..1c44a55f758e23fdde9dd36bd971068b7aba9e40 100644 (file)
@@ -725,26 +725,23 @@ int kho_preserve_folio(struct folio *folio)
 EXPORT_SYMBOL_GPL(kho_preserve_folio);
 
 /**
- * kho_preserve_phys - preserve a physically contiguous range across kexec.
- * @phys: physical address of the range.
- * @size: size of the range.
+ * kho_preserve_pages - preserve contiguous pages across kexec
+ * @page: first page in the list.
+ * @nr_pages: number of pages.
  *
- * Instructs KHO to preserve the memory range from @phys to @phys + @size
- * across kexec.
+ * Preserve a contiguous list of order 0 pages. Must be restored using
+ * kho_restore_pages() to ensure the pages are restored properly as order 0.
  *
  * Return: 0 on success, error code on failure
  */
-int kho_preserve_phys(phys_addr_t phys, size_t size)
+int kho_preserve_pages(struct page *page, unsigned int nr_pages)
 {
-       unsigned long pfn = PHYS_PFN(phys);
+       struct kho_mem_track *track = &kho_out.ser.track;
+       const unsigned long start_pfn = page_to_pfn(page);
+       const unsigned long end_pfn = start_pfn + nr_pages;
+       unsigned long pfn = start_pfn;
        unsigned long failed_pfn = 0;
-       const unsigned long start_pfn = pfn;
-       const unsigned long end_pfn = PHYS_PFN(phys + size);
        int err = 0;
-       struct kho_mem_track *track = &kho_out.ser.track;
-
-       if (!PAGE_ALIGNED(phys) || !PAGE_ALIGNED(size))
-               return -EINVAL;
 
        while (pfn < end_pfn) {
                const unsigned int order =
@@ -764,7 +761,7 @@ int kho_preserve_phys(phys_addr_t phys, size_t size)
 
        return err;
 }
-EXPORT_SYMBOL_GPL(kho_preserve_phys);
+EXPORT_SYMBOL_GPL(kho_preserve_pages);
 
 /* Handling for debug/kho/out */
 
index 120a501a887a01ea730fd9bc8fe0062499769b1b..e23e16618e9b380dcdda80b0d198689b11014797 100644 (file)
@@ -2452,8 +2452,10 @@ static int reserve_mem_kho_finalize(struct kho_serialization *ser)
 
        for (i = 0; i < reserved_mem_count; i++) {
                struct reserve_mem_table *map = &reserved_mem_table[i];
+               struct page *page = phys_to_page(map->start);
+               unsigned int nr_pages = map->size >> PAGE_SHIFT;
 
-               err |= kho_preserve_phys(map->start, map->size);
+               err |= kho_preserve_pages(page, nr_pages);
        }
 
        err |= kho_preserve_folio(page_folio(kho_fdt));