mirror of
https://github.com/torvalds/linux
synced 2024-10-15 15:59:15 +00:00
objtool: Free insns when done
Free the decoded instructions as they're no longer needed after this point. This frees up a big chunk of heap, which will come handy when skipping the reading of DWARF section data. Link: https://lore.kernel.org/r/4d4bca1a0f869de020dac80d91f9acbf6df77eab.1685464332.git.jpoimboe@kernel.org Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
This commit is contained in:
parent
ec24b927c1
commit
d93b5935fd
|
@ -4596,6 +4596,34 @@ static int disas_warned_funcs(struct objtool_file *file)
|
|||
return 0;
|
||||
}
|
||||
|
||||
struct insn_chunk {
|
||||
void *addr;
|
||||
struct insn_chunk *next;
|
||||
};
|
||||
|
||||
/*
|
||||
* Reduce peak RSS usage by freeing insns memory before writing the ELF file,
|
||||
* which can trigger more allocations for .debug_* sections whose data hasn't
|
||||
* been read yet.
|
||||
*/
|
||||
static void free_insns(struct objtool_file *file)
|
||||
{
|
||||
struct instruction *insn;
|
||||
struct insn_chunk *chunks = NULL, *chunk;
|
||||
|
||||
for_each_insn(file, insn) {
|
||||
if (!insn->idx) {
|
||||
chunk = malloc(sizeof(*chunk));
|
||||
chunk->addr = insn;
|
||||
chunk->next = chunks;
|
||||
chunks = chunk;
|
||||
}
|
||||
}
|
||||
|
||||
for (chunk = chunks; chunk; chunk = chunk->next)
|
||||
free(chunk->addr);
|
||||
}
|
||||
|
||||
int check(struct objtool_file *file)
|
||||
{
|
||||
int ret, warnings = 0;
|
||||
|
@ -4742,6 +4770,8 @@ int check(struct objtool_file *file)
|
|||
warnings += ret;
|
||||
}
|
||||
|
||||
free_insns(file);
|
||||
|
||||
if (opts.verbose)
|
||||
disas_warned_funcs(file);
|
||||
|
||||
|
|
Loading…
Reference in a new issue