Skip to content

Commit 1d2e733

Browse files
tlendackyKAGA-KOKO
authored andcommitted
resource: Provide resource struct in resource walk callback
In preperation for a new function that will need additional resource information during the resource walk, update the resource walk callback to pass the resource structure. Since the current callback start and end arguments are pulled from the resource structure, the callback functions can obtain them from the resource structure directly. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: Brijesh Singh <brijesh.singh@amd.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Kees Cook <keescook@chromium.org> Reviewed-by: Borislav Petkov <bp@suse.de> Tested-by: Borislav Petkov <bp@suse.de> Cc: kvm@vger.kernel.org Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Borislav Petkov <bp@alien8.de> Cc: linuxppc-dev@lists.ozlabs.org Link: https://lkml.kernel.org/r/20171020143059.3291-10-brijesh.singh@amd.com
1 parent 4ac2aed commit 1d2e733

File tree

7 files changed

+30
-22
lines changed

7 files changed

+30
-22
lines changed

arch/powerpc/kernel/machine_kexec_file_64.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,13 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image)
9191
* and that value will be returned. If all free regions are visited without
9292
* func returning non-zero, then zero will be returned.
9393
*/
94-
int arch_kexec_walk_mem(struct kexec_buf *kbuf, int (*func)(u64, u64, void *))
94+
int arch_kexec_walk_mem(struct kexec_buf *kbuf,
95+
int (*func)(struct resource *, void *))
9596
{
9697
int ret = 0;
9798
u64 i;
9899
phys_addr_t mstart, mend;
100+
struct resource res = { };
99101

100102
if (kbuf->top_down) {
101103
for_each_free_mem_range_reverse(i, NUMA_NO_NODE, 0,
@@ -105,7 +107,9 @@ int arch_kexec_walk_mem(struct kexec_buf *kbuf, int (*func)(u64, u64, void *))
105107
* range while in kexec, end points to the last byte
106108
* in the range.
107109
*/
108-
ret = func(mstart, mend - 1, kbuf);
110+
res.start = mstart;
111+
res.end = mend - 1;
112+
ret = func(&res, kbuf);
109113
if (ret)
110114
break;
111115
}
@@ -117,7 +121,9 @@ int arch_kexec_walk_mem(struct kexec_buf *kbuf, int (*func)(u64, u64, void *))
117121
* range while in kexec, end points to the last byte
118122
* in the range.
119123
*/
120-
ret = func(mstart, mend - 1, kbuf);
124+
res.start = mstart;
125+
res.end = mend - 1;
126+
ret = func(&res, kbuf);
121127
if (ret)
122128
break;
123129
}

arch/x86/kernel/crash.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ void native_machine_crash_shutdown(struct pt_regs *regs)
209209
}
210210

211211
#ifdef CONFIG_KEXEC_FILE
212-
static int get_nr_ram_ranges_callback(u64 start, u64 end, void *arg)
212+
static int get_nr_ram_ranges_callback(struct resource *res, void *arg)
213213
{
214214
unsigned int *nr_ranges = arg;
215215

@@ -342,7 +342,7 @@ static int elf_header_exclude_ranges(struct crash_elf_data *ced,
342342
return ret;
343343
}
344344

345-
static int prepare_elf64_ram_headers_callback(u64 start, u64 end, void *arg)
345+
static int prepare_elf64_ram_headers_callback(struct resource *res, void *arg)
346346
{
347347
struct crash_elf_data *ced = arg;
348348
Elf64_Ehdr *ehdr;
@@ -355,7 +355,7 @@ static int prepare_elf64_ram_headers_callback(u64 start, u64 end, void *arg)
355355
ehdr = ced->ehdr;
356356

357357
/* Exclude unwanted mem ranges */
358-
ret = elf_header_exclude_ranges(ced, start, end);
358+
ret = elf_header_exclude_ranges(ced, res->start, res->end);
359359
if (ret)
360360
return ret;
361361

@@ -518,14 +518,14 @@ static int add_e820_entry(struct boot_params *params, struct e820_entry *entry)
518518
return 0;
519519
}
520520

521-
static int memmap_entry_callback(u64 start, u64 end, void *arg)
521+
static int memmap_entry_callback(struct resource *res, void *arg)
522522
{
523523
struct crash_memmap_data *cmd = arg;
524524
struct boot_params *params = cmd->params;
525525
struct e820_entry ei;
526526

527-
ei.addr = start;
528-
ei.size = end - start + 1;
527+
ei.addr = res->start;
528+
ei.size = res->end - res->start + 1;
529529
ei.type = cmd->type;
530530
add_e820_entry(params, &ei);
531531

@@ -619,12 +619,12 @@ int crash_setup_memmap_entries(struct kimage *image, struct boot_params *params)
619619
return ret;
620620
}
621621

622-
static int determine_backup_region(u64 start, u64 end, void *arg)
622+
static int determine_backup_region(struct resource *res, void *arg)
623623
{
624624
struct kimage *image = arg;
625625

626-
image->arch.backup_src_start = start;
627-
image->arch.backup_src_sz = end - start + 1;
626+
image->arch.backup_src_start = res->start;
627+
image->arch.backup_src_sz = res->end - res->start + 1;
628628

629629
/* Expecting only one range for backup region */
630630
return 1;

arch/x86/kernel/pmem.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <linux/init.h>
88
#include <linux/ioport.h>
99

10-
static int found(u64 start, u64 end, void *data)
10+
static int found(struct resource *res, void *data)
1111
{
1212
return 1;
1313
}

include/linux/ioport.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,10 +272,10 @@ walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
272272
void *arg, int (*func)(unsigned long, unsigned long, void *));
273273
extern int
274274
walk_system_ram_res(u64 start, u64 end, void *arg,
275-
int (*func)(u64, u64, void *));
275+
int (*func)(struct resource *, void *));
276276
extern int
277277
walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end,
278-
void *arg, int (*func)(u64, u64, void *));
278+
void *arg, int (*func)(struct resource *, void *));
279279

280280
/* True if any part of r1 overlaps r2 */
281281
static inline bool resource_overlaps(struct resource *r1, struct resource *r2)

include/linux/kexec.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ struct kexec_buf {
160160
};
161161

162162
int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf,
163-
int (*func)(u64, u64, void *));
163+
int (*func)(struct resource *, void *));
164164
extern int kexec_add_buffer(struct kexec_buf *kbuf);
165165
int kexec_locate_mem_hole(struct kexec_buf *kbuf);
166166
#endif /* CONFIG_KEXEC_FILE */

kernel/kexec_file.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,9 +406,10 @@ static int locate_mem_hole_bottom_up(unsigned long start, unsigned long end,
406406
return 1;
407407
}
408408

409-
static int locate_mem_hole_callback(u64 start, u64 end, void *arg)
409+
static int locate_mem_hole_callback(struct resource *res, void *arg)
410410
{
411411
struct kexec_buf *kbuf = (struct kexec_buf *)arg;
412+
u64 start = res->start, end = res->end;
412413
unsigned long sz = end - start + 1;
413414

414415
/* Returning 0 will take to next memory range */
@@ -437,7 +438,7 @@ static int locate_mem_hole_callback(u64 start, u64 end, void *arg)
437438
* func returning non-zero, then zero will be returned.
438439
*/
439440
int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf,
440-
int (*func)(u64, u64, void *))
441+
int (*func)(struct resource *, void *))
441442
{
442443
if (kbuf->image->type == KEXEC_TYPE_CRASH)
443444
return walk_iomem_res_desc(crashk_res.desc,

kernel/resource.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -402,14 +402,15 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc,
402402

403403
static int __walk_iomem_res_desc(struct resource *res, unsigned long desc,
404404
bool first_level_children_only,
405-
void *arg, int (*func)(u64, u64, void *))
405+
void *arg,
406+
int (*func)(struct resource *, void *))
406407
{
407408
u64 orig_end = res->end;
408409
int ret = -1;
409410

410411
while ((res->start < res->end) &&
411412
!find_next_iomem_res(res, desc, first_level_children_only)) {
412-
ret = (*func)(res->start, res->end, arg);
413+
ret = (*func)(res, arg);
413414
if (ret)
414415
break;
415416

@@ -435,7 +436,7 @@ static int __walk_iomem_res_desc(struct resource *res, unsigned long desc,
435436
* <linux/ioport.h> and set it in 'desc' of a target resource entry.
436437
*/
437438
int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start,
438-
u64 end, void *arg, int (*func)(u64, u64, void *))
439+
u64 end, void *arg, int (*func)(struct resource *, void *))
439440
{
440441
struct resource res;
441442

@@ -454,7 +455,7 @@ int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start,
454455
* ranges.
455456
*/
456457
int walk_system_ram_res(u64 start, u64 end, void *arg,
457-
int (*func)(u64, u64, void *))
458+
int (*func)(struct resource *, void *))
458459
{
459460
struct resource res;
460461

0 commit comments

Comments
 (0)