Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp2537220pxb; Mon, 18 Jan 2021 22:42:10 -0800 (PST) X-Google-Smtp-Source: ABdhPJxFyhcjl/m+VKBKuMj6ssDPqNWSqMBL1nDIl73+TzY0cW2qVEm8JihkuTxJK4TgcX3Ysk3X X-Received: by 2002:a17:906:3945:: with SMTP id g5mr2144012eje.514.1611038529935; Mon, 18 Jan 2021 22:42:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1611038529; cv=none; d=google.com; s=arc-20160816; b=u134ORoFVvCsUfZ4Tp3x4RP5CjtFBE12UMQfV5qKVRCCHO+kRXjkxV/k1ZbhbKWL9x bnYHfZ9JDHmoFWP2H0x9T3gxX7ar/VqkC4VyUOGfl2HJswM0iFk6pvskeDqbCNQPKlAX tFD5Pxxx20lhPzTEF9VJGu3eroRyXDBWVh58iw3b29jNlwoIhH9H/60zrvPtVBCH7JGi aj9+qpF0msCSpuRZvJpgSG2fAEKr/Yie+NDDUOxRvldj6DH5HvjBNuCP9gFcCz/r3tW/ 217VZeNqqUZqXtC9itnibBGbPZ5jV0l+XH7OjqDpFRGnSEz1fO8n2dFmIDHHp2Z5nXsS ZlIg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version; bh=URBaQWvo21Po7lHS1Q5G/RCwEYa2F0a4Wp9IVeoO+Eg=; b=mRp/aOZ6ChGDmJwwJnlgqXxKD93ajep9BLSUshkLNA60cyM+ADLd1Cfse/Mz2X9H+j 8KacTF5SSaAenZtXoJBNisAZK4fMrG1icfHnYq1It0Jn9a8OXT05IKtI2glhiUBQZrHs QY92lfGyq0m7uNZG6PQruJ9GshenbBJB7QQjJe5St/7UsinqBviFqMe9rzvSePW05nUs p1h57XVazcafbV97P5WU8IcP5XhyPkywF3JJbufzH9FVjqRl0kOHeRS7GFwLEYWPeZQT gOHN28QpXQox3/jmP1/7Ft7dWuilHgBEGh1smkse/e9iktop7EEejG1adn7B7fI/LssE 4LDw== 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 x11si2321705edi.73.2021.01.18.22.41.46; Mon, 18 Jan 2021 22:42:09 -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 S1728164AbhASGkg (ORCPT + 99 others); Tue, 19 Jan 2021 01:40:36 -0500 Received: from mail-lf1-f51.google.com ([209.85.167.51]:47097 "EHLO mail-lf1-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387629AbhASFih (ORCPT ); Tue, 19 Jan 2021 00:38:37 -0500 Received: by mail-lf1-f51.google.com with SMTP id o10so27323759lfl.13 for ; Mon, 18 Jan 2021 21:38:20 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=URBaQWvo21Po7lHS1Q5G/RCwEYa2F0a4Wp9IVeoO+Eg=; b=Fa1Xm6n/Uh4zVtknc7VhiEzPtAhy74Dw+P3yIPAU3LLhU/ywmR383CUVibhF31adB6 E/9hC/5LwAvtWTpFGtmPbqpTJNu33zKR7d+V4tcRXiJOt8rVLmv/8yR3zbsciQVfFCMo 9u4eWG7D2NzNAmZ8vq2gcaCQtYOCXO6n4shgp1u232sMKHFqR0Mvq8gMyy3X5woxxvL3 kNTw9AyIABI3ei18knj4IpyfFWqfUIhS2BSev10YjuuLCYMMGPyqiS0SKEuZ0xFeztw+ oQvEmZhp/wVgAgRmhIVuXuGUb9atsq2A8PovVy6W/Ssg2/TW4oqm+JQGJgLwB68VyY8e rY/A== X-Gm-Message-State: AOAM533vnG+remunjWtXReZmbEmqhNqBrDJpkVwxgivmFDlzZ1jtF0+o mM/d680huenRUbUhJx4IqIzZeRTiJo0bjLUjRYc= X-Received: by 2002:ac2:50d0:: with SMTP id h16mr1100639lfm.300.1611034674236; Mon, 18 Jan 2021 21:37:54 -0800 (PST) MIME-Version: 1.0 References: <20210102220441.794923-1-jolsa@kernel.org> <20210102220441.794923-13-jolsa@kernel.org> In-Reply-To: <20210102220441.794923-13-jolsa@kernel.org> From: Namhyung Kim Date: Tue, 19 Jan 2021 14:37:42 +0900 Message-ID: Subject: Re: [PATCH 12/22] perf daemon: Allow only one daemon over base directory To: Jiri Olsa Cc: Arnaldo Carvalho de Melo , lkml , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Michael Petlan , Ian Rogers , Stephane Eranian , Alexei Budankov Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Jan 3, 2021 at 7:05 AM Jiri Olsa wrote: > > Add 'lock' file under daemon base and flock it, so only one > perf daemon can run on top of it. > > 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 | 49 +++++++++++++++++++++++++++++++++++++ > 1 file changed, 49 insertions(+) > > diff --git a/tools/perf/builtin-daemon.c b/tools/perf/builtin-daemon.c > index 45748bb471ec..1982eedd3f3f 100644 > --- a/tools/perf/builtin-daemon.c > +++ b/tools/perf/builtin-daemon.c > @@ -8,6 +8,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -562,12 +563,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); > } > } > > @@ -761,6 +768,42 @@ static int handle_config_changes(struct daemon *daemon, int conf_fd, > return 0; > } > > +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; > + } So the fd is (a kind of) leaked and the lock is released only when the daemon is going to die, right? Thanks, Namhyung > + > + scnprintf(buf, sizeof(buf), "%d", getpid()); > + len = strlen(buf); > + > + if (write(fd, buf, len) != len) { > + perror("write failed"); > + return -1; > + } > + > + if (ftruncate(fd, len)) { > + perror("ftruncate failed"); > + return -1; > + } > + > + return 0; > +} > + > static int go_background(struct daemon *daemon) > { > int pid, fd; > @@ -775,6 +818,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)) { > @@ -861,6 +907,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 && go_background(daemon)) > return -1; > > -- > 2.26.2 >