Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

kho: use unsigned long for nr_pages

Patch series "kho: clean up page initialization logic", v2.

This series simplifies the page initialization logic in
kho_restore_page(). It was originally only a single patch [0], but on
Pasha's suggestion, I added another patch to use unsigned long for
nr_pages.

Technically speaking, the patches aren't related and can be applied
independently, but bundling them together since patch 2 relies on 1 and it
is easier to manage them this way.


This patch (of 2):

With 4k pages, a 32-bit nr_pages can span up to 16 TiB. While it is a
lot, there exist systems with terabytes of RAM. gup is also moving to
using long for nr_pages. Use unsigned long and make KHO future-proof.

Link: https://lkml.kernel.org/r/20260116112217.915803-1-pratyush@kernel.org
Link: https://lkml.kernel.org/r/20260116112217.915803-2-pratyush@kernel.org
Signed-off-by: Pratyush Yadav <pratyush@kernel.org>
Suggested-by: Pasha Tatashin <pasha.tatashin@soleen.com>
Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Reviewed-by: Pasha Tatashin <pasha.tatashin@soleen.com>
Cc: Alexander Graf <graf@amazon.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Pratyush Yadav and committed by
Andrew Morton
840fe43d 931d5c36

+9 -8
+3 -3
include/linux/kexec_handover.h
··· 22 22 23 23 int kho_preserve_folio(struct folio *folio); 24 24 void kho_unpreserve_folio(struct folio *folio); 25 - int kho_preserve_pages(struct page *page, unsigned int nr_pages); 26 - void kho_unpreserve_pages(struct page *page, unsigned int nr_pages); 25 + int kho_preserve_pages(struct page *page, unsigned long nr_pages); 26 + void kho_unpreserve_pages(struct page *page, unsigned long nr_pages); 27 27 int kho_preserve_vmalloc(void *ptr, struct kho_vmalloc *preservation); 28 28 void kho_unpreserve_vmalloc(struct kho_vmalloc *preservation); 29 29 void *kho_alloc_preserve(size_t size); 30 30 void kho_unpreserve_free(void *mem); 31 31 void kho_restore_free(void *mem); 32 32 struct folio *kho_restore_folio(phys_addr_t phys); 33 - struct page *kho_restore_pages(phys_addr_t phys, unsigned int nr_pages); 33 + struct page *kho_restore_pages(phys_addr_t phys, unsigned long nr_pages); 34 34 void *kho_restore_vmalloc(const struct kho_vmalloc *preservation); 35 35 int kho_add_subtree(const char *name, void *fdt); 36 36 void kho_remove_subtree(void *fdt);
+6 -5
kernel/liveupdate/kexec_handover.c
··· 219 219 static struct page *kho_restore_page(phys_addr_t phys, bool is_folio) 220 220 { 221 221 struct page *page = pfn_to_online_page(PHYS_PFN(phys)); 222 - unsigned int nr_pages, ref_cnt; 222 + unsigned long nr_pages; 223 + unsigned int ref_cnt; 223 224 union kho_page_info info; 224 225 225 226 if (!page) ··· 247 246 * count of 1 248 247 */ 249 248 ref_cnt = is_folio ? 0 : 1; 250 - for (unsigned int i = 1; i < nr_pages; i++) 249 + for (unsigned long i = 1; i < nr_pages; i++) 251 250 set_page_count(page + i, ref_cnt); 252 251 253 252 if (is_folio && info.order) ··· 289 288 * 290 289 * Return: 0 on success, error code on failure 291 290 */ 292 - struct page *kho_restore_pages(phys_addr_t phys, unsigned int nr_pages) 291 + struct page *kho_restore_pages(phys_addr_t phys, unsigned long nr_pages) 293 292 { 294 293 const unsigned long start_pfn = PHYS_PFN(phys); 295 294 const unsigned long end_pfn = start_pfn + nr_pages; ··· 838 837 * 839 838 * Return: 0 on success, error code on failure 840 839 */ 841 - int kho_preserve_pages(struct page *page, unsigned int nr_pages) 840 + int kho_preserve_pages(struct page *page, unsigned long nr_pages) 842 841 { 843 842 struct kho_mem_track *track = &kho_out.track; 844 843 const unsigned long start_pfn = page_to_pfn(page); ··· 882 881 * kho_preserve_pages() call. Unpreserving arbitrary sub-ranges of larger 883 882 * preserved blocks is not supported. 884 883 */ 885 - void kho_unpreserve_pages(struct page *page, unsigned int nr_pages) 884 + void kho_unpreserve_pages(struct page *page, unsigned long nr_pages) 886 885 { 887 886 struct kho_mem_track *track = &kho_out.track; 888 887 const unsigned long start_pfn = page_to_pfn(page);