builtin-daemon.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <internal/lib.h>
  3. #include <inttypes.h>
  4. #include <subcmd/parse-options.h>
  5. #include <api/fd/array.h>
  6. #include <api/fs/fs.h>
  7. #include <linux/zalloc.h>
  8. #include <linux/string.h>
  9. #include <linux/limits.h>
  10. #include <string.h>
  11. #include <sys/file.h>
  12. #include <signal.h>
  13. #include <stdlib.h>
  14. #include <time.h>
  15. #include <stdio.h>
  16. #include <unistd.h>
  17. #include <errno.h>
  18. #include <sys/inotify.h>
  19. #include <libgen.h>
  20. #include <sys/types.h>
  21. #include <sys/socket.h>
  22. #include <sys/un.h>
  23. #include <sys/stat.h>
  24. #include <sys/signalfd.h>
  25. #include <sys/wait.h>
  26. #include <poll.h>
  27. #include "builtin.h"
  28. #include "perf.h"
  29. #include "debug.h"
  30. #include "config.h"
  31. #include "util.h"
  32. #define SESSION_OUTPUT "output"
  33. #define SESSION_CONTROL "control"
  34. #define SESSION_ACK "ack"
  35. /*
  36. * Session states:
  37. *
  38. * OK - session is up and running
  39. * RECONFIG - session is pending for reconfiguration,
  40. * new values are already loaded in session object
  41. * KILL - session is pending to be killed
  42. *
  43. * Session object life and its state is maintained by
  44. * following functions:
  45. *
  46. * setup_server_config
  47. * - reads config file and setup session objects
  48. * with following states:
  49. *
  50. * OK - no change needed
  51. * RECONFIG - session needs to be changed
  52. * (run variable changed)
  53. * KILL - session needs to be killed
  54. * (session is no longer in config file)
  55. *
  56. * daemon__reconfig
  57. * - scans session objects and does following actions
  58. * for states:
  59. *
  60. * OK - skip
  61. * RECONFIG - session is killed and re-run with new config
  62. * KILL - session is killed
  63. *
  64. * - all sessions have OK state on the function exit
  65. */
  66. enum daemon_session_state {
  67. OK,
  68. RECONFIG,
  69. KILL,
  70. };
  71. struct daemon_session {
  72. char *base;
  73. char *name;
  74. char *run;
  75. char *control;
  76. int pid;
  77. struct list_head list;
  78. enum daemon_session_state state;
  79. time_t start;
  80. };
  81. struct daemon {
  82. const char *config;
  83. char *config_real;
  84. char *config_base;
  85. const char *csv_sep;
  86. const char *base_user;
  87. char *base;
  88. struct list_head sessions;
  89. FILE *out;
  90. char *perf;
  91. int signal_fd;
  92. time_t start;
  93. };
  94. static struct daemon __daemon = {
  95. .sessions = LIST_HEAD_INIT(__daemon.sessions),
  96. };
  97. static const char * const daemon_usage[] = {
  98. "perf daemon {start|signal|stop|ping} [<options>]",
  99. "perf daemon [<options>]",
  100. NULL
  101. };
  102. static volatile sig_atomic_t done;
  103. static void sig_handler(int sig __maybe_unused)
  104. {
  105. done = true;
  106. }
  107. static struct daemon_session *daemon__add_session(struct daemon *config, char *name)
  108. {
  109. struct daemon_session *session = zalloc(sizeof(*session));
  110. if (!session)
  111. return NULL;
  112. session->name = strdup(name);
  113. if (!session->name) {
  114. free(session);
  115. return NULL;
  116. }
  117. session->pid = -1;
  118. list_add_tail(&session->list, &config->sessions);
  119. return session;
  120. }
  121. static struct daemon_session *daemon__find_session(struct daemon *daemon, char *name)
  122. {
  123. struct daemon_session *session;
  124. list_for_each_entry(session, &daemon->sessions, list) {
  125. if (!strcmp(session->name, name))
  126. return session;
  127. }
  128. return NULL;
  129. }
  130. static int get_session_name(const char *var, char *session, int len)
  131. {
  132. const char *p = var + sizeof("session-") - 1;
  133. while (*p != '.' && *p != 0x0 && len--)
  134. *session++ = *p++;
  135. *session = 0;
  136. return *p == '.' ? 0 : -EINVAL;
  137. }
  138. static int session_config(struct daemon *daemon, const char *var, const char *value)
  139. {
  140. struct daemon_session *session;
  141. char name[100];
  142. if (get_session_name(var, name, sizeof(name) - 1))
  143. return -EINVAL;
  144. var = strchr(var, '.');
  145. if (!var)
  146. return -EINVAL;
  147. var++;
  148. session = daemon__find_session(daemon, name);
  149. if (!session) {
  150. /* New session is defined. */
  151. session = daemon__add_session(daemon, name);
  152. if (!session)
  153. return -ENOMEM;
  154. pr_debug("reconfig: found new session %s\n", name);
  155. /* Trigger reconfig to start it. */
  156. session->state = RECONFIG;
  157. } else if (session->state == KILL) {
  158. /* Current session is defined, no action needed. */
  159. pr_debug("reconfig: found current session %s\n", name);
  160. session->state = OK;
  161. }
  162. if (!strcmp(var, "run")) {
  163. bool same = false;
  164. if (session->run)
  165. same = !strcmp(session->run, value);
  166. if (!same) {
  167. if (session->run) {
  168. zfree(&session->run);
  169. pr_debug("reconfig: session %s is changed\n", name);
  170. }
  171. session->run = strdup(value);
  172. if (!session->run)
  173. return -ENOMEM;
  174. /*
  175. * Either new or changed run value is defined,
  176. * trigger reconfig for the session.
  177. */
  178. session->state = RECONFIG;
  179. }
  180. }
  181. return 0;
  182. }
  183. static int server_config(const char *var, const char *value, void *cb)
  184. {
  185. struct daemon *daemon = cb;
  186. if (strstarts(var, "session-")) {
  187. return session_config(daemon, var, value);
  188. } else if (!strcmp(var, "daemon.base") && !daemon->base_user) {
  189. if (daemon->base && strcmp(daemon->base, value)) {
  190. pr_err("failed: can't redefine base, bailing out\n");
  191. return -EINVAL;
  192. }
  193. daemon->base = strdup(value);
  194. if (!daemon->base)
  195. return -ENOMEM;
  196. }
  197. return 0;
  198. }
  199. static int client_config(const char *var, const char *value, void *cb)
  200. {
  201. struct daemon *daemon = cb;
  202. if (!strcmp(var, "daemon.base") && !daemon->base_user) {
  203. daemon->base = strdup(value);
  204. if (!daemon->base)
  205. return -ENOMEM;
  206. }
  207. return 0;
  208. }
  209. static int check_base(struct daemon *daemon)
  210. {
  211. struct stat st;
  212. if (!daemon->base) {
  213. pr_err("failed: base not defined\n");
  214. return -EINVAL;
  215. }
  216. if (stat(daemon->base, &st)) {
  217. switch (errno) {
  218. case EACCES:
  219. pr_err("failed: permission denied for '%s' base\n",
  220. daemon->base);
  221. return -EACCES;
  222. case ENOENT:
  223. pr_err("failed: base '%s' does not exists\n",
  224. daemon->base);
  225. return -EACCES;
  226. default:
  227. pr_err("failed: can't access base '%s': %s\n",
  228. daemon->base, strerror(errno));
  229. return -errno;
  230. }
  231. }
  232. if ((st.st_mode & S_IFMT) != S_IFDIR) {
  233. pr_err("failed: base '%s' is not directory\n",
  234. daemon->base);
  235. return -EINVAL;
  236. }
  237. return 0;
  238. }
  239. static int setup_client_config(struct daemon *daemon)
  240. {
  241. struct perf_config_set *set = perf_config_set__load_file(daemon->config_real);
  242. int err = -ENOMEM;
  243. if (set) {
  244. err = perf_config_set(set, client_config, daemon);
  245. perf_config_set__delete(set);
  246. }
  247. return err ?: check_base(daemon);
  248. }
  249. static int setup_server_config(struct daemon *daemon)
  250. {
  251. struct perf_config_set *set;
  252. struct daemon_session *session;
  253. int err = -ENOMEM;
  254. pr_debug("reconfig: started\n");
  255. /*
  256. * Mark all sessions for kill, the server config
  257. * will set following states, see explanation at
  258. * enum daemon_session_state declaration.
  259. */
  260. list_for_each_entry(session, &daemon->sessions, list)
  261. session->state = KILL;
  262. set = perf_config_set__load_file(daemon->config_real);
  263. if (set) {
  264. err = perf_config_set(set, server_config, daemon);
  265. perf_config_set__delete(set);
  266. }
  267. return err ?: check_base(daemon);
  268. }
  269. static int daemon_session__run(struct daemon_session *session,
  270. struct daemon *daemon)
  271. {
  272. char buf[PATH_MAX];
  273. char **argv;
  274. int argc, fd;
  275. if (asprintf(&session->base, "%s/session-%s",
  276. daemon->base, session->name) < 0) {
  277. perror("failed: asprintf");
  278. return -1;
  279. }
  280. if (mkdir(session->base, 0755) && errno != EEXIST) {
  281. perror("failed: mkdir");
  282. return -1;
  283. }
  284. session->start = time(NULL);
  285. session->pid = fork();
  286. if (session->pid < 0)
  287. return -1;
  288. if (session->pid > 0) {
  289. pr_info("reconfig: ruining session [%s:%d]: %s\n",
  290. session->name, session->pid, session->run);
  291. return 0;
  292. }
  293. if (chdir(session->base)) {
  294. perror("failed: chdir");
  295. return -1;
  296. }
  297. fd = open("/dev/null", O_RDONLY);
  298. if (fd < 0) {
  299. perror("failed: open /dev/null");
  300. return -1;
  301. }
  302. dup2(fd, 0);
  303. close(fd);
  304. fd = open(SESSION_OUTPUT, O_RDWR|O_CREAT|O_TRUNC, 0644);
  305. if (fd < 0) {
  306. perror("failed: open session output");
  307. return -1;
  308. }
  309. dup2(fd, 1);
  310. dup2(fd, 2);
  311. close(fd);
  312. if (mkfifo(SESSION_CONTROL, 0600) && errno != EEXIST) {
  313. perror("failed: create control fifo");
  314. return -1;
  315. }
  316. if (mkfifo(SESSION_ACK, 0600) && errno != EEXIST) {
  317. perror("failed: create ack fifo");
  318. return -1;
  319. }
  320. scnprintf(buf, sizeof(buf), "%s record --control=fifo:%s,%s %s",
  321. daemon->perf, SESSION_CONTROL, SESSION_ACK, session->run);
  322. argv = argv_split(buf, &argc);
  323. if (!argv)
  324. exit(-1);
  325. exit(execve(daemon->perf, argv, NULL));
  326. return -1;
  327. }
  328. static pid_t handle_signalfd(struct daemon *daemon)
  329. {
  330. struct daemon_session *session;
  331. struct signalfd_siginfo si;
  332. ssize_t err;
  333. int status;
  334. pid_t pid;
  335. /*
  336. * Take signal fd data as pure signal notification and check all
  337. * the sessions state. The reason is that multiple signals can get
  338. * coalesced in kernel and we can receive only single signal even
  339. * if multiple SIGCHLD were generated.
  340. */
  341. err = read(daemon->signal_fd, &si, sizeof(struct signalfd_siginfo));
  342. if (err != sizeof(struct signalfd_siginfo)) {
  343. pr_err("failed to read signal fd\n");
  344. return -1;
  345. }
  346. list_for_each_entry(session, &daemon->sessions, list) {
  347. if (session->pid == -1)
  348. continue;
  349. pid = waitpid(session->pid, &status, WNOHANG);
  350. if (pid <= 0)
  351. continue;
  352. if (WIFEXITED(status)) {
  353. pr_info("session '%s' exited, status=%d\n",
  354. session->name, WEXITSTATUS(status));
  355. } else if (WIFSIGNALED(status)) {
  356. pr_info("session '%s' killed (signal %d)\n",
  357. session->name, WTERMSIG(status));
  358. } else if (WIFSTOPPED(status)) {
  359. pr_info("session '%s' stopped (signal %d)\n",
  360. session->name, WSTOPSIG(status));
  361. } else {
  362. pr_info("session '%s' Unexpected status (0x%x)\n",
  363. session->name, status);
  364. }
  365. session->state = KILL;
  366. session->pid = -1;
  367. }
  368. return 0;
  369. }
  370. static int daemon_session__wait(struct daemon_session *session, struct daemon *daemon,
  371. int secs)
  372. {
  373. struct pollfd pollfd = {
  374. .fd = daemon->signal_fd,
  375. .events = POLLIN,
  376. };
  377. time_t start;
  378. start = time(NULL);
  379. do {
  380. int err = poll(&pollfd, 1, 1000);
  381. if (err > 0) {
  382. handle_signalfd(daemon);
  383. } else if (err < 0) {
  384. perror("failed: poll\n");
  385. return -1;
  386. }
  387. if (start + secs < time(NULL))
  388. return -1;
  389. } while (session->pid != -1);
  390. return 0;
  391. }
  392. static bool daemon__has_alive_session(struct daemon *daemon)
  393. {
  394. struct daemon_session *session;
  395. list_for_each_entry(session, &daemon->sessions, list) {
  396. if (session->pid != -1)
  397. return true;
  398. }
  399. return false;
  400. }
  401. static int daemon__wait(struct daemon *daemon, int secs)
  402. {
  403. struct pollfd pollfd = {
  404. .fd = daemon->signal_fd,
  405. .events = POLLIN,
  406. };
  407. time_t start;
  408. start = time(NULL);
  409. do {
  410. int err = poll(&pollfd, 1, 1000);
  411. if (err > 0) {
  412. handle_signalfd(daemon);
  413. } else if (err < 0) {
  414. perror("failed: poll\n");
  415. return -1;
  416. }
  417. if (start + secs < time(NULL))
  418. return -1;
  419. } while (daemon__has_alive_session(daemon));
  420. return 0;
  421. }
  422. static int daemon_session__control(struct daemon_session *session,
  423. const char *msg, bool do_ack)
  424. {
  425. struct pollfd pollfd = { .events = POLLIN, };
  426. char control_path[PATH_MAX];
  427. char ack_path[PATH_MAX];
  428. int control, ack = -1, len;
  429. char buf[20];
  430. int ret = -1;
  431. ssize_t err;
  432. /* open the control file */
  433. scnprintf(control_path, sizeof(control_path), "%s/%s",
  434. session->base, SESSION_CONTROL);
  435. control = open(control_path, O_WRONLY|O_NONBLOCK);
  436. if (control < 0)
  437. return -1;
  438. if (do_ack) {
  439. /* open the ack file */
  440. scnprintf(ack_path, sizeof(ack_path), "%s/%s",
  441. session->base, SESSION_ACK);
  442. ack = open(ack_path, O_RDONLY, O_NONBLOCK);
  443. if (ack < 0) {
  444. close(control);
  445. return -1;
  446. }
  447. }
  448. /* write the command */
  449. len = strlen(msg);
  450. err = writen(control, msg, len);
  451. if (err != len) {
  452. pr_err("failed: write to control pipe: %d (%s)\n",
  453. errno, control_path);
  454. goto out;
  455. }
  456. if (!do_ack)
  457. goto out;
  458. /* wait for an ack */
  459. pollfd.fd = ack;
  460. if (!poll(&pollfd, 1, 2000)) {
  461. pr_err("failed: control ack timeout\n");
  462. goto out;
  463. }
  464. if (!(pollfd.revents & POLLIN)) {
  465. pr_err("failed: did not received an ack\n");
  466. goto out;
  467. }
  468. err = read(ack, buf, sizeof(buf));
  469. if (err > 0)
  470. ret = strcmp(buf, "ack\n");
  471. else
  472. perror("failed: read ack %d\n");
  473. out:
  474. if (ack != -1)
  475. close(ack);
  476. close(control);
  477. return ret;
  478. }
  479. static int setup_server_socket(struct daemon *daemon)
  480. {
  481. struct sockaddr_un addr;
  482. char path[PATH_MAX];
  483. int fd = socket(AF_UNIX, SOCK_STREAM, 0);
  484. if (fd < 0) {
  485. fprintf(stderr, "socket: %s\n", strerror(errno));
  486. return -1;
  487. }
  488. if (fcntl(fd, F_SETFD, FD_CLOEXEC)) {
  489. perror("failed: fcntl FD_CLOEXEC");
  490. close(fd);
  491. return -1;
  492. }
  493. scnprintf(path, sizeof(path), "%s/control", daemon->base);
  494. if (strlen(path) + 1 >= sizeof(addr.sun_path)) {
  495. pr_err("failed: control path too long '%s'\n", path);
  496. close(fd);
  497. return -1;
  498. }
  499. memset(&addr, 0, sizeof(addr));
  500. addr.sun_family = AF_UNIX;
  501. strlcpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
  502. unlink(path);
  503. if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
  504. perror("failed: bind");
  505. close(fd);
  506. return -1;
  507. }
  508. if (listen(fd, 1) == -1) {
  509. perror("failed: listen");
  510. close(fd);
  511. return -1;
  512. }
  513. return fd;
  514. }
  515. enum {
  516. CMD_LIST = 0,
  517. CMD_SIGNAL = 1,
  518. CMD_STOP = 2,
  519. CMD_PING = 3,
  520. CMD_MAX,
  521. };
  522. #define SESSION_MAX 64
  523. union cmd {
  524. int cmd;
  525. /* CMD_LIST */
  526. struct {
  527. int cmd;
  528. int verbose;
  529. char csv_sep;
  530. } list;
  531. /* CMD_SIGNAL */
  532. struct {
  533. int cmd;
  534. int sig;
  535. char name[SESSION_MAX];
  536. } signal;
  537. /* CMD_PING */
  538. struct {
  539. int cmd;
  540. char name[SESSION_MAX];
  541. } ping;
  542. };
  543. enum {
  544. PING_OK = 0,
  545. PING_FAIL = 1,
  546. PING_MAX,
  547. };
  548. static int daemon_session__ping(struct daemon_session *session)
  549. {
  550. return daemon_session__control(session, "ping", true) ? PING_FAIL : PING_OK;
  551. }
  552. static int cmd_session_list(struct daemon *daemon, union cmd *cmd, FILE *out)
  553. {
  554. char csv_sep = cmd->list.csv_sep;
  555. struct daemon_session *session;
  556. time_t curr = time(NULL);
  557. if (csv_sep) {
  558. fprintf(out, "%d%c%s%c%s%c%s/%s",
  559. /* pid daemon */
  560. getpid(), csv_sep, "daemon",
  561. /* base */
  562. csv_sep, daemon->base,
  563. /* output */
  564. csv_sep, daemon->base, SESSION_OUTPUT);
  565. fprintf(out, "%c%s/%s",
  566. /* lock */
  567. csv_sep, daemon->base, "lock");
  568. fprintf(out, "%c%" PRIu64,
  569. /* session up time */
  570. csv_sep, (uint64_t)((curr - daemon->start) / 60));
  571. fprintf(out, "\n");
  572. } else {
  573. fprintf(out, "[%d:daemon] base: %s\n", getpid(), daemon->base);
  574. if (cmd->list.verbose) {
  575. fprintf(out, " output: %s/%s\n",
  576. daemon->base, SESSION_OUTPUT);
  577. fprintf(out, " lock: %s/lock\n",
  578. daemon->base);
  579. fprintf(out, " up: %" PRIu64 " minutes\n",
  580. (uint64_t)((curr - daemon->start) / 60));
  581. }
  582. }
  583. list_for_each_entry(session, &daemon->sessions, list) {
  584. if (csv_sep) {
  585. fprintf(out, "%d%c%s%c%s",
  586. /* pid */
  587. session->pid,
  588. /* name */
  589. csv_sep, session->name,
  590. /* base */
  591. csv_sep, session->run);
  592. fprintf(out, "%c%s%c%s/%s",
  593. /* session dir */
  594. csv_sep, session->base,
  595. /* session output */
  596. csv_sep, session->base, SESSION_OUTPUT);
  597. fprintf(out, "%c%s/%s%c%s/%s",
  598. /* session control */
  599. csv_sep, session->base, SESSION_CONTROL,
  600. /* session ack */
  601. csv_sep, session->base, SESSION_ACK);
  602. fprintf(out, "%c%" PRIu64,
  603. /* session up time */
  604. csv_sep, (uint64_t)((curr - session->start) / 60));
  605. fprintf(out, "\n");
  606. } else {
  607. fprintf(out, "[%d:%s] perf record %s\n",
  608. session->pid, session->name, session->run);
  609. if (!cmd->list.verbose)
  610. continue;
  611. fprintf(out, " base: %s\n",
  612. session->base);
  613. fprintf(out, " output: %s/%s\n",
  614. session->base, SESSION_OUTPUT);
  615. fprintf(out, " control: %s/%s\n",
  616. session->base, SESSION_CONTROL);
  617. fprintf(out, " ack: %s/%s\n",
  618. session->base, SESSION_ACK);
  619. fprintf(out, " up: %" PRIu64 " minutes\n",
  620. (uint64_t)((curr - session->start) / 60));
  621. }
  622. }
  623. return 0;
  624. }
  625. static int daemon_session__signal(struct daemon_session *session, int sig)
  626. {
  627. if (session->pid < 0)
  628. return -1;
  629. return kill(session->pid, sig);
  630. }
  631. static int cmd_session_kill(struct daemon *daemon, union cmd *cmd, FILE *out)
  632. {
  633. struct daemon_session *session;
  634. bool all = false;
  635. all = !strcmp(cmd->signal.name, "all");
  636. list_for_each_entry(session, &daemon->sessions, list) {
  637. if (all || !strcmp(cmd->signal.name, session->name)) {
  638. daemon_session__signal(session, cmd->signal.sig);
  639. fprintf(out, "signal %d sent to session '%s [%d]'\n",
  640. cmd->signal.sig, session->name, session->pid);
  641. }
  642. }
  643. return 0;
  644. }
  645. static const char *ping_str[PING_MAX] = {
  646. [PING_OK] = "OK",
  647. [PING_FAIL] = "FAIL",
  648. };
  649. static int cmd_session_ping(struct daemon *daemon, union cmd *cmd, FILE *out)
  650. {
  651. struct daemon_session *session;
  652. bool all = false, found = false;
  653. all = !strcmp(cmd->ping.name, "all");
  654. list_for_each_entry(session, &daemon->sessions, list) {
  655. if (all || !strcmp(cmd->ping.name, session->name)) {
  656. int state = daemon_session__ping(session);
  657. fprintf(out, "%-4s %s\n", ping_str[state], session->name);
  658. found = true;
  659. }
  660. }
  661. if (!found && !all) {
  662. fprintf(out, "%-4s %s (not found)\n",
  663. ping_str[PING_FAIL], cmd->ping.name);
  664. }
  665. return 0;
  666. }
  667. static int handle_server_socket(struct daemon *daemon, int sock_fd)
  668. {
  669. int ret = -1, fd;
  670. FILE *out = NULL;
  671. union cmd cmd;
  672. fd = accept(sock_fd, NULL, NULL);
  673. if (fd < 0) {
  674. perror("failed: accept");
  675. return -1;
  676. }
  677. if (sizeof(cmd) != readn(fd, &cmd, sizeof(cmd))) {
  678. perror("failed: read");
  679. goto out;
  680. }
  681. out = fdopen(fd, "w");
  682. if (!out) {
  683. perror("failed: fdopen");
  684. goto out;
  685. }
  686. switch (cmd.cmd) {
  687. case CMD_LIST:
  688. ret = cmd_session_list(daemon, &cmd, out);
  689. break;
  690. case CMD_SIGNAL:
  691. ret = cmd_session_kill(daemon, &cmd, out);
  692. break;
  693. case CMD_STOP:
  694. done = 1;
  695. ret = 0;
  696. pr_debug("perf daemon is exciting\n");
  697. break;
  698. case CMD_PING:
  699. ret = cmd_session_ping(daemon, &cmd, out);
  700. break;
  701. default:
  702. break;
  703. }
  704. fclose(out);
  705. out:
  706. /* If out is defined, then fd is closed via fclose. */
  707. if (!out)
  708. close(fd);
  709. return ret;
  710. }
  711. static int setup_client_socket(struct daemon *daemon)
  712. {
  713. struct sockaddr_un addr;
  714. char path[PATH_MAX];
  715. int fd = socket(AF_UNIX, SOCK_STREAM, 0);
  716. if (fd == -1) {
  717. perror("failed: socket");
  718. return -1;
  719. }
  720. scnprintf(path, sizeof(path), "%s/control", daemon->base);
  721. if (strlen(path) + 1 >= sizeof(addr.sun_path)) {
  722. pr_err("failed: control path too long '%s'\n", path);
  723. close(fd);
  724. return -1;
  725. }
  726. memset(&addr, 0, sizeof(addr));
  727. addr.sun_family = AF_UNIX;
  728. strlcpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
  729. if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
  730. perror("failed: connect");
  731. close(fd);
  732. return -1;
  733. }
  734. return fd;
  735. }
  736. static void daemon_session__kill(struct daemon_session *session,
  737. struct daemon *daemon)
  738. {
  739. int how = 0;
  740. do {
  741. switch (how) {
  742. case 0:
  743. daemon_session__control(session, "stop", false);
  744. break;
  745. case 1:
  746. daemon_session__signal(session, SIGTERM);
  747. break;
  748. case 2:
  749. daemon_session__signal(session, SIGKILL);
  750. break;
  751. default:
  752. pr_err("failed to wait for session %s\n",
  753. session->name);
  754. return;
  755. }
  756. how++;
  757. } while (daemon_session__wait(session, daemon, 10));
  758. }
  759. static void daemon__signal(struct daemon *daemon, int sig)
  760. {
  761. struct daemon_session *session;
  762. list_for_each_entry(session, &daemon->sessions, list)
  763. daemon_session__signal(session, sig);
  764. }
  765. static void daemon_session__delete(struct daemon_session *session)
  766. {
  767. zfree(&session->base);
  768. zfree(&session->name);
  769. zfree(&session->run);
  770. free(session);
  771. }
  772. static void daemon_session__remove(struct daemon_session *session)
  773. {
  774. list_del(&session->list);
  775. daemon_session__delete(session);
  776. }
  777. static void daemon__stop(struct daemon *daemon)
  778. {
  779. struct daemon_session *session;
  780. list_for_each_entry(session, &daemon->sessions, list)
  781. daemon_session__control(session, "stop", false);
  782. }
  783. static void daemon__kill(struct daemon *daemon)
  784. {
  785. int how = 0;
  786. do {
  787. switch (how) {
  788. case 0:
  789. daemon__stop(daemon);
  790. break;
  791. case 1:
  792. daemon__signal(daemon, SIGTERM);
  793. break;
  794. case 2:
  795. daemon__signal(daemon, SIGKILL);
  796. break;
  797. default:
  798. pr_err("failed to wait for sessions\n");
  799. return;
  800. }
  801. how++;
  802. } while (daemon__wait(daemon, 10));
  803. }
  804. static void daemon__exit(struct daemon *daemon)
  805. {
  806. struct daemon_session *session, *h;
  807. list_for_each_entry_safe(session, h, &daemon->sessions, list)
  808. daemon_session__remove(session);
  809. zfree(&daemon->config_real);
  810. zfree(&daemon->config_base);
  811. zfree(&daemon->base);
  812. }
  813. static int daemon__reconfig(struct daemon *daemon)
  814. {
  815. struct daemon_session *session, *n;
  816. list_for_each_entry_safe(session, n, &daemon->sessions, list) {
  817. /* No change. */
  818. if (session->state == OK)
  819. continue;
  820. /* Remove session. */
  821. if (session->state == KILL) {
  822. if (session->pid > 0) {
  823. daemon_session__kill(session, daemon);
  824. pr_info("reconfig: session '%s' killed\n", session->name);
  825. }
  826. daemon_session__remove(session);
  827. continue;
  828. }
  829. /* Reconfig session. */
  830. if (session->pid > 0) {
  831. daemon_session__kill(session, daemon);
  832. pr_info("reconfig: session '%s' killed\n", session->name);
  833. }
  834. if (daemon_session__run(session, daemon))
  835. return -1;
  836. session->state = OK;
  837. }
  838. return 0;
  839. }
  840. static int setup_config_changes(struct daemon *daemon)
  841. {
  842. char *basen = strdup(daemon->config_real);
  843. char *dirn = strdup(daemon->config_real);
  844. char *base, *dir;
  845. int fd, wd = -1;
  846. if (!dirn || !basen)
  847. goto out;
  848. fd = inotify_init1(IN_NONBLOCK|O_CLOEXEC);
  849. if (fd < 0) {
  850. perror("failed: inotify_init");
  851. goto out;
  852. }
  853. dir = dirname(dirn);
  854. base = basename(basen);
  855. pr_debug("config file: %s, dir: %s\n", base, dir);
  856. wd = inotify_add_watch(fd, dir, IN_CLOSE_WRITE);
  857. if (wd >= 0) {
  858. daemon->config_base = strdup(base);
  859. if (!daemon->config_base) {
  860. close(fd);
  861. wd = -1;
  862. }
  863. } else {
  864. perror("failed: inotify_add_watch");
  865. }
  866. out:
  867. free(basen);
  868. free(dirn);
  869. return wd < 0 ? -1 : fd;
  870. }
  871. static bool process_inotify_event(struct daemon *daemon, char *buf, ssize_t len)
  872. {
  873. char *p = buf;
  874. while (p < (buf + len)) {
  875. struct inotify_event *event = (struct inotify_event *) p;
  876. /*
  877. * We monitor config directory, check if our
  878. * config file was changes.
  879. */
  880. if ((event->mask & IN_CLOSE_WRITE) &&
  881. !(event->mask & IN_ISDIR)) {
  882. if (!strcmp(event->name, daemon->config_base))
  883. return true;
  884. }
  885. p += sizeof(*event) + event->len;
  886. }
  887. return false;
  888. }
  889. static int handle_config_changes(struct daemon *daemon, int conf_fd,
  890. bool *config_changed)
  891. {
  892. char buf[4096];
  893. ssize_t len;
  894. while (!(*config_changed)) {
  895. len = read(conf_fd, buf, sizeof(buf));
  896. if (len == -1) {
  897. if (errno != EAGAIN) {
  898. perror("failed: read");
  899. return -1;
  900. }
  901. return 0;
  902. }
  903. *config_changed = process_inotify_event(daemon, buf, len);
  904. }
  905. return 0;
  906. }
  907. static int setup_config(struct daemon *daemon)
  908. {
  909. if (daemon->base_user) {
  910. daemon->base = strdup(daemon->base_user);
  911. if (!daemon->base)
  912. return -ENOMEM;
  913. }
  914. if (daemon->config) {
  915. char *real = realpath(daemon->config, NULL);
  916. if (!real) {
  917. perror("failed: realpath");
  918. return -1;
  919. }
  920. daemon->config_real = real;
  921. return 0;
  922. }
  923. if (perf_config_system() && !access(perf_etc_perfconfig(), R_OK))
  924. daemon->config_real = strdup(perf_etc_perfconfig());
  925. else if (perf_config_global() && perf_home_perfconfig())
  926. daemon->config_real = strdup(perf_home_perfconfig());
  927. return daemon->config_real ? 0 : -1;
  928. }
  929. #ifndef F_TLOCK
  930. #define F_TLOCK 2
  931. static int lockf(int fd, int cmd, off_t len)
  932. {
  933. if (cmd != F_TLOCK || len != 0)
  934. return -1;
  935. return flock(fd, LOCK_EX | LOCK_NB);
  936. }
  937. #endif // F_TLOCK
  938. /*
  939. * Each daemon tries to create and lock BASE/lock file,
  940. * if it's successful we are sure we're the only daemon
  941. * running over the BASE.
  942. *
  943. * Once daemon is finished, file descriptor to lock file
  944. * is closed and lock is released.
  945. */
  946. static int check_lock(struct daemon *daemon)
  947. {
  948. char path[PATH_MAX];
  949. char buf[20];
  950. int fd, pid;
  951. ssize_t len;
  952. scnprintf(path, sizeof(path), "%s/lock", daemon->base);
  953. fd = open(path, O_RDWR|O_CREAT|O_CLOEXEC, 0640);
  954. if (fd < 0)
  955. return -1;
  956. if (lockf(fd, F_TLOCK, 0) < 0) {
  957. filename__read_int(path, &pid);
  958. fprintf(stderr, "failed: another perf daemon (pid %d) owns %s\n",
  959. pid, daemon->base);
  960. close(fd);
  961. return -1;
  962. }
  963. scnprintf(buf, sizeof(buf), "%d", getpid());
  964. len = strlen(buf);
  965. if (write(fd, buf, len) != len) {
  966. perror("failed: write");
  967. close(fd);
  968. return -1;
  969. }
  970. if (ftruncate(fd, len)) {
  971. perror("failed: ftruncate");
  972. close(fd);
  973. return -1;
  974. }
  975. return 0;
  976. }
  977. static int go_background(struct daemon *daemon)
  978. {
  979. int pid, fd;
  980. pid = fork();
  981. if (pid < 0)
  982. return -1;
  983. if (pid > 0)
  984. return 1;
  985. if (setsid() < 0)
  986. return -1;
  987. if (check_lock(daemon))
  988. return -1;
  989. umask(0);
  990. if (chdir(daemon->base)) {
  991. perror("failed: chdir");
  992. return -1;
  993. }
  994. fd = open("output", O_RDWR|O_CREAT|O_TRUNC, 0644);
  995. if (fd < 0) {
  996. perror("failed: open");
  997. return -1;
  998. }
  999. if (fcntl(fd, F_SETFD, FD_CLOEXEC)) {
  1000. perror("failed: fcntl FD_CLOEXEC");
  1001. close(fd);
  1002. return -1;
  1003. }
  1004. close(0);
  1005. dup2(fd, 1);
  1006. dup2(fd, 2);
  1007. close(fd);
  1008. daemon->out = fdopen(1, "w");
  1009. if (!daemon->out) {
  1010. close(1);
  1011. close(2);
  1012. return -1;
  1013. }
  1014. setbuf(daemon->out, NULL);
  1015. return 0;
  1016. }
  1017. static int setup_signalfd(struct daemon *daemon)
  1018. {
  1019. sigset_t mask;
  1020. sigemptyset(&mask);
  1021. sigaddset(&mask, SIGCHLD);
  1022. if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
  1023. return -1;
  1024. daemon->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
  1025. return daemon->signal_fd;
  1026. }
  1027. static int __cmd_start(struct daemon *daemon, struct option parent_options[],
  1028. int argc, const char **argv)
  1029. {
  1030. bool foreground = false;
  1031. struct option start_options[] = {
  1032. OPT_BOOLEAN('f', "foreground", &foreground, "stay on console"),
  1033. OPT_PARENT(parent_options),
  1034. OPT_END()
  1035. };
  1036. int sock_fd = -1, conf_fd = -1, signal_fd = -1;
  1037. int sock_pos, file_pos, signal_pos;
  1038. struct fdarray fda;
  1039. int err = 0;
  1040. argc = parse_options(argc, argv, start_options, daemon_usage, 0);
  1041. if (argc)
  1042. usage_with_options(daemon_usage, start_options);
  1043. daemon->start = time(NULL);
  1044. if (setup_config(daemon)) {
  1045. pr_err("failed: config not found\n");
  1046. return -1;
  1047. }
  1048. if (setup_server_config(daemon))
  1049. return -1;
  1050. if (foreground && check_lock(daemon))
  1051. return -1;
  1052. if (!foreground) {
  1053. err = go_background(daemon);
  1054. if (err) {
  1055. /* original process, exit normally */
  1056. if (err == 1)
  1057. err = 0;
  1058. daemon__exit(daemon);
  1059. return err;
  1060. }
  1061. }
  1062. debug_set_file(daemon->out);
  1063. debug_set_display_time(true);
  1064. pr_info("daemon started (pid %d)\n", getpid());
  1065. fdarray__init(&fda, 3);
  1066. sock_fd = setup_server_socket(daemon);
  1067. if (sock_fd < 0)
  1068. goto out;
  1069. conf_fd = setup_config_changes(daemon);
  1070. if (conf_fd < 0)
  1071. goto out;
  1072. signal_fd = setup_signalfd(daemon);
  1073. if (signal_fd < 0)
  1074. goto out;
  1075. sock_pos = fdarray__add(&fda, sock_fd, POLLIN|POLLERR|POLLHUP, 0);
  1076. if (sock_pos < 0)
  1077. goto out;
  1078. file_pos = fdarray__add(&fda, conf_fd, POLLIN|POLLERR|POLLHUP, 0);
  1079. if (file_pos < 0)
  1080. goto out;
  1081. signal_pos = fdarray__add(&fda, signal_fd, POLLIN|POLLERR|POLLHUP, 0);
  1082. if (signal_pos < 0)
  1083. goto out;
  1084. signal(SIGINT, sig_handler);
  1085. signal(SIGTERM, sig_handler);
  1086. signal(SIGPIPE, SIG_IGN);
  1087. while (!done && !err) {
  1088. err = daemon__reconfig(daemon);
  1089. if (!err && fdarray__poll(&fda, -1)) {
  1090. bool reconfig = false;
  1091. if (fda.entries[sock_pos].revents & POLLIN)
  1092. err = handle_server_socket(daemon, sock_fd);
  1093. if (fda.entries[file_pos].revents & POLLIN)
  1094. err = handle_config_changes(daemon, conf_fd, &reconfig);
  1095. if (fda.entries[signal_pos].revents & POLLIN)
  1096. err = handle_signalfd(daemon) < 0;
  1097. if (reconfig)
  1098. err = setup_server_config(daemon);
  1099. }
  1100. }
  1101. out:
  1102. fdarray__exit(&fda);
  1103. daemon__kill(daemon);
  1104. daemon__exit(daemon);
  1105. if (sock_fd != -1)
  1106. close(sock_fd);
  1107. if (conf_fd != -1)
  1108. close(conf_fd);
  1109. if (signal_fd != -1)
  1110. close(signal_fd);
  1111. pr_info("daemon exited\n");
  1112. fclose(daemon->out);
  1113. return err;
  1114. }
  1115. static int send_cmd(struct daemon *daemon, union cmd *cmd)
  1116. {
  1117. int ret = -1, fd;
  1118. char *line = NULL;
  1119. size_t len = 0;
  1120. ssize_t nread;
  1121. FILE *in = NULL;
  1122. if (setup_client_config(daemon))
  1123. return -1;
  1124. fd = setup_client_socket(daemon);
  1125. if (fd < 0)
  1126. return -1;
  1127. if (sizeof(*cmd) != writen(fd, cmd, sizeof(*cmd))) {
  1128. perror("failed: write");
  1129. goto out;
  1130. }
  1131. in = fdopen(fd, "r");
  1132. if (!in) {
  1133. perror("failed: fdopen");
  1134. goto out;
  1135. }
  1136. while ((nread = getline(&line, &len, in)) != -1) {
  1137. if (fwrite(line, nread, 1, stdout) != 1)
  1138. goto out_fclose;
  1139. fflush(stdout);
  1140. }
  1141. ret = 0;
  1142. out_fclose:
  1143. fclose(in);
  1144. free(line);
  1145. out:
  1146. /* If in is defined, then fd is closed via fclose. */
  1147. if (!in)
  1148. close(fd);
  1149. return ret;
  1150. }
  1151. static int send_cmd_list(struct daemon *daemon)
  1152. {
  1153. union cmd cmd;
  1154. memset(&cmd, 0, sizeof(cmd));
  1155. cmd.list.cmd = CMD_LIST;
  1156. cmd.list.verbose = verbose;
  1157. cmd.list.csv_sep = daemon->csv_sep ? *daemon->csv_sep : 0;
  1158. return send_cmd(daemon, &cmd);
  1159. }
  1160. static int __cmd_signal(struct daemon *daemon, struct option parent_options[],
  1161. int argc, const char **argv)
  1162. {
  1163. const char *name = "all";
  1164. struct option start_options[] = {
  1165. OPT_STRING(0, "session", &name, "session",
  1166. "Sent signal to specific session"),
  1167. OPT_PARENT(parent_options),
  1168. OPT_END()
  1169. };
  1170. union cmd cmd;
  1171. argc = parse_options(argc, argv, start_options, daemon_usage, 0);
  1172. if (argc)
  1173. usage_with_options(daemon_usage, start_options);
  1174. if (setup_config(daemon)) {
  1175. pr_err("failed: config not found\n");
  1176. return -1;
  1177. }
  1178. memset(&cmd, 0, sizeof(cmd));
  1179. cmd.signal.cmd = CMD_SIGNAL;
  1180. cmd.signal.sig = SIGUSR2;
  1181. strncpy(cmd.signal.name, name, sizeof(cmd.signal.name) - 1);
  1182. return send_cmd(daemon, &cmd);
  1183. }
  1184. static int __cmd_stop(struct daemon *daemon, struct option parent_options[],
  1185. int argc, const char **argv)
  1186. {
  1187. struct option start_options[] = {
  1188. OPT_PARENT(parent_options),
  1189. OPT_END()
  1190. };
  1191. union cmd cmd;
  1192. argc = parse_options(argc, argv, start_options, daemon_usage, 0);
  1193. if (argc)
  1194. usage_with_options(daemon_usage, start_options);
  1195. if (setup_config(daemon)) {
  1196. pr_err("failed: config not found\n");
  1197. return -1;
  1198. }
  1199. memset(&cmd, 0, sizeof(cmd));
  1200. cmd.cmd = CMD_STOP;
  1201. return send_cmd(daemon, &cmd);
  1202. }
  1203. static int __cmd_ping(struct daemon *daemon, struct option parent_options[],
  1204. int argc, const char **argv)
  1205. {
  1206. const char *name = "all";
  1207. struct option ping_options[] = {
  1208. OPT_STRING(0, "session", &name, "session",
  1209. "Ping to specific session"),
  1210. OPT_PARENT(parent_options),
  1211. OPT_END()
  1212. };
  1213. union cmd cmd;
  1214. argc = parse_options(argc, argv, ping_options, daemon_usage, 0);
  1215. if (argc)
  1216. usage_with_options(daemon_usage, ping_options);
  1217. if (setup_config(daemon)) {
  1218. pr_err("failed: config not found\n");
  1219. return -1;
  1220. }
  1221. memset(&cmd, 0, sizeof(cmd));
  1222. cmd.cmd = CMD_PING;
  1223. scnprintf(cmd.ping.name, sizeof(cmd.ping.name), "%s", name);
  1224. return send_cmd(daemon, &cmd);
  1225. }
  1226. static char *alloc_perf_exe_path(void)
  1227. {
  1228. char path[PATH_MAX];
  1229. perf_exe(path, sizeof(path));
  1230. return strdup(path);
  1231. }
  1232. int cmd_daemon(int argc, const char **argv)
  1233. {
  1234. struct option daemon_options[] = {
  1235. OPT_INCR('v', "verbose", &verbose, "be more verbose"),
  1236. OPT_STRING(0, "config", &__daemon.config,
  1237. "config file", "config file path"),
  1238. OPT_STRING(0, "base", &__daemon.base_user,
  1239. "directory", "base directory"),
  1240. OPT_STRING_OPTARG('x', "field-separator", &__daemon.csv_sep,
  1241. "field separator", "print counts with custom separator", ","),
  1242. OPT_END()
  1243. };
  1244. int ret = -1;
  1245. __daemon.perf = alloc_perf_exe_path();
  1246. if (!__daemon.perf)
  1247. return -ENOMEM;
  1248. __daemon.out = stdout;
  1249. argc = parse_options(argc, argv, daemon_options, daemon_usage,
  1250. PARSE_OPT_STOP_AT_NON_OPTION);
  1251. if (argc) {
  1252. if (!strcmp(argv[0], "start"))
  1253. ret = __cmd_start(&__daemon, daemon_options, argc, argv);
  1254. else if (!strcmp(argv[0], "signal"))
  1255. ret = __cmd_signal(&__daemon, daemon_options, argc, argv);
  1256. else if (!strcmp(argv[0], "stop"))
  1257. ret = __cmd_stop(&__daemon, daemon_options, argc, argv);
  1258. else if (!strcmp(argv[0], "ping"))
  1259. ret = __cmd_ping(&__daemon, daemon_options, argc, argv);
  1260. else
  1261. pr_err("failed: unknown command '%s'\n", argv[0]);
  1262. } else {
  1263. ret = setup_config(&__daemon);
  1264. if (ret)
  1265. pr_err("failed: config not found\n");
  1266. else
  1267. ret = send_cmd_list(&__daemon);
  1268. }
  1269. zfree(&__daemon.perf);
  1270. return ret;
  1271. }