lkml.org 
[lkml]   [2020]   [Dec]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH 7/8] perf daemon: Allow only one daemon over base directory
On Tue, Dec 15, 2020 at 12:46:27PM -0300, Arnaldo Carvalho de Melo wrote:
> Em Sat, Dec 12, 2020 at 11:43:57AM +0100, Jiri Olsa escreveu:
> > Add 'lock' file under daemon base and flock it, so only one
> > perf daemon can run on top of it.
> >
> > # perf daemon --config ./config.daemon
> > # perf daemon --config ./config.daemon
> > failed: another perf daemon (pid 369675) owns /opt/perfdata
>
> So the way to disambiguate is the "daemon base"?

yes, the 'base' is path where perf daemon will create
all control files and 'session' directories and does
chdir for 'perf record' session on top of that

jirka

>
> - Arnaldo
>
> > Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> > ---
> > tools/perf/builtin-daemon.c | 43 +++++++++++++++++++++++++++++++++++++
> > 1 file changed, 43 insertions(+)
> >
> > diff --git a/tools/perf/builtin-daemon.c b/tools/perf/builtin-daemon.c
> > index 855fed2fe364..1bd5432a57a3 100644
> > --- a/tools/perf/builtin-daemon.c
> > +++ b/tools/perf/builtin-daemon.c
> > @@ -8,6 +8,7 @@
> > #include <string.h>
> > #include <sys/types.h>
> > #include <sys/wait.h>
> > +#include <sys/file.h>
> > #include <signal.h>
> > #include <stdlib.h>
> > #include <time.h>
> > @@ -639,6 +640,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, 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("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;
> > @@ -653,6 +690,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)) {
> > @@ -704,6 +744,9 @@ static int __cmd_daemon(struct daemon *daemon, bool foreground, const char *conf
> > if (setup_server_config(daemon))
> > return -1;
> >
> > + if (foreground && check_lock(daemon))
> > + return -1;
> > +
> > if (!foreground && go_background(daemon))
> > return -1;
> >
> > --
> > 2.26.2
> >
>
> --
>
> - Arnaldo
>

\
 
 \ /
  Last update: 2020-12-15 20:21    [W:0.097 / U:0.568 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site