Lines Matching full:daemon
85 struct daemon { struct
99 static struct daemon __daemon = { argument
104 "perf daemon {start|signal|stop|ping} [<options>]",
105 "perf daemon [<options>]",
116 static struct daemon_session *daemon__add_session(struct daemon *config, char *name) in daemon__add_session()
134 static struct daemon_session *daemon__find_session(struct daemon *daemon, char *name) in daemon__find_session() argument
138 list_for_each_entry(session, &daemon->sessions, list) { in daemon__find_session()
157 static int session_config(struct daemon *daemon, const char *var, const char *value) in session_config() argument
171 session = daemon__find_session(daemon, name); in session_config()
175 session = daemon__add_session(daemon, name); in session_config()
218 struct daemon *daemon = cb; in server_config() local
221 return session_config(daemon, var, value); in server_config()
222 } else if (!strcmp(var, "daemon.base") && !daemon->base_user) { in server_config()
223 if (daemon->base && strcmp(daemon->base, value)) { in server_config()
227 daemon->base = strdup(value); in server_config()
228 if (!daemon->base) in server_config()
237 struct daemon *daemon = cb; in client_config() local
239 if (!strcmp(var, "daemon.base") && !daemon->base_user) { in client_config()
240 daemon->base = strdup(value); in client_config()
241 if (!daemon->base) in client_config()
248 static int check_base(struct daemon *daemon) in check_base() argument
252 if (!daemon->base) { in check_base()
257 if (stat(daemon->base, &st)) { in check_base()
261 daemon->base); in check_base()
265 daemon->base); in check_base()
269 daemon->base, strerror(errno)); in check_base()
276 daemon->base); in check_base()
283 static int setup_client_config(struct daemon *daemon) in setup_client_config() argument
285 struct perf_config_set *set = perf_config_set__load_file(daemon->config_real); in setup_client_config()
289 err = perf_config_set(set, client_config, daemon); in setup_client_config()
293 return err ?: check_base(daemon); in setup_client_config()
296 static int setup_server_config(struct daemon *daemon) in setup_server_config() argument
309 list_for_each_entry(session, &daemon->sessions, list) in setup_server_config()
312 set = perf_config_set__load_file(daemon->config_real); in setup_server_config()
314 err = perf_config_set(set, server_config, daemon); in setup_server_config()
318 return err ?: check_base(daemon); in setup_server_config()
322 struct daemon *daemon) in daemon_session__run() argument
329 daemon->base, session->name) < 0) { in daemon_session__run()
385 daemon->perf, SESSION_CONTROL, SESSION_ACK, session->run); in daemon_session__run()
391 exit(execve(daemon->perf, argv, NULL)); in daemon_session__run()
395 static pid_t handle_signalfd(struct daemon *daemon) in handle_signalfd() argument
409 err = read(daemon->signal_fd, &si, sizeof(struct signalfd_siginfo)); in handle_signalfd()
415 list_for_each_entry(session, &daemon->sessions, list) { in handle_signalfd()
444 static int daemon_session__wait(struct daemon_session *session, struct daemon *daemon, in daemon_session__wait() argument
448 .fd = daemon->signal_fd, in daemon_session__wait()
459 handle_signalfd(daemon); in daemon_session__wait()
472 static bool daemon__has_alive_session(struct daemon *daemon) in daemon__has_alive_session() argument
476 list_for_each_entry(session, &daemon->sessions, list) { in daemon__has_alive_session()
484 static int daemon__wait(struct daemon *daemon, int secs) in daemon__wait() argument
487 .fd = daemon->signal_fd, in daemon__wait()
498 handle_signalfd(daemon); in daemon__wait()
506 } while (daemon__has_alive_session(daemon)); in daemon__wait()
582 static int setup_server_socket(struct daemon *daemon) in setup_server_socket() argument
599 scnprintf(path, sizeof(path), "%s/control", daemon->base); in setup_server_socket()
673 static int cmd_session_list(struct daemon *daemon, union cmd *cmd, FILE *out) in cmd_session_list() argument
681 /* pid daemon */ in cmd_session_list()
682 getpid(), csv_sep, "daemon", in cmd_session_list()
684 csv_sep, daemon->base, in cmd_session_list()
686 csv_sep, daemon->base, SESSION_OUTPUT); in cmd_session_list()
690 csv_sep, daemon->base, "lock"); in cmd_session_list()
694 csv_sep, (uint64_t)((curr - daemon->start) / 60)); in cmd_session_list()
698 fprintf(out, "[%d:daemon] base: %s\n", getpid(), daemon->base); in cmd_session_list()
701 daemon->base, SESSION_OUTPUT); in cmd_session_list()
703 daemon->base); in cmd_session_list()
705 (uint64_t)((curr - daemon->start) / 60)); in cmd_session_list()
709 list_for_each_entry(session, &daemon->sessions, list) { in cmd_session_list()
764 static int cmd_session_kill(struct daemon *daemon, union cmd *cmd, FILE *out) in cmd_session_kill() argument
771 list_for_each_entry(session, &daemon->sessions, list) { in cmd_session_kill()
787 static int cmd_session_ping(struct daemon *daemon, union cmd *cmd, FILE *out) in cmd_session_ping() argument
794 list_for_each_entry(session, &daemon->sessions, list) { in cmd_session_ping()
810 static int handle_server_socket(struct daemon *daemon, int sock_fd) in handle_server_socket() argument
835 ret = cmd_session_list(daemon, &cmd, out); in handle_server_socket()
838 ret = cmd_session_kill(daemon, &cmd, out); in handle_server_socket()
843 pr_debug("perf daemon is exciting\n"); in handle_server_socket()
846 ret = cmd_session_ping(daemon, &cmd, out); in handle_server_socket()
860 static int setup_client_socket(struct daemon *daemon) in setup_client_socket() argument
871 scnprintf(path, sizeof(path), "%s/control", daemon->base); in setup_client_socket()
893 struct daemon *daemon) in daemon_session__kill() argument
915 } while (daemon_session__wait(session, daemon, 10)); in daemon_session__kill()
918 static void daemon__signal(struct daemon *daemon, int sig) in daemon__signal() argument
922 list_for_each_entry(session, &daemon->sessions, list) in daemon__signal()
940 static void daemon__stop(struct daemon *daemon) in daemon__stop() argument
944 list_for_each_entry(session, &daemon->sessions, list) in daemon__stop()
948 static void daemon__kill(struct daemon *daemon) in daemon__kill() argument
955 daemon__stop(daemon); in daemon__kill()
958 daemon__signal(daemon, SIGTERM); in daemon__kill()
961 daemon__signal(daemon, SIGKILL); in daemon__kill()
969 } while (daemon__wait(daemon, 10)); in daemon__kill()
972 static void daemon__exit(struct daemon *daemon) in daemon__exit() argument
976 list_for_each_entry_safe(session, h, &daemon->sessions, list) in daemon__exit()
979 zfree(&daemon->config_real); in daemon__exit()
980 zfree(&daemon->config_base); in daemon__exit()
981 zfree(&daemon->base); in daemon__exit()
984 static int daemon__reconfig(struct daemon *daemon) in daemon__reconfig() argument
988 list_for_each_entry_safe(session, n, &daemon->sessions, list) { in daemon__reconfig()
996 daemon_session__kill(session, daemon); in daemon__reconfig()
1005 daemon_session__kill(session, daemon); in daemon__reconfig()
1008 if (daemon_session__run(session, daemon)) in daemon__reconfig()
1017 static int setup_config_changes(struct daemon *daemon) in setup_config_changes() argument
1019 char *basen = strdup(daemon->config_real); in setup_config_changes()
1020 char *dirn = strdup(daemon->config_real); in setup_config_changes()
1039 daemon->config_base = strdup(base); in setup_config_changes()
1040 if (!daemon->config_base) { in setup_config_changes()
1054 static bool process_inotify_event(struct daemon *daemon, char *buf, ssize_t len) in process_inotify_event() argument
1067 if (!strcmp(event->name, daemon->config_base)) in process_inotify_event()
1075 static int handle_config_changes(struct daemon *daemon, int conf_fd, in handle_config_changes() argument
1090 *config_changed = process_inotify_event(daemon, buf, len); in handle_config_changes()
1095 static int setup_config(struct daemon *daemon) in setup_config() argument
1097 if (daemon->base_user) { in setup_config()
1098 daemon->base = strdup(daemon->base_user); in setup_config()
1099 if (!daemon->base) in setup_config()
1103 if (daemon->config) { in setup_config()
1104 char *real = realpath(daemon->config, NULL); in setup_config()
1110 daemon->config_real = real; in setup_config()
1115 daemon->config_real = strdup(perf_etc_perfconfig()); in setup_config()
1117 daemon->config_real = strdup(perf_home_perfconfig()); in setup_config()
1119 return daemon->config_real ? 0 : -1; in setup_config()
1135 * Each daemon tries to create and lock BASE/lock file,
1136 * if it's successful we are sure we're the only daemon
1139 * Once daemon is finished, file descriptor to lock file
1142 static int check_lock(struct daemon *daemon) in check_lock() argument
1149 scnprintf(path, sizeof(path), "%s/lock", daemon->base); in check_lock()
1157 fprintf(stderr, "failed: another perf daemon (pid %d) owns %s\n", in check_lock()
1158 pid, daemon->base); in check_lock()
1181 static int go_background(struct daemon *daemon) in go_background() argument
1195 if (check_lock(daemon)) in go_background()
1200 if (chdir(daemon->base)) { in go_background()
1222 daemon->out = fdopen(1, "w"); in go_background()
1223 if (!daemon->out) { in go_background()
1229 setbuf(daemon->out, NULL); in go_background()
1233 static int setup_signalfd(struct daemon *daemon) in setup_signalfd() argument
1243 daemon->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC); in setup_signalfd()
1244 return daemon->signal_fd; in setup_signalfd()
1247 static int __cmd_start(struct daemon *daemon, struct option parent_options[], in __cmd_start() argument
1265 daemon->start = time(NULL); in __cmd_start()
1267 if (setup_config(daemon)) { in __cmd_start()
1272 if (setup_server_config(daemon)) in __cmd_start()
1275 if (foreground && check_lock(daemon)) in __cmd_start()
1279 err = go_background(daemon); in __cmd_start()
1284 daemon__exit(daemon); in __cmd_start()
1289 debug_set_file(daemon->out); in __cmd_start()
1292 pr_info("daemon started (pid %d)\n", getpid()); in __cmd_start()
1296 sock_fd = setup_server_socket(daemon); in __cmd_start()
1300 conf_fd = setup_config_changes(daemon); in __cmd_start()
1304 signal_fd = setup_signalfd(daemon); in __cmd_start()
1325 err = daemon__reconfig(daemon); in __cmd_start()
1331 err = handle_server_socket(daemon, sock_fd); in __cmd_start()
1333 err = handle_config_changes(daemon, conf_fd, &reconfig); in __cmd_start()
1335 err = handle_signalfd(daemon) < 0; in __cmd_start()
1338 err = setup_server_config(daemon); in __cmd_start()
1345 daemon__kill(daemon); in __cmd_start()
1346 daemon__exit(daemon); in __cmd_start()
1355 pr_info("daemon exited\n"); in __cmd_start()
1356 fclose(daemon->out); in __cmd_start()
1360 static int send_cmd(struct daemon *daemon, union cmd *cmd) in send_cmd() argument
1368 if (setup_client_config(daemon)) in send_cmd()
1371 fd = setup_client_socket(daemon); in send_cmd()
1403 static int send_cmd_list(struct daemon *daemon) in send_cmd_list() argument
1410 cmd.list.csv_sep = daemon->csv_sep ? *daemon->csv_sep : 0; in send_cmd_list()
1412 return send_cmd(daemon, &cmd); in send_cmd_list()
1415 static int __cmd_signal(struct daemon *daemon, struct option parent_options[], in __cmd_signal() argument
1431 if (setup_config(daemon)) { in __cmd_signal()
1441 return send_cmd(daemon, &cmd); in __cmd_signal()
1444 static int __cmd_stop(struct daemon *daemon, struct option parent_options[], in __cmd_stop() argument
1457 if (setup_config(daemon)) { in __cmd_stop()
1464 return send_cmd(daemon, &cmd); in __cmd_stop()
1467 static int __cmd_ping(struct daemon *daemon, struct option parent_options[], in __cmd_ping() argument
1483 if (setup_config(daemon)) { in __cmd_ping()
1491 return send_cmd(daemon, &cmd); in __cmd_ping()