Received: by 2002:ab2:687:0:b0:1f4:6588:b3a7 with SMTP id s7csp240762lqe; Tue, 9 Apr 2024 23:57:11 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCUnI0zKImaS3Ts/lAcXKJkkK2oH4sFXvNl2FJtCVVEjPtEzJNaeQYsveNzeOC8zAa9b/wrKdBKylo02PIUpDICr+NMSn6rFY1UUFJy0hw== X-Google-Smtp-Source: AGHT+IFa7tVj+swpZ0Nmg4KYvBlEFqmAFZPGY+GmyhMVrtYsU/lCPelEU3KSUMYFPaTvrK2FfJk0 X-Received: by 2002:a17:902:b684:b0:1e3:d38c:9e4b with SMTP id c4-20020a170902b68400b001e3d38c9e4bmr1750099pls.67.1712732231631; Tue, 09 Apr 2024 23:57:11 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712732231; cv=pass; d=google.com; s=arc-20160816; b=yUvJR5vx5NmnHYOyAE1BD6QGOSSe9T7qezk7Yh6BQmy4+gwO59gNKZ8Udo4u0j7Xss dsmYeVV5+Bey+DUPvzZTvpkCAkAlMDk7tTypk4xeN2mwGYz2jKfAfGU1jH7UYdiBmyDH jANFojUlQ+W14J1YKz2uLjn4V8UkXWa6VBHHBI8Ap0XhL+JCoHXdOTpoQ2K9NCVJ14aH kok6a6TMS2PJWvDQeZE+hf8gOjNF+rX6TFlx1mQPeFNs7okLqg8kt3MSiBjbGKsRjWEw X5g8g3TC+eGmEnW32wF+hXGNBvM3VvGhGLQi5sRV3oczjfJxlh8S8AtjvUaRNW7tM8lu Q/2A== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=to:from:subject:references:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:message-id:in-reply-to:date :dkim-signature; bh=gt4hEtTYJQGx7TR6Ig+dNAOXBQM6B+4eUduBrSY/GiI=; fh=smBIKbbmSI+siSL9U4ub7PMvjHVwb9+jSZMN7UsXr+g=; b=LZ9f8MtO8HedWP7Ep1LRjLjw96AogM0cJ4mc4RCSQnFdZo2faUtZVypPmuQzNULPaD K4ccyJND6tcc2F/fXEOLZhDXLI2nXNueXK0ZXmZ9n2kvCbrtY1TqA7RUTOfUR855bLvy rG2znKXHYdYIvECQ+hxDwR7hA+QGCHdC7pzW+MJMMJWtDWtDLyMJPytfGr7UgdsQaJ1F FD5Lx2nVi9O22ddphIhG4kcIIkSeEg6kGDOcCHA0Lvgl4vD/tGKwVa8C8XhXmU08wbgY l/A+tkVfCxykpL0OT38RpNogf40Xtg1hoJRIwL5uof314WY4EpjUvadiqJovAzlwtGF3 KHxw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b="SYztm3/4"; arc=pass (i=1 spf=pass spfdomain=flex--irogers.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-138024-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-138024-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id a6-20020a170902ecc600b001e3c6c51675si9584438plh.636.2024.04.09.23.57.11 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Apr 2024 23:57:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-138024-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b="SYztm3/4"; arc=pass (i=1 spf=pass spfdomain=flex--irogers.bounces.google.com dkim=pass dkdomain=google.com dmarc=pass fromdomain=google.com); spf=pass (google.com: domain of linux-kernel+bounces-138024-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-138024-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id AACBAB25677 for ; Wed, 10 Apr 2024 06:46:02 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 827A64CE04; Wed, 10 Apr 2024 06:42:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="SYztm3/4" Received: from mail-yw1-f201.google.com (mail-yw1-f201.google.com [209.85.128.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 017954AEF0 for ; Wed, 10 Apr 2024 06:42:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712731374; cv=none; b=hiDS8tqySJBs6G0MovHfKn0M6AgSJ8zQHQrXOaM/VtQ3pddv4yt75aImBYlhDo8bWrT8rjewnG1uj0AhIIWyG4qA0Q6tJhihdaGdtrNbtXNHv8h9FMwaaTmC6QYUfc+7WN7Hybkfk0q36ETRPuURvhKwkHxnjx+St2BPVHOktIc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712731374; c=relaxed/simple; bh=stlsOvNZR5kKA5ZGAa5n1sW9k9O90zrgRv6XYZC/ynM=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=NDnOz4gXkxHnCsolIIu6BsVmwvcq7WBulwmPR6mdr8ONV2AopMl6H9YGQ1sf0uadpVw3z5ngcOAWVvOe1jn3cQyTi4qsnw8bqTnKtAAuOrvl+rKpclgubDrRWIytVSwPOBLIXT1PHSITvYRwahAr+DR2T0Vj2w7MClHe6cKmVnE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=SYztm3/4; arc=none smtp.client-ip=209.85.128.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Received: by mail-yw1-f201.google.com with SMTP id 00721157ae682-6150e36ca0dso97397917b3.1 for ; Tue, 09 Apr 2024 23:42:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1712731370; x=1713336170; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=gt4hEtTYJQGx7TR6Ig+dNAOXBQM6B+4eUduBrSY/GiI=; b=SYztm3/47cj7J6Ur43aPOna4OunTeJbgOiC3w72MR33U1WXaYH76u+wiRCLMPZFHrE MR+JtTQe5SQpzSxRROxczQbFqXe+lS0kIiOsgEtcXdK4s4reHEAkLhcH8VF78ifCWHt9 h1Tv9WHZ/om39d8AoT4Iobinm480+Wpg4HPhnZxu8YEoNQkKXeSJk1v+VXdl94s5HFLn OaGB/JQG3Emm5v1ejpx3lxhhRdEZqcdFTA0AMxHVstSB4Do5hnHE6vSgY32KIfo2ao/P 0eeCehvM/50L36R1JiDQ8Gy6Vhtoq6EikWnZdVHziAWBodH6MuWlNTEvRFp+pkMYENqt zD1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712731370; x=1713336170; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=gt4hEtTYJQGx7TR6Ig+dNAOXBQM6B+4eUduBrSY/GiI=; b=PBaNqFn5/73gtQu8UdhucoAJnwNNhm7nOLxyBA9jRil71TnWi0xDBBeH5ELjyoZ3O8 FPJP764f9t9UqOQndMguFN08ii9w+EDjSXhNZm8vjNv5my5yEgYpo66iZrJa7Z1B5QAH aSvVbiiZoBTVMui0vBB/2UF2kGkBPauIUuK2RiOgxPGNgNPklpYWNMjvCX0XzJAUtwiI 0yXMoH8i8uwvGEs0a4wUwiru0ErZLOLGD4u1Qnl3rFCDfyowx4wQb1wWWIHZu0A8TmgO QUGCna6wZHY+nVDvwV8ONkA4rDVVeI/9255m/WRcxaLNTnjtJvZYCZLjJWXmjRBTqbPi g1kQ== X-Forwarded-Encrypted: i=1; AJvYcCWj2AGcXtSf5Ab2teSUYKANkDTYFt19IfiyAFy13vWeVQI5Z9gkRtns2bmaUQaCVS4yV80W3jUK3BgmEbJpxrz4S8v23oi9jrVypFdL X-Gm-Message-State: AOJu0Yyvo84p0IVH8NIdrRSrL9q4UFhFUomKtwr42soq18QhAxPEEmsK iVDdl3wMhpzNVTGaVQy5/lCzcU3vJVeEd0qauJmddILJEDCSVVDfofArtQg3QkWc9OlQwt3Hm6I rUbMF3A== X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:18c5:d9c6:d1d6:a3ec]) (user=irogers job=sendgmr) by 2002:a81:ff08:0:b0:614:74e4:a290 with SMTP id k8-20020a81ff08000000b0061474e4a290mr406138ywn.3.1712731369897; Tue, 09 Apr 2024 23:42:49 -0700 (PDT) Date: Tue, 9 Apr 2024 23:42:14 -0700 In-Reply-To: <20240410064214.2755936-1-irogers@google.com> Message-Id: <20240410064214.2755936-13-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240410064214.2755936-1-irogers@google.com> X-Mailer: git-send-email 2.44.0.478.gd926399ef9-goog Subject: [PATCH v3 12/12] perf dso: Use container_of to avoid a pointer in dso_data From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , James Clark , Athira Rajeev , Colin Ian King , Leo Yan , Song Liu , Ilkka Koskinen , Ben Gainey , K Prateek Nayak , Yanteng Si , Yicong Yang , Sun Haiyong , Ravi Bangoria , Anne Macedo , Changbin Du , Andi Kleen , Thomas Richter , Masami Hiramatsu , zhaimingbing , Li Dong , Paran Lee , elfring@users.sourceforge.net, Markus Elfring , Yang Jihong , Chengen Du , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org Content-Type: text/plain; charset="UTF-8" The dso pointer in dso_data is necessary for reference count checking to account for the dso_data forming a global list of open dso's with references to the dso. The dso pointer also allows for the indirection that reference count checking needs. Outside of reference count checking the indirection isn't needed and container_of is more efficient and saves space. The reference count won't be increased by placing items onto the global list, matching how things were before the reference count checking change, but we assert the dso is in dsos holding it live (and that the set of open dsos is a subset of all dsos for the machine). Update the DSO data tests so that they use a dsos struct to make the invariant true. Signed-off-by: Ian Rogers --- tools/perf/tests/dso-data.c | 60 ++++++++++++++++++------------------- tools/perf/util/dso.c | 16 +++++++++- tools/perf/util/dso.h | 2 ++ 3 files changed, 46 insertions(+), 32 deletions(-) diff --git a/tools/perf/tests/dso-data.c b/tools/perf/tests/dso-data.c index fde4eca84b6f..5286ae8bd2d7 100644 --- a/tools/perf/tests/dso-data.c +++ b/tools/perf/tests/dso-data.c @@ -10,6 +10,7 @@ #include #include #include "dso.h" +#include "dsos.h" #include "machine.h" #include "symbol.h" #include "tests.h" @@ -123,9 +124,10 @@ static int test__dso_data(struct test_suite *test __maybe_unused, int subtest __ TEST_ASSERT_VAL("No test file", file); memset(&machine, 0, sizeof(machine)); + dsos__init(&machine.dsos); - dso = dso__new((const char *)file); - + dso = dso__new(file); + TEST_ASSERT_VAL("Failed to add dso", !dsos__add(&machine.dsos, dso)); TEST_ASSERT_VAL("Failed to access to dso", dso__data_fd(dso, &machine) >= 0); @@ -170,6 +172,7 @@ static int test__dso_data(struct test_suite *test __maybe_unused, int subtest __ } dso__put(dso); + dsos__exit(&machine.dsos); unlink(file); return 0; } @@ -199,41 +202,35 @@ static long open_files_cnt(void) return nr - 1; } -static struct dso **dsos; - -static int dsos__create(int cnt, int size) +static int dsos__create(int cnt, int size, struct dsos *dsos) { int i; - dsos = malloc(sizeof(*dsos) * cnt); - TEST_ASSERT_VAL("failed to alloc dsos array", dsos); + dsos__init(dsos); for (i = 0; i < cnt; i++) { - char *file; + struct dso *dso; + char *file = test_file(size); - file = test_file(size); TEST_ASSERT_VAL("failed to get dso file", file); - - dsos[i] = dso__new(file); - TEST_ASSERT_VAL("failed to get dso", dsos[i]); + dso = dso__new(file); + TEST_ASSERT_VAL("failed to get dso", dso); + TEST_ASSERT_VAL("failed to add dso", !dsos__add(dsos, dso)); + dso__put(dso); } return 0; } -static void dsos__delete(int cnt) +static void dsos__delete(struct dsos *dsos) { - int i; - - for (i = 0; i < cnt; i++) { - struct dso *dso = dsos[i]; + for (unsigned int i = 0; i < dsos->cnt; i++) { + struct dso *dso = dsos->dsos[i]; dso__data_close(dso); unlink(dso__name(dso)); - dso__put(dso); } - - free(dsos); + dsos__exit(dsos); } static int set_fd_limit(int n) @@ -267,10 +264,10 @@ static int test__dso_data_cache(struct test_suite *test __maybe_unused, int subt /* and this is now our dso open FDs limit */ dso_cnt = limit / 2; TEST_ASSERT_VAL("failed to create dsos\n", - !dsos__create(dso_cnt, TEST_FILE_SIZE)); + !dsos__create(dso_cnt, TEST_FILE_SIZE, &machine.dsos)); for (i = 0; i < (dso_cnt - 1); i++) { - struct dso *dso = dsos[i]; + struct dso *dso = machine.dsos.dsos[i]; /* * Open dsos via dso__data_fd(), it opens the data @@ -290,17 +287,17 @@ static int test__dso_data_cache(struct test_suite *test __maybe_unused, int subt } /* verify the first one is already open */ - TEST_ASSERT_VAL("dsos[0] is not open", dso__data(dsos[0])->fd != -1); + TEST_ASSERT_VAL("dsos[0] is not open", dso__data(machine.dsos.dsos[0])->fd != -1); /* open +1 dso to reach the allowed limit */ - fd = dso__data_fd(dsos[i], &machine); + fd = dso__data_fd(machine.dsos.dsos[i], &machine); TEST_ASSERT_VAL("failed to get fd", fd > 0); /* should force the first one to be closed */ - TEST_ASSERT_VAL("failed to close dsos[0]", dso__data(dsos[0])->fd == -1); + TEST_ASSERT_VAL("failed to close dsos[0]", dso__data(machine.dsos.dsos[0])->fd == -1); /* cleanup everything */ - dsos__delete(dso_cnt); + dsos__delete(&machine.dsos); /* Make sure we did not leak any file descriptor. */ nr_end = open_files_cnt(); @@ -325,9 +322,9 @@ static int test__dso_data_reopen(struct test_suite *test __maybe_unused, int sub long nr_end, nr = open_files_cnt(), lim = new_limit(3); int fd, fd_extra; -#define dso_0 (dsos[0]) -#define dso_1 (dsos[1]) -#define dso_2 (dsos[2]) +#define dso_0 (machine.dsos.dsos[0]) +#define dso_1 (machine.dsos.dsos[1]) +#define dso_2 (machine.dsos.dsos[2]) /* Rest the internal dso open counter limit. */ reset_fd_limit(); @@ -347,7 +344,8 @@ static int test__dso_data_reopen(struct test_suite *test __maybe_unused, int sub TEST_ASSERT_VAL("failed to set file limit", !set_fd_limit((lim))); - TEST_ASSERT_VAL("failed to create dsos\n", !dsos__create(3, TEST_FILE_SIZE)); + TEST_ASSERT_VAL("failed to create dsos\n", + !dsos__create(3, TEST_FILE_SIZE, &machine.dsos)); /* open dso_0 */ fd = dso__data_fd(dso_0, &machine); @@ -386,7 +384,7 @@ static int test__dso_data_reopen(struct test_suite *test __maybe_unused, int sub /* cleanup everything */ close(fd_extra); - dsos__delete(3); + dsos__delete(&machine.dsos); /* Make sure we did not leak any file descriptor. */ nr_end = open_files_cnt(); diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 27db65e96e04..dde706b71da7 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -497,14 +497,20 @@ static pthread_mutex_t dso__data_open_lock = PTHREAD_MUTEX_INITIALIZER; static void dso__list_add(struct dso *dso) { list_add_tail(&dso__data(dso)->open_entry, &dso__data_open); +#ifdef REFCNT_CHECKING dso__data(dso)->dso = dso__get(dso); +#endif + /* Assume the dso is part of dsos, hence the optional reference count above. */ + assert(dso__dsos(dso)); dso__data_open_cnt++; } static void dso__list_del(struct dso *dso) { list_del_init(&dso__data(dso)->open_entry); +#ifdef REFCNT_CHECKING dso__put(dso__data(dso)->dso); +#endif WARN_ONCE(dso__data_open_cnt <= 0, "DSO data fd counter out of bounds."); dso__data_open_cnt--; @@ -654,9 +660,15 @@ static void close_dso(struct dso *dso) static void close_first_dso(void) { struct dso_data *dso_data; + struct dso *dso; dso_data = list_first_entry(&dso__data_open, struct dso_data, open_entry); - close_dso(dso_data->dso); +#ifdef REFCNT_CHECKING + dso = dso_data->dso; +#else + dso = container_of(dso_data, struct dso, data); +#endif + close_dso(dso); } static rlim_t get_fd_limit(void) @@ -1449,7 +1461,9 @@ struct dso *dso__new_id(const char *name, struct dso_id *id) data->fd = -1; data->status = DSO_DATA_STATUS_UNKNOWN; INIT_LIST_HEAD(&data->open_entry); +#ifdef REFCNT_CHECKING data->dso = NULL; /* Set when on the open_entry list. */ +#endif } return res; } diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index f9689dd60de3..df2c98402af3 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h @@ -147,7 +147,9 @@ struct dso_cache { struct dso_data { struct rb_root cache; struct list_head open_entry; +#ifdef REFCNT_CHECKING struct dso *dso; +#endif int fd; int status; u32 status_seen; -- 2.44.0.478.gd926399ef9-goog