Received: by 2002:a25:683:0:0:0:0:0 with SMTP id 125csp53881ybg; Mon, 8 Jun 2020 16:14:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJziTPrWQ2gcpGSxN0kus8CHYnUZa7jnBgur91jdlfLLzffq2s89YlqzteuHnGSrcrPAAMa4 X-Received: by 2002:a05:6402:1217:: with SMTP id c23mr23976066edw.270.1591658059679; Mon, 08 Jun 2020 16:14:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1591658059; cv=none; d=google.com; s=arc-20160816; b=ZAbM2rRRRvQ86NO28BLa2bMu+0o7sHCgVwyBcND97uD2ffnfLxrIEfFzPCVshrGgJ1 AbIjjvRiVjujyhdGOR7Q/P+OYwtwSCvI1fJZfnmejoFGlKHFwdhEEIyhytqJhGZv68BK 0SNUvqShdQ1JhMZ2m/UCKxGmZ7VojjxUFdxvqEODPJCPR/4LYGGYAK24JxKAOeJP1vkC kkNdCOz8OtTEgxqrHgGQ8IoudbdtI/hIS7SqQDmoYENn+hy0jjEW3kqe4CEQpJl51Xbv ao5IXYyps9XsVuk4fIDJ3ZqFK3DMhk2dV1y3Z0/BTJYe1ceB5Uzhn9dCd91DVT1EQ2HL 5b7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=yiqxLu6nMUmkRHOaM42As+QIeoJE9NLDG0LC9ne+l9I=; b=UBGywAiOMStzY1ogMLVpWoGCzFFOFeumz3euMhb6rP51j18ThHl55d7eCIHnl0hUIl MSF78LWgRcEHQQADpxsyZthBmfWlbnsRIFgQ1CvCJwDSPQVocm6tEf8l+2mGoL6MMVJX G4z0TzdCSQkUXot2aNP/SNfMhHd6tm4yyEZ3rPliP1YbEYoEUs24Bj7BFZDkK6H+RdgT T4gl3/MrGV/mp6O1waU7GBml57mZb0mrdyw1cfV9q9DdrWNqu0GcUPMhidK4vS/2KXI8 +aTT771RYXP+aBTQvVtDvAQrRyvqoKO1qU2vjt7kvUMcgbXS52fv9f7HKq0CpFN2PkJQ n8KA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=fnUR+2mR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id z10si9286267ejb.517.2020.06.08.16.13.57; Mon, 08 Jun 2020 16:14:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=fnUR+2mR; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728411AbgFHXJZ (ORCPT + 99 others); Mon, 8 Jun 2020 19:09:25 -0400 Received: from mail.kernel.org ([198.145.29.99]:53582 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728127AbgFHXIY (ORCPT ); Mon, 8 Jun 2020 19:08:24 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 097FA2085B; Mon, 8 Jun 2020 23:08:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1591657703; bh=ulgzXYC0umJqLr8UKHgIViy/K3yWrij/YDsys4Du2PI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fnUR+2mRT4CJmeSQyuvD+ETxomCONtNToZ6fJWU7XP09If04OsGz4pgJv0iMjH2dK G1iFvDzt1SrJc0UG4f+pP7d+Mg75hZ1vVcVU4Bk19dH5TuN4mslZ3EfXAUklW6vPyo zQJXvTvkka0LRwL4IEpkqNiN1U5DXqcDl8NcgG44= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Stephane Eranian , Ian Rogers , Jiri Olsa , Alexander Shishkin , Andrey Zhizhikin , Kan Liang , Kefeng Wang , Mark Rutland , Namhyung Kim , Peter Zijlstra , Petr Mladek , Thomas Gleixner , Arnaldo Carvalho de Melo , Sasha Levin Subject: [PATCH AUTOSEL 5.7 101/274] tools api fs: Make xxx__mountpoint() more scalable Date: Mon, 8 Jun 2020 19:03:14 -0400 Message-Id: <20200608230607.3361041-101-sashal@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200608230607.3361041-1-sashal@kernel.org> References: <20200608230607.3361041-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Stephane Eranian [ Upstream commit c6fddb28bad26e5472cb7acf7b04cd5126f1a4ab ] The xxx_mountpoint() interface provided by fs.c finds mount points for common pseudo filesystems. The first time xxx_mountpoint() is invoked, it scans the mount table (/proc/mounts) looking for a match. If found, it is cached. The price to scan /proc/mounts is paid once if the mount is found. When the mount point is not found, subsequent calls to xxx_mountpoint() scan /proc/mounts over and over again. There is no caching. This causes a scaling issue in perf record with hugeltbfs__mountpoint(). The function is called for each process found in synthesize__mmap_events(). If the machine has thousands of processes and if the /proc/mounts has many entries this could cause major overhead in perf record. We have observed multi-second slowdowns on some configurations. As an example on a laptop: Before: $ sudo umount /dev/hugepages $ strace -e trace=openat -o /tmp/tt perf record -a ls $ fgrep mounts /tmp/tt 285 After: $ sudo umount /dev/hugepages $ strace -e trace=openat -o /tmp/tt perf record -a ls $ fgrep mounts /tmp/tt 1 One could argue that the non-caching in case the moint point is not found is intentional. That way subsequent calls may discover a moint point if the sysadmin mounts the filesystem. But the same argument could be made against caching the mount point. It could be unmounted causing errors. It all depends on the intent of the interface. This patch assumes it is expected to scan /proc/mounts once. The patch documents the caching behavior in the fs.h header file. An alternative would be to just fix perf record. But it would solve the problem with hugetlbs__mountpoint() but there could be similar issues (possibly down the line) with other xxx_mountpoint() calls in perf or other tools. Signed-off-by: Stephane Eranian Reviewed-by: Ian Rogers Acked-by: Jiri Olsa Cc: Alexander Shishkin Cc: Andrey Zhizhikin Cc: Kan Liang Cc: Kefeng Wang Cc: Mark Rutland Cc: Namhyung Kim Cc: Peter Zijlstra Cc: Petr Mladek Cc: Thomas Gleixner Link: http://lore.kernel.org/lkml/20200402154357.107873-3-irogers@google.com Signed-off-by: Ian Rogers Signed-off-by: Arnaldo Carvalho de Melo Signed-off-by: Sasha Levin --- tools/lib/api/fs/fs.c | 17 +++++++++++++++++ tools/lib/api/fs/fs.h | 12 ++++++++++++ 2 files changed, 29 insertions(+) diff --git a/tools/lib/api/fs/fs.c b/tools/lib/api/fs/fs.c index 027b18f7ed8c..82f53d81a7a7 100644 --- a/tools/lib/api/fs/fs.c +++ b/tools/lib/api/fs/fs.c @@ -90,6 +90,7 @@ struct fs { const char * const *mounts; char path[PATH_MAX]; bool found; + bool checked; long magic; }; @@ -111,31 +112,37 @@ static struct fs fs__entries[] = { .name = "sysfs", .mounts = sysfs__fs_known_mountpoints, .magic = SYSFS_MAGIC, + .checked = false, }, [FS__PROCFS] = { .name = "proc", .mounts = procfs__known_mountpoints, .magic = PROC_SUPER_MAGIC, + .checked = false, }, [FS__DEBUGFS] = { .name = "debugfs", .mounts = debugfs__known_mountpoints, .magic = DEBUGFS_MAGIC, + .checked = false, }, [FS__TRACEFS] = { .name = "tracefs", .mounts = tracefs__known_mountpoints, .magic = TRACEFS_MAGIC, + .checked = false, }, [FS__HUGETLBFS] = { .name = "hugetlbfs", .mounts = hugetlbfs__known_mountpoints, .magic = HUGETLBFS_MAGIC, + .checked = false, }, [FS__BPF_FS] = { .name = "bpf", .mounts = bpf_fs__known_mountpoints, .magic = BPF_FS_MAGIC, + .checked = false, }, }; @@ -158,6 +165,7 @@ static bool fs__read_mounts(struct fs *fs) } fclose(fp); + fs->checked = true; return fs->found = found; } @@ -220,6 +228,7 @@ static bool fs__env_override(struct fs *fs) return false; fs->found = true; + fs->checked = true; strncpy(fs->path, override_path, sizeof(fs->path) - 1); fs->path[sizeof(fs->path) - 1] = '\0'; return true; @@ -246,6 +255,14 @@ static const char *fs__mountpoint(int idx) if (fs->found) return (const char *)fs->path; + /* the mount point was already checked for the mount point + * but and did not exist, so return NULL to avoid scanning again. + * This makes the found and not found paths cost equivalent + * in case of multiple calls. + */ + if (fs->checked) + return NULL; + return fs__get_mountpoint(fs); } diff --git a/tools/lib/api/fs/fs.h b/tools/lib/api/fs/fs.h index 936edb95e1f3..aa222ca30311 100644 --- a/tools/lib/api/fs/fs.h +++ b/tools/lib/api/fs/fs.h @@ -18,6 +18,18 @@ const char *name##__mount(void); \ bool name##__configured(void); \ +/* + * The xxxx__mountpoint() entry points find the first match mount point for each + * filesystems listed below, where xxxx is the filesystem type. + * + * The interface is as follows: + * + * - If a mount point is found on first call, it is cached and used for all + * subsequent calls. + * + * - If a mount point is not found, NULL is returned on first call and all + * subsequent calls. + */ FS(sysfs) FS(procfs) FS(debugfs) -- 2.25.1