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:
Arnaldo Carvalho de Melo
2021-03-29 10:39:10 -03:00
1301 changed files with 11277 additions and 6798 deletions

View File

@@ -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");