From mboxrd@z Thu Jan 1 00:00:00 1970 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 50A99C433F5 for ; Fri, 11 Feb 2022 10:34:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348982AbiBKKeq (ORCPT ); Fri, 11 Feb 2022 05:34:46 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:60742 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1348945AbiBKKeb (ORCPT ); Fri, 11 Feb 2022 05:34:31 -0500 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DA58FEA8 for ; Fri, 11 Feb 2022 02:34:30 -0800 (PST) Received: by mail-yb1-xb4a.google.com with SMTP id b12-20020a056902030c00b0061d720e274aso17824428ybs.20 for ; Fri, 11 Feb 2022 02:34:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=wQ52+X1lVqs3NA4HQ0Y5oly0G0KrCZg9YO1xv1PXn5A=; b=a3hvrMFEyL/k2U8ysBuPjJnJ+Ygk9IuzMt5WdmMQmX9koGxdtYxgjRVe1l+4k8Kz+8 13Z3YydDRdSRXaU/sf9MCqpHBy+i9m5aSw/NnjsmXsuL7/HFDACiZf2VX9kCUpttkoVx p+dc3kkdel5pMgKWNy+PwNAXYXubgTfW/Y+VaRnTkocNolWj1Z674DOIAwh0ozl8gt+v c58txNVmQQuMwB7+qt9QpQ7DIeuwdHyolkNvkdmGxK7dVAek5PLOwiiilaE3DRtckn07 79qTmiIkiHJ8AiSApLd/ygFShczSb113Duj1eNT6rLT1hj1z5ebbdzQuzrNDxrmGav9/ EoAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=wQ52+X1lVqs3NA4HQ0Y5oly0G0KrCZg9YO1xv1PXn5A=; b=iXni0WcOd3g836YbkPUDTJxPXDgYpR2g0jlHrFT7XuA/jnDyn0JOWo3iNH7WZV/I8a aF/JeRY81pO5JgIQ6zbJ5ZahoZ0BGr+2o9NarLBbut6h9muqusGAKW6RI9D72OoRrks/ WNttnbAn4X3xGdyZTUlAEw8qu8+A8tg5SHmL+3X3RUq1bHyrXkUi+OGL5iE7J8aTr91S Z+FTkxirThIAkHb4DxBOo6bOVGyaHJTvgFSICNoLqfzm98JAjTFzZ2kfGoRMk47irciC RLAAcdjnpkbTAEdlhbp1IzfC3j1eDwnsqfiCNJJxoYmmNBvWfEKHVyveprm2X71tePT1 Icyw== X-Gm-Message-State: AOAM533EECqzJCbviDYnAzgrXR5qNSpdmCrFP5rg2TNjjG6eeR5Dqo8x TqJRCuuPnai5jmGDG9t3GXzgTD2oXg69 X-Google-Smtp-Source: ABdhPJxL1gJ1wtKPcRX3YXRp7qrePWMozQDDx5tNxxp/EendyW1MtiPytq9GoEJML/jt8+AhT8d3Ej6nzmbl X-Received: from irogers.svl.corp.google.com ([2620:15c:2cd:202:2d98:3ad9:1d8a:fb9b]) (user=irogers job=sendgmr) by 2002:a25:7809:: with SMTP id t9mr606088ybc.577.1644575670099; Fri, 11 Feb 2022 02:34:30 -0800 (PST) Date: Fri, 11 Feb 2022 02:33:57 -0800 In-Reply-To: <20220211103415.2737789-1-irogers@google.com> Message-Id: <20220211103415.2737789-5-irogers@google.com> Mime-Version: 1.0 References: <20220211103415.2737789-1-irogers@google.com> X-Mailer: git-send-email 2.35.1.265.g69c8d7142f-goog Subject: [PATCH v3 04/22] perf dso: Hold lock when accessing nsinfo From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Thomas Gleixner , Darren Hart , Davidlohr Bueso , "=?UTF-8?q?Andr=C3=A9=20Almeida?=" , James Clark , John Garry , Riccardo Mancini , Yury Norov , Andy Shevchenko , Andrew Morton , Jin Yao , Adrian Hunter , Leo Yan , Andi Kleen , Thomas Richter , Kan Liang , Madhavan Srinivasan , Shunsuke Nakamura , Song Liu , Masami Hiramatsu , Steven Rostedt , Miaoqian Lin , Stephen Brennan , Kajol Jain , Alexey Bayduraev , German Gomez , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, Eric Dumazet , Dmitry Vyukov , Hao Luo Cc: eranian@google.com, Ian Rogers Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There may be threads racing to update dso->nsinfo: https://lore.kernel.org/linux-perf-users/CAP-5=fWZH20L4kv-BwVtGLwR=Em3AOOT+Q4QGivvQuYn5AsPRg@mail.gmail.com/ Holding the dso->lock avoids use-after-free, memory leaks and other such bugs. Apply the fix in: https://lore.kernel.org/linux-perf-users/20211118193714.2293728-1-irogers@google.com/ of there being a missing nsinfo__put now that the accesses are data race free. Signed-off-by: Ian Rogers --- tools/perf/builtin-inject.c | 4 ++++ tools/perf/util/dso.c | 5 ++++- tools/perf/util/map.c | 3 +++ tools/perf/util/probe-event.c | 2 ++ tools/perf/util/symbol.c | 2 +- 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/tools/perf/builtin-inject.c b/tools/perf/builtin-inject.c index fbf43a454cba..bede332bf0e2 100644 --- a/tools/perf/builtin-inject.c +++ b/tools/perf/builtin-inject.c @@ -363,8 +363,10 @@ static struct dso *findnew_dso(int pid, int tid, const char *filename, } if (dso) { + BUG_ON(pthread_mutex_lock(&dso->lock) != 0); nsinfo__put(dso->nsinfo); dso->nsinfo = nsi; + pthread_mutex_unlock(&dso->lock); } else nsinfo__put(nsi); @@ -547,7 +549,9 @@ static int dso__read_build_id(struct dso *dso) if (dso->has_build_id) return 0; + BUG_ON(pthread_mutex_lock(&dso->lock) != 0); nsinfo__mountns_enter(dso->nsinfo, &nsc); + pthread_mutex_unlock(&dso->lock); if (filename__read_build_id(dso->long_name, &dso->bid) > 0) dso->has_build_id = true; nsinfo__mountns_exit(&nsc); diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 6beccffeef7b..b2f570adba35 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -548,8 +548,11 @@ static int open_dso(struct dso *dso, struct machine *machine) int fd; struct nscookie nsc; - if (dso->binary_type != DSO_BINARY_TYPE__BUILD_ID_CACHE) + if (dso->binary_type != DSO_BINARY_TYPE__BUILD_ID_CACHE) { + BUG_ON(pthread_mutex_lock(&dso->lock) != 0); nsinfo__mountns_enter(dso->nsinfo, &nsc); + pthread_mutex_unlock(&dso->lock); + } fd = __open_dso(dso, machine); if (dso->binary_type != DSO_BINARY_TYPE__BUILD_ID_CACHE) nsinfo__mountns_exit(&nsc); diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index 8af693d9678c..ae99b52502d5 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -192,7 +192,10 @@ struct map *map__new(struct machine *machine, u64 start, u64 len, if (!(prot & PROT_EXEC)) dso__set_loaded(dso); } + BUG_ON(pthread_mutex_lock(&dso->lock) != 0); + nsinfo__put(dso->nsinfo); dso->nsinfo = nsi; + pthread_mutex_unlock(&dso->lock); if (build_id__is_defined(bid)) dso__set_build_id(dso, bid); diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index a834918a0a0d..7444e689ece7 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -180,8 +180,10 @@ struct map *get_target_map(const char *target, struct nsinfo *nsi, bool user) map = dso__new_map(target); if (map && map->dso) { + BUG_ON(pthread_mutex_lock(&map->dso->lock) != 0); nsinfo__put(map->dso->nsinfo); map->dso->nsinfo = nsinfo__get(nsi); + pthread_mutex_unlock(&map->dso->lock); } return map; } else { diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 43f47532696f..a504346feb05 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c @@ -1774,6 +1774,7 @@ int dso__load(struct dso *dso, struct map *map) char newmapname[PATH_MAX]; const char *map_path = dso->long_name; + BUG_ON(pthread_mutex_lock(&dso->lock) != 0); perfmap = strncmp(dso->name, "/tmp/perf-", 10) == 0; if (perfmap) { if (dso->nsinfo && (dso__find_perf_map(newmapname, @@ -1783,7 +1784,6 @@ int dso__load(struct dso *dso, struct map *map) } nsinfo__mountns_enter(dso->nsinfo, &nsc); - BUG_ON(pthread_mutex_lock(&dso->lock) != 0); /* check again under the dso->lock */ if (dso__loaded(dso)) { -- 2.35.1.265.g69c8d7142f-goog