From: Jiri Olsa <olsajiri@gmail.com>
To: Ihor Solodrai <ihor.solodrai@pm.me>
Cc: dwarves@vger.kernel.org, acme@kernel.org,
alan.maguire@oracle.com, eddyz87@gmail.com, andrii@kernel.org,
mykolal@fb.com, bpf@vger.kernel.org
Subject: Re: [PATCH dwarves v2 10/10] dwarf_loader: multithreading with a job/worker model
Date: Thu, 19 Dec 2024 15:59:13 +0100 [thread overview]
Message-ID: <Z2Q0wU_AOOF0c_NF@krava> (raw)
In-Reply-To: <20241213223641.564002-11-ihor.solodrai@pm.me>
On Fri, Dec 13, 2024 at 10:37:34PM +0000, Ihor Solodrai wrote:
SNIP
> +static void *dwarf_loader__worker_thread(void *arg)
> +{
> + struct cu_processing_job *job;
> + struct dwarf_cus *dcus = arg;
> + bool stop = false;
> + struct cu *cu;
> +
> + while (!stop) {
> + job = cus_queue__dequeue_job();
> +
> + switch (job->type) {
> +
> + case JOB_DECODE:
> + cu = dwarf_loader__decode_next_cu(dcus);
> +
> + if (cu == NULL) {
> + free(job);
> + stop = true;
> + break;
> + }
> +
> + /* Create and enqueue a new JOB_STEAL for this decoded CU */
> + struct cu_processing_job *steal_job = calloc(1, sizeof(*steal_job));
missing steal_job != NULL check
SNIP
> -static int dwarf_cus__threaded_process_cus(struct dwarf_cus *dcus)
> +static int dwarf_cus__process_cus(struct dwarf_cus *dcus)
> {
> - pthread_t threads[dcus->conf->nr_jobs];
> - struct dwarf_thread dthr[dcus->conf->nr_jobs];
> - void *thread_data[dcus->conf->nr_jobs];
> - int res;
> - int i;
> + int nr_workers = dcus->conf->nr_jobs > 0 ? dcus->conf->nr_jobs : 1;
> + pthread_t workers[nr_workers];
> + struct cu_processing_job *job;
>
> - if (dcus->conf->threads_prepare) {
> - res = dcus->conf->threads_prepare(dcus->conf, dcus->conf->nr_jobs, thread_data);
> - if (res != 0)
> - return res;
> - } else {
> - memset(thread_data, 0, sizeof(void *) * dcus->conf->nr_jobs);
> + cus_queue__init(nr_workers * 4);
why '* 4' ?
> +
> + /* fill up the queue with nr_workers JOB_DECODE jobs */
> + for (int i = 0; i < nr_workers; i++) {
> + job = calloc(1, sizeof(*job));
missing job != NULL check
> + job->type = JOB_DECODE;
> + /* no need for locks, workers were not started yet */
> + list_add(&job->node, &cus_processing_queue.jobs);
> }
>
> - for (i = 0; i < dcus->conf->nr_jobs; ++i) {
> - dthr[i].dcus = dcus;
> - dthr[i].data = thread_data[i];
> + if (dcus->error)
> + return dcus->error;
>
> - dcus->error = pthread_create(&threads[i], NULL,
> - dwarf_cus__process_cu_thread,
> - &dthr[i]);
> + for (int i = 0; i < nr_workers; ++i) {
> + dcus->error = pthread_create(&workers[i], NULL,
> + dwarf_loader__worker_thread,
> + dcus);
> if (dcus->error)
> goto out_join;
> }
> @@ -3596,54 +3766,19 @@ static int dwarf_cus__threaded_process_cus(struct dwarf_cus *dcus)
> dcus->error = 0;
>
> out_join:
> - while (--i >= 0) {
> + for (int i = 0; i < nr_workers; ++i) {
I think you should keep the original while loop to cleanup/wait only for
threads that we actually created
> void *res;
> - int err = pthread_join(threads[i], &res);
> + int err = pthread_join(workers[i], &res);
>
> if (err == 0 && res != NULL)
> dcus->error = (long)res;
> }
>
> - if (dcus->conf->threads_collect) {
> - res = dcus->conf->threads_collect(dcus->conf, dcus->conf->nr_jobs,
> - thread_data, dcus->error);
> - if (dcus->error == 0)
> - dcus->error = res;
> - }
> + cus_queue__destroy();
>
> return dcus->error;
> }
>
SNIP
next prev parent reply other threads:[~2024-12-19 14:59 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-13 22:36 [PATCH dwarves v2 00/10] pahole: shared ELF and faster reproducible BTF encoding Ihor Solodrai
2024-12-13 22:36 ` [PATCH dwarves v2 01/10] btf_encoder: simplify function encoding Ihor Solodrai
2024-12-13 22:36 ` [PATCH dwarves v2 02/10] btf_encoder: separate elf function, saved function representations Ihor Solodrai
2024-12-19 14:59 ` Jiri Olsa
2024-12-13 22:36 ` [PATCH dwarves v2 03/10] dwarf_loader: introduce pre_load_module hook to conf_load Ihor Solodrai
2024-12-13 22:37 ` [PATCH dwarves v2 04/10] btf_encoder: introduce elf_functions struct type Ihor Solodrai
2024-12-13 22:37 ` [PATCH dwarves v2 05/10] btf_encoder: collect elf_functions in btf_encoder__pre_load_module Ihor Solodrai
2024-12-13 22:37 ` [PATCH dwarves v2 06/10] btf_encoder: switch to shared elf_functions table Ihor Solodrai
2024-12-19 14:58 ` Jiri Olsa
2024-12-19 19:06 ` Ihor Solodrai
2024-12-13 22:37 ` [PATCH dwarves v2 07/10] btf_encoder: introduce btf_encoding_context Ihor Solodrai
2024-12-17 2:39 ` Eduard Zingerman
2024-12-17 3:15 ` Eduard Zingerman
2024-12-17 18:06 ` Ihor Solodrai
2024-12-18 0:03 ` Andrii Nakryiko
2024-12-18 0:40 ` Eduard Zingerman
2024-12-18 20:07 ` Ihor Solodrai
2024-12-19 14:59 ` Jiri Olsa
2024-12-13 22:37 ` [PATCH dwarves v2 08/10] btf_encoder: remove skip_encoding_inconsistent_proto Ihor Solodrai
2024-12-13 22:37 ` [PATCH dwarves v2 09/10] dwarf_loader: introduce cu->id Ihor Solodrai
2024-12-13 22:37 ` [PATCH dwarves v2 10/10] dwarf_loader: multithreading with a job/worker model Ihor Solodrai
2024-12-17 0:57 ` Eduard Zingerman
2024-12-17 18:12 ` Ihor Solodrai
2024-12-19 14:59 ` Jiri Olsa
2024-12-17 2:14 ` Eduard Zingerman
2024-12-19 14:59 ` Jiri Olsa [this message]
2024-12-19 19:31 ` Ihor Solodrai
2024-12-20 9:25 ` Jiri Olsa
2024-12-17 7:00 ` [PATCH dwarves v2 00/10] pahole: shared ELF and faster reproducible BTF encoding Eduard Zingerman
2024-12-20 12:31 ` Jiri Olsa
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=Z2Q0wU_AOOF0c_NF@krava \
--to=olsajiri@gmail.com \
--cc=acme@kernel.org \
--cc=alan.maguire@oracle.com \
--cc=andrii@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=dwarves@vger.kernel.org \
--cc=eddyz87@gmail.com \
--cc=ihor.solodrai@pm.me \
--cc=mykolal@fb.com \
/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.