Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp2812705pxb; Sat, 30 Jan 2021 15:58:49 -0800 (PST) X-Google-Smtp-Source: ABdhPJxniK+ab9wOpMYsqH5ngsjbp9trnUOajVuxSm2H5CzPF9Lob6lG1LzrPhow4D682dLCpi1E X-Received: by 2002:a17:906:1689:: with SMTP id s9mr10711781ejd.500.1612051128912; Sat, 30 Jan 2021 15:58:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612051128; cv=none; d=google.com; s=arc-20160816; b=hbIcAql9wzyuT+DnM/95PkQN3SnGcrCn1cWAQD9ZsGN6mraUDnd+WbpMUWRRYylpW/ DujajrcGuroeHcdMnqW2Ng009iHd/bBZLC54s+kIW9taS66t5pFT7V9Xm6RLdOP/OQUP Dw8Wn84Sg2RmaBHxjEXTU8hDcZfHGnqlfIv8gBnUw1yB6e9C4EJPmT7WETRrIklVSeUV 3mG4R7MeQbmNJh09x/VIdCDJ62Uo99U1q6b07Dho4EykepfhtOlOdeuqg5nUyWb5tKVn A+gScq2RXnKj4s9SSyH8Hc1pQkpQ2uVCyl+rOwrJZu6WhbRzD/18126tY4e1sQjmRIUc SzpA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=dx62KB0yRPeDBUJM4w4bZNDbTBbPsgV70bjVi2hmv40=; b=wRg+tjzh7CXa4uTY79qOnVS8K0I5vG/49eML4dg1Q4DZtCHe20Sf2Hzb56J626YQ1D ltQltlJJCkty0rEJhfZSz41B3Ze6Ed4GlSCDShVehSjLLf7v/RVyv2kh2YnmCQ2wykaz lCH/WzQa7juEQGsfPmnKj2N5M2QgbvtWZTW2t7Uu6jqqYJxAD601nyJh03PMMlpyKSJW jrqniEBMzx76KftJrRqF/79pgRgHb25L3Ar6ZavjHolYWm1+WevH6JEk0Lw5uvhLrARk qD9xFTqlD7yTxO/9f5Zsdxhca2DFK1qNctjP2ckXWBTVnQVbKgbpdJ+Fu91AXLdA8vgQ BivQ== ARC-Authentication-Results: i=1; mx.google.com; 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 g16si8172934edv.364.2021.01.30.15.58.24; Sat, 30 Jan 2021 15:58:48 -0800 (PST) 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; 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 S232596AbhA3X51 convert rfc822-to-8bit (ORCPT + 99 others); Sat, 30 Jan 2021 18:57:27 -0500 Received: from us-smtp-delivery-44.mimecast.com ([205.139.111.44]:45986 "EHLO us-smtp-delivery-44.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232295AbhA3Xui (ORCPT ); Sat, 30 Jan 2021 18:50:38 -0500 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-410-QgamZPOlM4i5N5EehMcQ-g-1; Sat, 30 Jan 2021 18:49:40 -0500 X-MC-Unique: QgamZPOlM4i5N5EehMcQ-g-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2CED1107ACE8; Sat, 30 Jan 2021 23:49:39 +0000 (UTC) Received: from krava.redhat.com (unknown [10.40.192.30]) by smtp.corp.redhat.com (Postfix) with ESMTP id B935A6F974; Sat, 30 Jan 2021 23:49:36 +0000 (UTC) From: Jiri Olsa To: Arnaldo Carvalho de Melo Cc: lkml , Peter Zijlstra , Ingo Molnar , Mark Rutland , Namhyung Kim , Alexander Shishkin , Michael Petlan , Ian Rogers , Stephane Eranian , Alexei Budankov Subject: [PATCH 13/24] perf daemon: Allow only one daemon over base directory Date: Sun, 31 Jan 2021 00:48:45 +0100 Message-Id: <20210130234856.271282-14-jolsa@kernel.org> In-Reply-To: <20210130234856.271282-1-jolsa@kernel.org> References: <20210129134855.195810-1-jolsa@redhat.com> <20210130234856.271282-1-jolsa@kernel.org> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jolsa@kernel.org X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: kernel.org Content-Transfer-Encoding: 8BIT Content-Type: text/plain; charset=WINDOWS-1252 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add 'lock' file under daemon base and flock it, so only one perf daemon can run on top of it. Each daemon tries to create and lock BASE/lock file, if it's successful we are sure we're the only daemon running over the BASE. Once daemon is finished, file descriptor to lock file is closed and lock is released. Example: # cat ~/.perfconfig [daemon] base=/opt/perfdata [session-cycles] run = -m 10M -e cycles --overwrite --switch-output -a [session-sched] run = -m 20M -e sched:* --overwrite --switch-output -a Starting the daemon: # perf daemon start And try once more: # perf daemon start failed: another perf daemon (pid 775594) owns /opt/perfdata will end up with an error, because there's already one running on top of /opt/perfdata. Signed-off-by: Jiri Olsa --- tools/perf/builtin-daemon.c | 58 +++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/tools/perf/builtin-daemon.c b/tools/perf/builtin-daemon.c index 468ed2af8b3f..4ebeb524b16e 100644 --- a/tools/perf/builtin-daemon.c +++ b/tools/perf/builtin-daemon.c @@ -1,10 +1,12 @@ // SPDX-License-Identifier: GPL-2.0 #include #include +#include #include #include #include #include +#include #include #include #include @@ -529,12 +531,18 @@ static int cmd_session_list(struct daemon *daemon, union cmd *cmd, FILE *out) /* output */ csv_sep, daemon->base, SESSION_OUTPUT); + fprintf(out, "%c%s/%s", + /* lock */ + csv_sep, daemon->base, "lock"); + fprintf(out, "\n"); } else { fprintf(out, "[%d:daemon] base: %s\n", getpid(), daemon->base); if (cmd->list.verbose) { fprintf(out, " output: %s/%s\n", daemon->base, SESSION_OUTPUT); + fprintf(out, " lock: %s/lock\n", + daemon->base); } } @@ -864,6 +872,50 @@ static int setup_config(struct daemon *daemon) return daemon->config_real ? 0 : -1; } +/* + * Each daemon tries to create and lock BASE/lock file, + * if it's successful we are sure we're the only daemon + * running over the BASE. + * + * Once daemon is finished, file descriptor to lock file + * is closed and lock is released. + */ +static int check_lock(struct daemon *daemon) +{ + char path[PATH_MAX]; + char buf[20]; + int fd, pid; + ssize_t len; + + scnprintf(path, sizeof(path), "%s/lock", daemon->base); + + fd = open(path, O_RDWR|O_CREAT|O_CLOEXEC, 0640); + if (fd < 0) + return -1; + + if (lockf(fd, F_TLOCK, 0) < 0) { + filename__read_int(path, &pid); + fprintf(stderr, "failed: another perf daemon (pid %d) owns %s\n", + pid, daemon->base); + return -1; + } + + scnprintf(buf, sizeof(buf), "%d", getpid()); + len = strlen(buf); + + if (write(fd, buf, len) != len) { + perror("failed: write"); + return -1; + } + + if (ftruncate(fd, len)) { + perror("failed: ftruncate"); + return -1; + } + + return 0; +} + static int go_background(struct daemon *daemon) { int pid, fd; @@ -878,6 +930,9 @@ static int go_background(struct daemon *daemon) if (setsid() < 0) return -1; + if (check_lock(daemon)) + return -1; + umask(0); if (chdir(daemon->base)) { @@ -946,6 +1001,9 @@ static int __cmd_start(struct daemon *daemon, struct option parent_options[], if (setup_server_config(daemon)) return -1; + if (foreground && check_lock(daemon)) + return -1; + if (!foreground) { err = go_background(daemon); if (err) { -- 2.29.2