All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Alan Maguire <alan.maguire@oracle.com>
Cc: Ihor Solodrai <ihor.solodrai@pm.me>,
	dwarves@vger.kernel.org, andrii@kernel.org, eddyz87@gmail.com
Subject: Re: [PATCH v3 dwarves 3/5] btf_encoder: collect elf_functions in btf_encoder__pre_load_module
Date: Thu, 17 Oct 2024 17:13:23 -0300	[thread overview]
Message-ID: <ZxFv46O6UPnqbzGF@x1> (raw)
In-Reply-To: <05bd8cbb-9e6d-479a-abf6-51e7eb5e67f7@oracle.com>

On Thu, Oct 17, 2024 at 11:56:04AM +0100, Alan Maguire wrote:
> On 16/10/2024 01:10, Ihor Solodrai wrote:
> > Introduce a global elf_functions_list variable in btf_encoder.c that
> > contains an elf_functions per ELF.
> >
> 
> Arnaldo can help provide context here, but at least notionally I think
> the idea of maintaining libdwarves as a library has value. In that

Yeah, but in all these years I'm not aware of any user, I even need to
do some testing on building pahole statically with libdwarves to see if
we get performance improvements...

> context, avoiding global lists where possible is a good thing I think,

Even without a library :-)

> since if it was used as a library, multiple invokations could confuse
> the elf_functions list. To that end, can we make the elf_functions_list
> a field in the conf_load perhaps? It already contains base_btf so there

conf_load looks with the structs we have now, so I would try to start
there.

- Arnaldo

> is a precedent for storing data relevant to all encoders there, and
> btf_encoder__new() has conf_load as a parameter, so the elf functions
> list can still always be retrieved on encoder creation. In addition the
> parameter to cus__process_dwflmod() has the parms structure which
> contains the conf_load; you'd just need to pass that through to your
> pre_load_module() callback I think.
> 
> It shouldn't be a massive change but I think it would be worthwhile.
> 
> Thanks!
> 
> > An elf_functions structure is allocated and filled out by
> > btf_encoder__pre_load_module() hook, and the list is cleared after
> > btf_encoder__encode() is done.
> > 
> > At this point btf_encoders don't use shared elf_functions yet (each
> > maintains their own copy as before), but it is built before encoders
> > are initialized.
> > 
> > Signed-off-by: Ihor Solodrai <ihor.solodrai@pm.me>
> > ---
> >  btf_encoder.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++
> >  btf_encoder.h |  2 ++
> >  pahole.c      |  3 +++
> >  3 files changed, 71 insertions(+)
> > 
> > diff --git a/btf_encoder.c b/btf_encoder.c
> > index 9c840fa..8e8fd05 100644
> > --- a/btf_encoder.c
> > +++ b/btf_encoder.c
> > @@ -103,6 +103,8 @@ struct elf_secinfo {
> >  };
> >  
> >  struct elf_functions {
> > +	struct list_head node; /* for elf_functions_list */
> > +	Elf *elf; /* source ELF */
> >  	struct elf_symtab *symtab;
> >  	struct elf_function *entries;
> >  	int cnt;
> > @@ -147,6 +149,67 @@ struct btf_kfunc_set_range {
> >  	uint64_t end;
> >  };
> >  
> > +
> > +/* In principle, multiple ELFs can be processed in one pahole run,
> > + * so we have to store elf_functions table per ELF.
> > + * An element is added to the list on btf_encoder__pre_load_module,
> > + * and removed after btf_encoder__encode is done.
> > + */
> > +static LIST_HEAD(elf_functions_list);
> > +
> > +static inline void elf_functions__delete(struct elf_functions *funcs)
> > +{
> > +	free(funcs->entries);
> > +	elf_symtab__delete(funcs->symtab);
> > +	list_del(&funcs->node);
> > +	free(funcs);
> > +}
> > +
> > +static inline void elf_functions__delete_all(void)
> > +{
> > +	struct list_head *pos, *tmp;
> > +
> > +	list_for_each_safe(pos, tmp, &elf_functions_list) {
> > +		struct elf_functions *funcs = list_entry(pos, struct elf_functions, node);
> > +
> > +		elf_functions__delete(funcs);
> > +	}
> > +}
> > +
> > +static int elf_functions__collect(struct elf_functions *functions);
> > +
> > +int btf_encoder__pre_load_module(Dwfl_Module *mod, Elf *elf)
> > +{
> > +	struct elf_functions *funcs;
> > +	int err;
> > +
> > +	funcs = calloc(1, sizeof(*funcs));
> > +	if (!funcs) {
> > +		err = -ENOMEM;
> > +		goto out_delete;
> > +	}
> > +
> > +	funcs->symtab = elf_symtab__new(NULL, elf);
> > +	if (!funcs->symtab) {
> > +		err = -1;
> > +		goto out_delete;
> > +	}
> > +
> > +	funcs->elf = elf;
> > +	err = elf_functions__collect(funcs);
> > +	if (err)
> > +		goto out_delete;
> > +
> > +	list_add_tail(&funcs->node, &elf_functions_list);
> > +
> > +	return 0;
> > +
> > +out_delete:
> > +	elf_functions__delete(funcs);
> > +	return err;
> > +}
> > +
> > +
> >  static LIST_HEAD(encoders);
> >  static pthread_mutex_t encoders__lock = PTHREAD_MUTEX_INITIALIZER;
> >  
> > @@ -2071,6 +2134,8 @@ int btf_encoder__encode(struct btf_encoder *encoder)
> >  #endif
> >  		err = btf_encoder__write_elf(encoder, encoder->btf, BTF_ELF_SEC);
> >  	}
> > +
> > +	elf_functions__delete_all();
> >  	return err;
> >  }
> >  
> > @@ -2387,6 +2452,7 @@ struct btf_encoder *btf_encoder__new(struct cu *cu, const char *detached_filenam
> >  			goto out;
> >  		}
> >  		encoder->functions.symtab = encoder->symtab;
> > +		encoder->functions.elf = cu->elf;
> >  
> >  		/* index the ELF sections for later lookup */
> >  
> > diff --git a/btf_encoder.h b/btf_encoder.h
> > index 824963b..7debd67 100644
> > --- a/btf_encoder.h
> > +++ b/btf_encoder.h
> > @@ -34,4 +34,6 @@ struct btf *btf_encoder__btf(struct btf_encoder *encoder);
> >  
> >  int btf_encoder__add_encoder(struct btf_encoder *encoder, struct btf_encoder *other);
> >  
> > +int btf_encoder__pre_load_module(Dwfl_Module *mod, Elf *elf);
> > +
> >  #endif /* _BTF_ENCODER_H_ */
> > diff --git a/pahole.c b/pahole.c
> > index b9e97ef..891af3a 100644
> > --- a/pahole.c
> > +++ b/pahole.c
> > @@ -3814,6 +3814,9 @@ int main(int argc, char *argv[])
> >  		conf_load.threads_collect = pahole_threads_collect;
> >  	}
> >  
> > +	if (btf_encode)
> > +		conf_load.pre_load_module = btf_encoder__pre_load_module;
> > +
> >  	// Make 'pahole --header type < file' a shorter form of 'pahole -C type --count 1 < file'
> >  	if (conf.header_type && !class_name && prettify_input) {
> >  		conf.count = 1;

  reply	other threads:[~2024-10-17 20:13 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-16  0:10 [PATCH v3 dwarves 0/5] btf_encoder: implement shared elf_functions table Ihor Solodrai
2024-10-16  0:10 ` [PATCH v3 dwarves 1/5] dwarf_loader: introduce pre_load_module hook to conf_load Ihor Solodrai
2024-10-17 10:44   ` Alan Maguire
2024-10-16  0:10 ` [PATCH v3 dwarves 2/5] btf_encoder: introduce elf_functions struct type Ihor Solodrai
2024-10-17 10:29   ` Alan Maguire
2024-10-16  0:10 ` [PATCH v3 dwarves 3/5] btf_encoder: collect elf_functions in btf_encoder__pre_load_module Ihor Solodrai
2024-10-17 10:56   ` Alan Maguire
2024-10-17 20:13     ` Arnaldo Carvalho de Melo [this message]
2024-10-18 20:17       ` Ihor Solodrai
2024-10-16  0:10 ` [PATCH v3 dwarves 4/5] btf_encoder: store a list of elf_function per function name Ihor Solodrai
2024-10-21 17:51   ` Alan Maguire
2024-10-31  0:14     ` Ihor Solodrai
2024-11-06 23:28       ` Ihor Solodrai
2024-11-07 15:45         ` Alan Maguire
2024-10-16  0:10 ` [PATCH v3 dwarves 5/5] btf_encoder: switch to shared elf_functions table Ihor Solodrai

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=ZxFv46O6UPnqbzGF@x1 \
    --to=acme@kernel.org \
    --cc=alan.maguire@oracle.com \
    --cc=andrii@kernel.org \
    --cc=dwarves@vger.kernel.org \
    --cc=eddyz87@gmail.com \
    --cc=ihor.solodrai@pm.me \
    /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.