From patchwork Wed Jan 26 04:05:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kui-Feng Lee X-Patchwork-Id: 12724571 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 772E4C2BA4C for ; Wed, 26 Jan 2022 04:06:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237483AbiAZEG1 (ORCPT ); Tue, 25 Jan 2022 23:06:27 -0500 Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:59566 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237464AbiAZEGY (ORCPT ); Tue, 25 Jan 2022 23:06:24 -0500 Received: from pps.filterd (m0148461.ppops.net [127.0.0.1]) by mx0a-00082601.pphosted.com (8.16.1.2/8.16.1.2) with ESMTP id 20PMO2Zc026899 for ; Tue, 25 Jan 2022 20:06:22 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=facebook; bh=DCMSFmJbLQ91HXUrcnvneW49VuxbN1I/B/x+Vf9XN4I=; b=eSPaQFJuHkU8JLLgpUHQQXTaY+Msl5YDPvq1AdWqIyhWNrTOc6CfRpS5Um37qQqe1vI7 cwUZ0h7+RYiGqcVNaY86Lj9xSaI/Y5Bvk2snt1cKJQk+ObWjpi3Zyo0F2Y1chVx6jszO EDoGwRa5GkMxMNA5nobWMPSA/GXwCGU6t7o= Received: from mail.thefacebook.com ([163.114.132.120]) by mx0a-00082601.pphosted.com (PPS) with ESMTPS id 3dts3e9sem-5 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 25 Jan 2022 20:06:22 -0800 Received: from twshared11487.23.frc3.facebook.com (2620:10d:c085:208::f) by mail.thefacebook.com (2620:10d:c085:11d::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 20:06:21 -0800 Received: by devvm1744.ftw0.facebook.com (Postfix, from userid 460691) id DDF4E2C1E0E2; Tue, 25 Jan 2022 20:06:17 -0800 (PST) From: Kui-Feng Lee To: , CC: , , , , Kui-Feng Lee Subject: [PATCH dwarves v3 1/4] dwarf_loader: Receive per-thread data on worker threads. Date: Tue, 25 Jan 2022 20:05:06 -0800 Message-ID: <20220126040509.1862767-2-kuifeng@fb.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220126040509.1862767-1-kuifeng@fb.com> References: <20220126040509.1862767-1-kuifeng@fb.com> MIME-Version: 1.0 X-FB-Internal: Safe X-Proofpoint-ORIG-GUID: 1o9-eJuiwQmgWiH1ShNJ4e__8iDPH0Sz X-Proofpoint-GUID: 1o9-eJuiwQmgWiH1ShNJ4e__8iDPH0Sz X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.816,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-26_01,2022-01-25_02,2021-12-02_01 X-Proofpoint-Spam-Details: rule=fb_outbound_notspam policy=fb_outbound score=0 impostorscore=0 malwarescore=0 clxscore=1015 adultscore=0 mlxlogscore=999 phishscore=0 suspectscore=0 mlxscore=0 lowpriorityscore=0 priorityscore=1501 spamscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2201260019 X-FB-Internal: deliver Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Add arguments to steal and thread_exit callbacks of conf_load to receive per-thread data. Signed-off-by: Kui-Feng Lee Acked-by: Andrii Nakryiko --- btf_loader.c | 2 +- ctf_loader.c | 2 +- dwarf_loader.c | 4 ++-- dwarves.h | 5 +++-- pahole.c | 3 ++- pdwtags.c | 3 ++- pfunct.c | 4 +++- 7 files changed, 14 insertions(+), 9 deletions(-) diff --git a/btf_loader.c b/btf_loader.c index 7a5b16ff393e..b61cadd55127 100644 --- a/btf_loader.c +++ b/btf_loader.c @@ -624,7 +624,7 @@ static int cus__load_btf(struct cus *cus, struct conf_load *conf, const char *fi * The app stole this cu, possibly deleting it, * so forget about it */ - if (conf && conf->steal && conf->steal(cu, conf)) + if (conf && conf->steal && conf->steal(cu, conf, NULL)) return 0; cus__add(cus, cu); diff --git a/ctf_loader.c b/ctf_loader.c index 7c34739afdce..de6d4dbfce97 100644 --- a/ctf_loader.c +++ b/ctf_loader.c @@ -722,7 +722,7 @@ int ctf__load_file(struct cus *cus, struct conf_load *conf, * The app stole this cu, possibly deleting it, * so forget about it */ - if (conf && conf->steal && conf->steal(cu, conf)) + if (conf && conf->steal && conf->steal(cu, conf, NULL)) return 0; cus__add(cus, cu); diff --git a/dwarf_loader.c b/dwarf_loader.c index e30b03c1c541..bf9ea3765419 100644 --- a/dwarf_loader.c +++ b/dwarf_loader.c @@ -2686,7 +2686,7 @@ static int cu__finalize(struct cu *cu, struct conf_load *conf) { cu__for_all_tags(cu, class_member__cache_byte_size, conf); if (conf && conf->steal) { - return conf->steal(cu, conf); + return conf->steal(cu, conf, NULL); } return LSK__KEEPIT; } @@ -2930,7 +2930,7 @@ static void *dwarf_cus__process_cu_thread(void *arg) goto out_abort; } - if (dcus->conf->thread_exit && dcus->conf->thread_exit() != 0) + if (dcus->conf->thread_exit && dcus->conf->thread_exit(dcus->conf, NULL) != 0) goto out_abort; return (void *)DWARF_CB_OK; diff --git a/dwarves.h b/dwarves.h index 52d162d67456..9a8e4de8843a 100644 --- a/dwarves.h +++ b/dwarves.h @@ -48,8 +48,9 @@ struct conf_fprintf; */ struct conf_load { enum load_steal_kind (*steal)(struct cu *cu, - struct conf_load *conf); - int (*thread_exit)(void); + struct conf_load *conf, + void *thr_data); + int (*thread_exit)(struct conf_load *conf, void *thr_data); void *cookie; char *format_path; int nr_jobs; diff --git a/pahole.c b/pahole.c index f3a51cb2fe74..f3eeaaca4cdf 100644 --- a/pahole.c +++ b/pahole.c @@ -2799,7 +2799,8 @@ out: static struct type_instance *header; static enum load_steal_kind pahole_stealer(struct cu *cu, - struct conf_load *conf_load) + struct conf_load *conf_load, + void *thr_data) { int ret = LSK__DELETE; diff --git a/pdwtags.c b/pdwtags.c index 2b5ba1bf6745..8b1d6f1c96cb 100644 --- a/pdwtags.c +++ b/pdwtags.c @@ -72,7 +72,8 @@ static int cu__emit_tags(struct cu *cu) } static enum load_steal_kind pdwtags_stealer(struct cu *cu, - struct conf_load *conf_load __maybe_unused) + struct conf_load *conf_load __maybe_unused, + void *thr_data __maybe_unused) { cu__emit_tags(cu); return LSK__DELETE; diff --git a/pfunct.c b/pfunct.c index 5485622e639b..314915b774f4 100644 --- a/pfunct.c +++ b/pfunct.c @@ -489,7 +489,9 @@ int elf_symtabs__show(char *filenames[]) return EXIT_SUCCESS; } -static enum load_steal_kind pfunct_stealer(struct cu *cu, struct conf_load *conf_load __maybe_unused) +static enum load_steal_kind pfunct_stealer(struct cu *cu, + struct conf_load *conf_load __maybe_unused, + void *thr_data __maybe_unused) { if (function_name) { From patchwork Wed Jan 26 04:05:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kui-Feng Lee X-Patchwork-Id: 12724572 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4FFEC5DF62 for ; Wed, 26 Jan 2022 04:07:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237502AbiAZEHE (ORCPT ); Tue, 25 Jan 2022 23:07:04 -0500 Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:1828 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237499AbiAZEHE (ORCPT ); Tue, 25 Jan 2022 23:07:04 -0500 Received: from pps.filterd (m0044010.ppops.net [127.0.0.1]) by mx0a-00082601.pphosted.com (8.16.1.2/8.16.1.2) with ESMTP id 20PMO4Gp025748 for ; Tue, 25 Jan 2022 20:07:04 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=facebook; bh=ibCKQH0cx7z0cP/kqbpB8YU59O69ng0IzcDg0hIKdGQ=; b=lwSqgQAFoLJGE6OMSaPZZnw4tmsNqqq9fxI6MoS9JQvYpJCFNs8TxSd+xUWMiywG+Gx6 rum1YX9VHT2mfHz0KRsXk18HKeTBQdZUbx8+X2b+oXDuzu+NB5XWXvAYbpKm0XJ7MXJx MJsIfAsAXwGI3fMJarZ1mI059SnZpoKuWo8= Received: from mail.thefacebook.com ([163.114.132.120]) by mx0a-00082601.pphosted.com (PPS) with ESMTPS id 3dth265c0c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 25 Jan 2022 20:07:03 -0800 Received: from twshared19733.18.frc3.facebook.com (2620:10d:c085:108::4) by mail.thefacebook.com (2620:10d:c085:11d::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 20:07:03 -0800 Received: by devvm1744.ftw0.facebook.com (Postfix, from userid 460691) id D38D52C1E2B0; Tue, 25 Jan 2022 20:06:58 -0800 (PST) From: Kui-Feng Lee To: , CC: , , , , Kui-Feng Lee Subject: [PATCH dwarves v3 2/4] dwarf_loader: Prepare and pass per-thread data to worker threads. Date: Tue, 25 Jan 2022 20:05:07 -0800 Message-ID: <20220126040509.1862767-3-kuifeng@fb.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220126040509.1862767-1-kuifeng@fb.com> References: <20220126040509.1862767-1-kuifeng@fb.com> MIME-Version: 1.0 X-FB-Internal: Safe X-Proofpoint-GUID: q6ADWZItUoYXV2CI6HCJPYr-M0WSpyVw X-Proofpoint-ORIG-GUID: q6ADWZItUoYXV2CI6HCJPYr-M0WSpyVw X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.816,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-26_01,2022-01-25_02,2021-12-02_01 X-Proofpoint-Spam-Details: rule=fb_outbound_notspam policy=fb_outbound score=0 impostorscore=0 priorityscore=1501 spamscore=0 adultscore=0 mlxlogscore=958 bulkscore=0 suspectscore=0 mlxscore=0 phishscore=0 malwarescore=0 lowpriorityscore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2201260020 X-FB-Internal: deliver Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Add interfaces to allow users of dwarf_loader to prepare and pass per-thread data to steal-functions running on worker threads. Signed-off-by: Kui-Feng Lee Acked-by: Andrii Nakryiko --- dwarf_loader.c | 58 +++++++++++++++++++++++++++++++++++++++----------- dwarves.h | 4 ++++ 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/dwarf_loader.c b/dwarf_loader.c index bf9ea3765419..ed415d2db11f 100644 --- a/dwarf_loader.c +++ b/dwarf_loader.c @@ -2682,18 +2682,18 @@ static int class_member__cache_byte_size(struct tag *tag, struct cu *cu, return 0; } -static int cu__finalize(struct cu *cu, struct conf_load *conf) +static int cu__finalize(struct cu *cu, struct conf_load *conf, void *thr_data) { cu__for_all_tags(cu, class_member__cache_byte_size, conf); if (conf && conf->steal) { - return conf->steal(cu, conf, NULL); + return conf->steal(cu, conf, thr_data); } return LSK__KEEPIT; } -static int cus__finalize(struct cus *cus, struct cu *cu, struct conf_load *conf) +static int cus__finalize(struct cus *cus, struct cu *cu, struct conf_load *conf, void *thr_data) { - int lsk = cu__finalize(cu, conf); + int lsk = cu__finalize(cu, conf, thr_data); switch (lsk) { case LSK__DELETE: cu__delete(cu); @@ -2862,7 +2862,13 @@ struct dwarf_cus { struct dwarf_cu *type_dcu; }; -static int dwarf_cus__create_and_process_cu(struct dwarf_cus *dcus, Dwarf_Die *cu_die, uint8_t pointer_size) +struct dwarf_thread { + struct dwarf_cus *dcus; + void *data; +}; + +static int dwarf_cus__create_and_process_cu(struct dwarf_cus *dcus, Dwarf_Die *cu_die, + uint8_t pointer_size, void *thr_data) { /* * DW_AT_name in DW_TAG_compile_unit can be NULL, first seen in: @@ -2884,7 +2890,7 @@ static int dwarf_cus__create_and_process_cu(struct dwarf_cus *dcus, Dwarf_Die *c cu->dfops = &dwarf__ops; if (die__process_and_recode(cu_die, cu, dcus->conf) != 0 || - cus__finalize(dcus->cus, cu, dcus->conf) == LSK__STOP_LOADING) + cus__finalize(dcus->cus, cu, dcus->conf, thr_data) == LSK__STOP_LOADING) return DWARF_CB_ABORT; return DWARF_CB_OK; @@ -2918,7 +2924,8 @@ out_unlock: static void *dwarf_cus__process_cu_thread(void *arg) { - struct dwarf_cus *dcus = arg; + struct dwarf_thread *dthr = arg; + struct dwarf_cus *dcus = dthr->dcus; uint8_t pointer_size, offset_size; Dwarf_Die die_mem, *cu_die; @@ -2926,11 +2933,13 @@ static void *dwarf_cus__process_cu_thread(void *arg) if (cu_die == NULL) break; - if (dwarf_cus__create_and_process_cu(dcus, cu_die, pointer_size) == DWARF_CB_ABORT) + if (dwarf_cus__create_and_process_cu(dcus, cu_die, + pointer_size, dthr->data) == DWARF_CB_ABORT) goto out_abort; } - if (dcus->conf->thread_exit && dcus->conf->thread_exit(dcus->conf, NULL) != 0) + if (dcus->conf->thread_exit && + dcus->conf->thread_exit(dcus->conf, dthr->data) != 0) goto out_abort; return (void *)DWARF_CB_OK; @@ -2941,10 +2950,25 @@ out_abort: static int dwarf_cus__threaded_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; + 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); + for (i = 0; i < dcus->conf->nr_jobs; ++i) { - dcus->error = pthread_create(&threads[i], NULL, dwarf_cus__process_cu_thread, dcus); + dthr[i].dcus = dcus; + dthr[i].data = thread_data[i]; + + dcus->error = pthread_create(&threads[i], NULL, + dwarf_cus__process_cu_thread, + &dthr[i]); if (dcus->error) goto out_join; } @@ -2960,6 +2984,13 @@ out_join: 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; + } + return dcus->error; } @@ -2976,7 +3007,8 @@ static int __dwarf_cus__process_cus(struct dwarf_cus *dcus) if (cu_die == NULL) break; - if (dwarf_cus__create_and_process_cu(dcus, cu_die, pointer_size) == DWARF_CB_ABORT) + if (dwarf_cus__create_and_process_cu(dcus, cu_die, + pointer_size, NULL) == DWARF_CB_ABORT) return DWARF_CB_ABORT; dcus->off = noff; @@ -3070,7 +3102,7 @@ static int cus__merge_and_process_cu(struct cus *cus, struct conf_load *conf, if (cu__resolve_func_ret_types(cu) != LSK__KEEPIT) goto out_abort; - if (cus__finalize(cus, cu, conf) == LSK__STOP_LOADING) + if (cus__finalize(cus, cu, conf, NULL) == LSK__STOP_LOADING) goto out_abort; return 0; @@ -3102,7 +3134,7 @@ static int cus__load_module(struct cus *cus, struct conf_load *conf, } if (type_cu != NULL) { - type_lsk = cu__finalize(type_cu, conf); + type_lsk = cu__finalize(type_cu, conf, NULL); if (type_lsk == LSK__KEEPIT) { cus__add(cus, type_cu); } diff --git a/dwarves.h b/dwarves.h index 9a8e4de8843a..de152f9b64cf 100644 --- a/dwarves.h +++ b/dwarves.h @@ -71,6 +71,10 @@ struct conf_load { const char *kabi_prefix; struct btf *base_btf; struct conf_fprintf *conf_fprintf; + int (*threads_prepare)(struct conf_load *conf, int nr_threads, + void **thr_data); + int (*threads_collect)(struct conf_load *conf, int nr_threads, + void **thr_data, int error); }; /** struct conf_fprintf - hints to the __fprintf routines From patchwork Wed Jan 26 04:05:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kui-Feng Lee X-Patchwork-Id: 12724573 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8CF7AC5DF62 for ; Wed, 26 Jan 2022 04:07:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237507AbiAZEHI (ORCPT ); Tue, 25 Jan 2022 23:07:08 -0500 Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:28542 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S237509AbiAZEHI (ORCPT ); Tue, 25 Jan 2022 23:07:08 -0500 Received: from pps.filterd (m0001303.ppops.net [127.0.0.1]) by m0001303.ppops.net (8.16.1.2/8.16.1.2) with ESMTP id 20PMO1uk003790 for ; Tue, 25 Jan 2022 20:07:07 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=facebook; bh=4mFSaPc3keKHilpmEs9b8g+hJ44EVpIzYvyHaxnLpnM=; b=NoH96/f4/vwOLPF/yyIrLn+nWw0fDmPnFEp2++WUGoQUSlZQIFTRaqbJirn9PgRkcvww pZJhV2bSWEHuGDo5jOkHVvoTONyfqG7ULUL84tsro2qJ2bF2gZUEXEZUuJnxwLoqI+mK ihCGx8CNw6cMrmYrKdgxK9pvNhCVX/Q9CtE= Received: from maileast.thefacebook.com ([163.114.130.16]) by m0001303.ppops.net (PPS) with ESMTPS id 3dtmrwux8g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 25 Jan 2022 20:07:07 -0800 Received: from twshared2974.18.frc3.facebook.com (2620:10d:c0a8:1b::d) by mail.thefacebook.com (2620:10d:c0a8:82::d) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 20:07:06 -0800 Received: by devvm1744.ftw0.facebook.com (Postfix, from userid 460691) id 456E12C1E2B4; Tue, 25 Jan 2022 20:07:00 -0800 (PST) From: Kui-Feng Lee To: , CC: , , , , Kui-Feng Lee Subject: [PATCH dwarves v3 3/4] pahole: Use per-thread btf instances to avoid mutex locking. Date: Tue, 25 Jan 2022 20:05:08 -0800 Message-ID: <20220126040509.1862767-4-kuifeng@fb.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220126040509.1862767-1-kuifeng@fb.com> References: <20220126040509.1862767-1-kuifeng@fb.com> MIME-Version: 1.0 X-FB-Internal: Safe X-Proofpoint-GUID: -PwOILxsU-ulcXsJ0aLWelVnPw8wY5Cw X-Proofpoint-ORIG-GUID: -PwOILxsU-ulcXsJ0aLWelVnPw8wY5Cw X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.816,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-26_01,2022-01-25_02,2021-12-02_01 X-Proofpoint-Spam-Details: rule=fb_outbound_notspam policy=fb_outbound score=0 phishscore=0 mlxlogscore=999 impostorscore=0 adultscore=0 clxscore=1015 priorityscore=1501 mlxscore=0 spamscore=0 suspectscore=0 malwarescore=0 bulkscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2201260020 X-FB-Internal: deliver Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Create an instance of btf for each worker thread, and add type info to the local btf instance in the steal-function of pahole without mutex acquiring. Once finished with all worker threads, merge all per-thread btf instances to the primary btf instance. Signed-off-by: Kui-Feng Lee --- btf_encoder.c | 5 +++ btf_encoder.h | 2 + pahole.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 120 insertions(+), 8 deletions(-) diff --git a/btf_encoder.c b/btf_encoder.c index 9d015f304e92..56a76f5d7275 100644 --- a/btf_encoder.c +++ b/btf_encoder.c @@ -1529,3 +1529,8 @@ int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu) out: return err; } + +struct btf *btf_encoder__btf(struct btf_encoder *encoder) +{ + return encoder->btf; +} diff --git a/btf_encoder.h b/btf_encoder.h index f133b0d7674d..0f0eee84df74 100644 --- a/btf_encoder.h +++ b/btf_encoder.h @@ -29,4 +29,6 @@ struct btf_encoder *btf_encoders__first(struct list_head *encoders); struct btf_encoder *btf_encoders__next(struct btf_encoder *encoder); +struct btf *btf_encoder__btf(struct btf_encoder *encoder); + #endif /* _BTF_ENCODER_H_ */ diff --git a/pahole.c b/pahole.c index f3eeaaca4cdf..525eb4d90b08 100644 --- a/pahole.c +++ b/pahole.c @@ -29,6 +29,7 @@ #include "btf_encoder.h" static struct btf_encoder *btf_encoder; +static pthread_mutex_t btf_encoder_lock = PTHREAD_MUTEX_INITIALIZER; static char *detached_btf_filename; static bool btf_encode; static bool btf_gen_floats; @@ -2798,6 +2799,65 @@ out: static struct type_instance *header; +struct thread_data { + struct btf *btf; + struct btf_encoder *encoder; +}; + +static int pahole_threads_prepare(struct conf_load *conf, int nr_threads, void **thr_data) +{ + int i; + struct thread_data *threads = calloc(sizeof(struct thread_data), nr_threads); + + for (i = 0; i < nr_threads; i++) + thr_data[i] = threads + i; + + return 0; +} + +static int pahole_thread_exit(struct conf_load *conf, void *thr_data) +{ + struct thread_data *thread = thr_data; + + if (thread == NULL) + return 0; + + /* + * Here we will call btf__dedup() here once we extend + * btf__dedup(). + */ + + if (thread->encoder == btf_encoder) { + /* Release the lock acuqired when created btf_encoder */ + pthread_mutex_unlock(&btf_encoder_lock); + return 0; + } + + pthread_mutex_lock(&btf_encoder_lock); + btf__add_btf(btf_encoder__btf(btf_encoder), thread->btf); + pthread_mutex_unlock(&btf_encoder_lock); + + btf_encoder__delete(thread->encoder); + thread->encoder = NULL; + + return 0; +} + +static int pahole_threads_collect(struct conf_load *conf, int nr_threads, void **thr_data, + int error) +{ + struct thread_data **threads = (struct thread_data **)thr_data; + int i; + + for (i = 0; i < nr_threads; i++) { + if (threads[i]->encoder && threads[i]->encoder != btf_encoder) + btf_encoder__delete(threads[i]->encoder); + } + free(threads[0]); + + return 0; +} + static enum load_steal_kind pahole_stealer(struct cu *cu, struct conf_load *conf_load, void *thr_data) @@ -2819,30 +2879,72 @@ static enum load_steal_kind pahole_stealer(struct cu *cu, if (btf_encode) { static pthread_mutex_t btf_lock = PTHREAD_MUTEX_INITIALIZER; + struct btf_encoder *encoder; - pthread_mutex_lock(&btf_lock); /* * FIXME: * * This should be really done at main(), but since in the current codebase only at this * point we'll have cu->elf setup... */ + pthread_mutex_lock(&btf_lock); if (!btf_encoder) { - btf_encoder = btf_encoder__new(cu, detached_btf_filename, conf_load->base_btf, skip_encoding_btf_vars, - btf_encode_force, btf_gen_floats, global_verbose); - if (btf_encoder == NULL) { - ret = LSK__STOP_LOADING; - goto out_btf; + /* + * btf_encoder is the primary encoder. + * And, it is used by the thread + * create it. + */ + btf_encoder = btf_encoder__new(cu, detached_btf_filename, + conf_load->base_btf, + skip_encoding_btf_vars, + btf_encode_force, + btf_gen_floats, global_verbose); + if (btf_encoder && thr_data) { + struct thread_data *thread = (struct thread_data *)thr_data; + + thread->encoder = btf_encoder; + thread->btf = btf_encoder__btf(btf_encoder); + /* Will be relased by pahole_thread_exit() */ + pthread_mutex_lock(&btf_encoder_lock); } } + pthread_mutex_unlock(&btf_lock); + + if (btf_encoder == NULL) { + ret = LSK__STOP_LOADING; + goto out_btf; + } - if (btf_encoder__encode_cu(btf_encoder, cu)) { + /* + * thr_data keeps per-thread data for worker threads. Each worker thread + * has an encoder. The main thread will merge the data collected by all + * these encoders to btf_encoder. However, the first thread reaching this + * function creates btf_encoder and reuses it as its local encoder. It + * avoids copying the data collected by the first thread. + */ + if (thr_data) { + struct thread_data *thread = (struct thread_data *)thr_data; + + if (thread->encoder == NULL) { + thread->encoder = + btf_encoder__new(cu, detached_btf_filename, + NULL, + skip_encoding_btf_vars, + btf_encode_force, + btf_gen_floats, + global_verbose); + thread->btf = btf_encoder__btf(thread->encoder); + } + encoder = thread->encoder; + } else + encoder = btf_encoder; + + if (btf_encoder__encode_cu(encoder, cu)) { fprintf(stderr, "Encountered error while encoding BTF.\n"); exit(1); } ret = LSK__DELETE; out_btf: - pthread_mutex_unlock(&btf_lock); return ret; } #if 0 @@ -3207,6 +3309,9 @@ int main(int argc, char *argv[]) memset(tab, ' ', sizeof(tab) - 1); conf_load.steal = pahole_stealer; + conf_load.thread_exit = pahole_thread_exit; + conf_load.threads_prepare = pahole_threads_prepare; + conf_load.threads_collect = pahole_threads_collect; // Make 'pahole --header type < file' a shorter form of 'pahole -C type --count 1 < file' if (conf.header_type && !class_name && prettify_input) { From patchwork Wed Jan 26 04:05:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kui-Feng Lee X-Patchwork-Id: 12724574 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DC016C63684 for ; Wed, 26 Jan 2022 04:07:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230158AbiAZEHK (ORCPT ); Tue, 25 Jan 2022 23:07:10 -0500 Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:35824 "EHLO mx0b-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230036AbiAZEHJ (ORCPT ); Tue, 25 Jan 2022 23:07:09 -0500 Received: from pps.filterd (m0109332.ppops.net [127.0.0.1]) by mx0a-00082601.pphosted.com (8.16.1.2/8.16.1.2) with ESMTP id 20PMO1q7006520 for ; Tue, 25 Jan 2022 20:07:09 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fb.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=facebook; bh=Y0qKNhCI6ns3DUFil7kHybRw+kFWDsanuiUfhNjuUcI=; b=fxiaJ6CFNs//7iGWAk6xiG/xdB9d8xwGMwY3Yy22pgmHJqm0qYnBCULjofb2ZnII68fW ZmqbmBEvlHhr1Tc2OL//u8V3dhdWgz9i9NiKVEnnI3tqkExkFz3W7A94wuyuet75pG/S WtdrlieCieTY/qSYmW8FELUWXmA3IJvX1Uo= Received: from maileast.thefacebook.com ([163.114.130.16]) by mx0a-00082601.pphosted.com (PPS) with ESMTPS id 3dtrpf210v-5 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 25 Jan 2022 20:07:08 -0800 Received: from twshared2974.18.frc3.facebook.com (2620:10d:c0a8:1b::d) by mail.thefacebook.com (2620:10d:c0a8:82::e) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 20:07:06 -0800 Received: by devvm1744.ftw0.facebook.com (Postfix, from userid 460691) id A32062C1E2B8; Tue, 25 Jan 2022 20:07:01 -0800 (PST) From: Kui-Feng Lee To: , CC: , , , , Kui-Feng Lee Subject: [PATCH dwarves v3 4/4] libbpf: Update libbpf to a new revision. Date: Tue, 25 Jan 2022 20:05:09 -0800 Message-ID: <20220126040509.1862767-5-kuifeng@fb.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220126040509.1862767-1-kuifeng@fb.com> References: <20220126040509.1862767-1-kuifeng@fb.com> MIME-Version: 1.0 X-FB-Internal: Safe X-Proofpoint-GUID: 7q0OnMTzmEaxAUWw09QPgoi_7wtft9uV X-Proofpoint-ORIG-GUID: 7q0OnMTzmEaxAUWw09QPgoi_7wtft9uV X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.816,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-26_01,2022-01-25_02,2021-12-02_01 X-Proofpoint-Spam-Details: rule=fb_outbound_notspam policy=fb_outbound score=0 impostorscore=0 clxscore=1015 spamscore=0 priorityscore=1501 phishscore=0 mlxlogscore=999 malwarescore=0 mlxscore=0 lowpriorityscore=0 bulkscore=0 adultscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2201260020 X-FB-Internal: deliver Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org Replace deprecated APIs with new ones. Acked-by: Andrii Nakryiko --- btf_encoder.c | 20 ++++++++++---------- btf_loader.c | 2 +- lib/bpf | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/btf_encoder.c b/btf_encoder.c index 56a76f5d7275..a31dbe3edc93 100644 --- a/btf_encoder.c +++ b/btf_encoder.c @@ -172,7 +172,7 @@ __attribute ((format (printf, 5, 6))) static void btf__log_err(const struct btf *btf, int kind, const char *name, bool output_cr, const char *fmt, ...) { - fprintf(stderr, "[%u] %s %s", btf__get_nr_types(btf) + 1, + fprintf(stderr, "[%u] %s %s", btf__type_cnt(btf), btf_kind_str[kind], name ?: "(anon)"); if (fmt && *fmt) { @@ -203,7 +203,7 @@ static void btf_encoder__log_type(const struct btf_encoder *encoder, const struc out = err ? stderr : stdout; fprintf(out, "[%u] %s %s", - btf__get_nr_types(btf), btf_kind_str[kind], + btf__type_cnt(btf) - 1, btf_kind_str[kind], btf__printable_name(btf, t->name_off)); if (fmt && *fmt) { @@ -449,10 +449,10 @@ static int btf_encoder__add_field(struct btf_encoder *encoder, const char *name, int err; err = btf__add_field(btf, name, type, offset, bitfield_size); - t = btf__type_by_id(btf, btf__get_nr_types(btf)); + t = btf__type_by_id(btf, btf__type_cnt(btf) - 1); if (err) { fprintf(stderr, "[%u] %s %s's field '%s' offset=%u bit_size=%u type=%u Error emitting field\n", - btf__get_nr_types(btf), btf_kind_str[btf_kind(t)], + btf__type_cnt(btf) - 1, btf_kind_str[btf_kind(t)], btf__printable_name(btf, t->name_off), name, offset, bitfield_size, type); } else { @@ -899,9 +899,9 @@ static int btf_encoder__write_raw_file(struct btf_encoder *encoder) const void *raw_btf_data; int fd, err; - raw_btf_data = btf__get_raw_data(encoder->btf, &raw_btf_size); + raw_btf_data = btf__raw_data(encoder->btf, &raw_btf_size); if (raw_btf_data == NULL) { - fprintf(stderr, "%s: btf__get_raw_data failed!\n", __func__); + fprintf(stderr, "%s: btf__raw_data failed!\n", __func__); return -1; } @@ -976,7 +976,7 @@ static int btf_encoder__write_elf(struct btf_encoder *encoder) } } - raw_btf_data = btf__get_raw_data(btf, &raw_btf_size); + raw_btf_data = btf__raw_data(btf, &raw_btf_size); if (btf_data) { /* Existing .BTF section found */ @@ -1043,10 +1043,10 @@ int btf_encoder__encode(struct btf_encoder *encoder) btf_encoder__add_datasec(encoder, PERCPU_SECTION); /* Empty file, nothing to do, so... done! */ - if (btf__get_nr_types(encoder->btf) == 0) + if (btf__type_cnt(encoder->btf) - 1 == 0) return 0; - if (btf__dedup(encoder->btf, NULL, NULL)) { + if (btf__dedup(encoder->btf, NULL)) { fprintf(stderr, "%s: btf__dedup failed!\n", __func__); return -1; } @@ -1403,7 +1403,7 @@ void btf_encoder__delete(struct btf_encoder *encoder) int btf_encoder__encode_cu(struct btf_encoder *encoder, struct cu *cu) { - uint32_t type_id_off = btf__get_nr_types(encoder->btf); + uint32_t type_id_off = btf__type_cnt(encoder->btf) - 1; struct llvm_annotation *annot; int btf_type_id, tag_type_id; uint32_t core_id; diff --git a/btf_loader.c b/btf_loader.c index b61cadd55127..d9d59aa889a0 100644 --- a/btf_loader.c +++ b/btf_loader.c @@ -399,7 +399,7 @@ static int btf__load_types(struct btf *btf, struct cu *cu) uint32_t type_index; int err; - for (type_index = 1; type_index <= btf__get_nr_types(btf); type_index++) { + for (type_index = 1; type_index <= btf__type_cnt(btf) - 1; type_index++) { const struct btf_type *type_ptr = btf__type_by_id(btf, type_index); uint32_t type = btf_kind(type_ptr); diff --git a/lib/bpf b/lib/bpf index 94a49850c5ee..393a058d061d 160000 --- a/lib/bpf +++ b/lib/bpf @@ -1 +1 @@ -Subproject commit 94a49850c5ee61ea02dfcbabf48013391e8cecdf +Subproject commit 393a058d061d49d5c3055fa9eefafb4c0c31ccc3