Merge remote-tracking branch 'torvalds/master' into perf/core
To pick up fixes sent via perf/urgent and in the BPF tools/ directories. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
@@ -399,35 +399,42 @@ static pid_t handle_signalfd(struct daemon *daemon)
|
||||
int status;
|
||||
pid_t pid;
|
||||
|
||||
/*
|
||||
* Take signal fd data as pure signal notification and check all
|
||||
* the sessions state. The reason is that multiple signals can get
|
||||
* coalesced in kernel and we can receive only single signal even
|
||||
* if multiple SIGCHLD were generated.
|
||||
*/
|
||||
err = read(daemon->signal_fd, &si, sizeof(struct signalfd_siginfo));
|
||||
if (err != sizeof(struct signalfd_siginfo))
|
||||
if (err != sizeof(struct signalfd_siginfo)) {
|
||||
pr_err("failed to read signal fd\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
list_for_each_entry(session, &daemon->sessions, list) {
|
||||
|
||||
if (session->pid != (int) si.ssi_pid)
|
||||
if (session->pid == -1)
|
||||
continue;
|
||||
|
||||
pid = waitpid(session->pid, &status, 0);
|
||||
if (pid == session->pid) {
|
||||
if (WIFEXITED(status)) {
|
||||
pr_info("session '%s' exited, status=%d\n",
|
||||
session->name, WEXITSTATUS(status));
|
||||
} else if (WIFSIGNALED(status)) {
|
||||
pr_info("session '%s' killed (signal %d)\n",
|
||||
session->name, WTERMSIG(status));
|
||||
} else if (WIFSTOPPED(status)) {
|
||||
pr_info("session '%s' stopped (signal %d)\n",
|
||||
session->name, WSTOPSIG(status));
|
||||
} else {
|
||||
pr_info("session '%s' Unexpected status (0x%x)\n",
|
||||
session->name, status);
|
||||
}
|
||||
pid = waitpid(session->pid, &status, WNOHANG);
|
||||
if (pid <= 0)
|
||||
continue;
|
||||
|
||||
if (WIFEXITED(status)) {
|
||||
pr_info("session '%s' exited, status=%d\n",
|
||||
session->name, WEXITSTATUS(status));
|
||||
} else if (WIFSIGNALED(status)) {
|
||||
pr_info("session '%s' killed (signal %d)\n",
|
||||
session->name, WTERMSIG(status));
|
||||
} else if (WIFSTOPPED(status)) {
|
||||
pr_info("session '%s' stopped (signal %d)\n",
|
||||
session->name, WSTOPSIG(status));
|
||||
} else {
|
||||
pr_info("session '%s' Unexpected status (0x%x)\n",
|
||||
session->name, status);
|
||||
}
|
||||
|
||||
session->state = KILL;
|
||||
session->pid = -1;
|
||||
return pid;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -440,7 +447,6 @@ static int daemon_session__wait(struct daemon_session *session, struct daemon *d
|
||||
.fd = daemon->signal_fd,
|
||||
.events = POLLIN,
|
||||
};
|
||||
pid_t wpid = 0, pid = session->pid;
|
||||
time_t start;
|
||||
|
||||
start = time(NULL);
|
||||
@@ -449,7 +455,7 @@ static int daemon_session__wait(struct daemon_session *session, struct daemon *d
|
||||
int err = poll(&pollfd, 1, 1000);
|
||||
|
||||
if (err > 0) {
|
||||
wpid = handle_signalfd(daemon);
|
||||
handle_signalfd(daemon);
|
||||
} else if (err < 0) {
|
||||
perror("failed: poll\n");
|
||||
return -1;
|
||||
@@ -457,7 +463,7 @@ static int daemon_session__wait(struct daemon_session *session, struct daemon *d
|
||||
|
||||
if (start + secs < time(NULL))
|
||||
return -1;
|
||||
} while (wpid != pid);
|
||||
} while (session->pid != -1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -899,7 +905,9 @@ static void daemon_session__kill(struct daemon_session *session,
|
||||
daemon_session__signal(session, SIGKILL);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
pr_err("failed to wait for session %s\n",
|
||||
session->name);
|
||||
return;
|
||||
}
|
||||
how++;
|
||||
|
||||
@@ -952,7 +960,8 @@ static void daemon__kill(struct daemon *daemon)
|
||||
daemon__signal(daemon, SIGKILL);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
pr_err("failed to wait for sessions\n");
|
||||
return;
|
||||
}
|
||||
how++;
|
||||
|
||||
@@ -1341,7 +1350,7 @@ out:
|
||||
close(sock_fd);
|
||||
if (conf_fd != -1)
|
||||
close(conf_fd);
|
||||
if (conf_fd != -1)
|
||||
if (signal_fd != -1)
|
||||
close(signal_fd);
|
||||
|
||||
pr_info("daemon exited\n");
|
||||
|
||||
Reference in New Issue
Block a user