From: mwilck@suse.com
To: Keith Busch <kbusch@kernel.org>, linux-nvme@lists.infradead.org
Cc: Hannes Reinecke <hare@suse.de>,
Chaitanya Kulkarni <Chaitanya.Kulkarni@wdc.com>,
Martin Wilck <mwilck@suse.com>
Subject: [PATCH 04/35] monitor: add main loop for uevent monitoring
Date: Tue, 26 Jan 2021 21:32:53 +0100 [thread overview]
Message-ID: <20210126203324.23610-5-mwilck@suse.com> (raw)
In-Reply-To: <20210126203324.23610-1-mwilck@suse.com>
From: Martin Wilck <mwilck@suse.com>
Signed-off-by: Martin Wilck <mwilck@suse.com>
---
monitor.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 77 insertions(+), 1 deletion(-)
diff --git a/monitor.c b/monitor.c
index c7f4d85..63e26bc 100644
--- a/monitor.c
+++ b/monitor.c
@@ -17,15 +17,25 @@
#include <stddef.h>
#include <stdio.h>
+#include <unistd.h>
#include <errno.h>
#include <libudev.h>
#include <signal.h>
+#include <sys/epoll.h>
#include "nvme-status.h"
#include "monitor.h"
static struct udev *udev;
+static void close_ptr(int *p)
+{
+ if (*p != -1) {
+ close(*p);
+ *p = -1;
+ }
+}
+
static void cleanup_monitor(struct udev_monitor **pmon)
{
if (*pmon) {
@@ -87,6 +97,70 @@ static int monitor_init_signals(void)
return 0;
}
+static void monitor_handle_udevice(struct udev_device *ud)
+{
+ fprintf(stderr, "uevent: %s %s\n",
+ udev_device_get_action(ud),
+ udev_device_get_sysname(ud));
+}
+
+static void monitor_handle_uevents(struct udev_monitor *monitor)
+{
+ struct udev_device *ud;
+
+ for (ud = udev_monitor_receive_device(monitor);
+ ud;
+ ud = udev_monitor_receive_device(monitor)) {
+ monitor_handle_udevice(ud);
+ udev_device_unref(ud);
+ }
+}
+
+#define MAX_EVENTS 1
+static int monitor_main_loop(struct udev_monitor *monitor)
+{
+ int ep_fd __attribute__((cleanup(close_ptr))) = -1;
+ int ret;
+ struct epoll_event ep_ev = { .events = EPOLLIN, };
+ struct epoll_event events[MAX_EVENTS];
+ sigset_t ep_mask;
+
+ ep_fd = epoll_create1(0);
+ if (ep_fd == -1)
+ return -errno;
+ ep_ev.data.ptr = monitor;
+ ret = epoll_ctl(ep_fd, EPOLL_CTL_ADD,
+ udev_monitor_get_fd(monitor), &ep_ev);
+ if (ret == -1)
+ return -errno;
+
+ sigfillset(&ep_mask);
+ sigdelset(&ep_mask, SIGTERM);
+ sigdelset(&ep_mask, SIGINT);
+ while (1) {
+ int rc, i;
+
+ rc = epoll_pwait(ep_fd, events, MAX_EVENTS, -1, &ep_mask);
+ if (rc == -1 && errno == EINTR) {
+ fprintf(stderr, "monitor: exit signal received\n");
+ return 0;
+ } else if (rc == -1) {
+ fprintf(stderr, "monitor: epoll_wait: %m\n");
+ return -errno;
+ } else if (rc == 0 || rc > MAX_EVENTS) {
+ fprintf(stderr, "monitor: epoll_wait: unexpected rc=%d\n", rc);
+ continue;
+ }
+ for (i = 0; i < MAX_EVENTS; i++) {
+ if (events[i].data.ptr == monitor)
+ (void)monitor_handle_uevents(monitor);
+ else
+ fprintf(stderr, "monitor: unexpected event\n");
+ }
+ }
+ return ret;
+}
+
int aen_monitor(const char *desc, int argc, char **argv)
{
int ret;
@@ -98,8 +172,10 @@ int aen_monitor(const char *desc, int argc, char **argv)
goto out;
}
ret = create_udev_monitor(&monitor);
- if (ret == 0)
+ if (ret == 0) {
+ ret = monitor_main_loop(monitor);
udev_monitor_unref(monitor);
+ }
udev = udev_unref(udev);
out:
return nvme_status_to_errno(ret, true);
--
2.29.2
_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme
next prev parent reply other threads:[~2021-01-26 20:34 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-26 20:32 [PATCH 00/35] RFC: add "nvme monitor" subcommand mwilck
2021-01-26 20:32 ` [PATCH 01/35] nvme-monitor: add new stub mwilck
2021-01-26 20:32 ` [PATCH 02/35] monitor: create udev socket mwilck
2021-01-26 20:32 ` [PATCH 03/35] monitor: initialize signal handling mwilck
2021-01-26 20:32 ` mwilck [this message]
2021-01-26 20:32 ` [PATCH 05/35] monitor: add uevent filters mwilck
2021-02-04 6:58 ` Hannes Reinecke
2021-01-26 20:32 ` [PATCH 06/35] monitor: Create a log() macro mwilck
2021-02-04 7:01 ` Hannes Reinecke
2021-02-04 9:14 ` Martin Wilck
2021-01-26 20:32 ` [PATCH 07/35] fabrics: use " mwilck
2021-02-04 7:02 ` Hannes Reinecke
2021-01-26 20:32 ` [PATCH 08/35] monitor: add command line options to control logging mwilck
2021-02-04 7:04 ` Hannes Reinecke
2021-02-04 9:18 ` Martin Wilck
2021-01-26 20:32 ` [PATCH 09/35] nvme_get_ctrl_attr(): constify "path" argument mwilck
2021-02-04 7:05 ` Hannes Reinecke
2021-01-26 20:32 ` [PATCH 10/35] fabrics: export do_discover(), build_options() and config mwilck
2021-02-04 7:09 ` Hannes Reinecke
2021-02-04 9:21 ` Martin Wilck
2021-01-26 20:33 ` [PATCH 11/35] monitor: add option -A / --autoconnect mwilck
2021-01-29 18:59 ` Sagi Grimberg
2021-01-29 19:33 ` Martin Wilck
2021-01-29 20:09 ` Sagi Grimberg
2021-02-04 7:13 ` Hannes Reinecke
2021-01-26 20:33 ` [PATCH 12/35] monitor: add helpers for __attribute__((cleanup)) mwilck
2021-02-04 7:14 ` Hannes Reinecke
2021-01-26 20:33 ` [PATCH 13/35] monitor: disable nvmf-autoconnect udev rules in autoconnect mode mwilck
2021-01-29 1:52 ` Sagi Grimberg
2021-01-29 14:16 ` Martin Wilck
2021-01-29 18:54 ` Sagi Grimberg
2021-02-04 7:16 ` Hannes Reinecke
2021-02-04 9:37 ` Martin Wilck
2021-01-26 20:33 ` [PATCH 14/35] monitor: implement handling of fc_udev_device mwilck
2021-01-26 20:33 ` [PATCH 15/35] monitor: implement handling of nvme AEN events mwilck
2021-01-26 20:33 ` [PATCH 16/35] monitor: reset children's signal disposition mwilck
2021-01-29 1:54 ` Sagi Grimberg
2021-01-29 14:18 ` Martin Wilck
2021-01-26 20:33 ` [PATCH 17/35] monitor: handle SIGCHLD for terminated child processes mwilck
2021-01-29 1:54 ` Sagi Grimberg
2021-01-26 20:33 ` [PATCH 18/35] monitor: add "--persistent/-p" flag mwilck
2021-01-29 19:02 ` Sagi Grimberg
2021-01-29 19:45 ` Martin Wilck
2021-01-26 20:33 ` [PATCH 19/35] fabrics: use "const char *" in struct config mwilck
2021-02-04 7:20 ` Hannes Reinecke
2021-01-26 20:33 ` [PATCH 20/35] fabrics: export arg_str(), parse_conn_arg(), and remove_ctrl() mwilck
2021-01-26 20:33 ` [PATCH 21/35] nvme-cli: add "list.h" mwilck
2021-01-26 20:33 ` [PATCH 22/35] conn-db: add simple connection registry mwilck
2021-01-29 1:59 ` Sagi Grimberg
2021-01-29 14:18 ` Martin Wilck
2021-01-26 20:33 ` [PATCH 23/35] monitor: handle restart of pending discoveries mwilck
2021-01-26 20:33 ` [PATCH 24/35] monitor: monitor_discovery(): try to reuse existing controllers mwilck
2021-01-26 20:33 ` [PATCH 25/35] monitor: read existing connections on startup mwilck
2021-01-26 20:33 ` [PATCH 26/35] monitor: implement starting discovery controllers " mwilck
2021-01-29 21:06 ` Sagi Grimberg
2021-01-29 21:13 ` Martin Wilck
2021-01-29 21:18 ` Sagi Grimberg
2021-01-26 20:33 ` [PATCH 27/35] monitor: implement cleanup of created discovery controllers mwilck
2021-01-26 20:33 ` [PATCH 28/35] monitor: basic handling of add/remove uevents for nvme controllers mwilck
2021-01-26 20:33 ` [PATCH 29/35] monitor: kill running discovery tasks on exit mwilck
2021-01-26 20:33 ` [PATCH 30/35] monitor: add connection property options from connect-all mwilck
2021-01-26 20:33 ` [PATCH 31/35] completions: add completions for nvme monitor mwilck
2021-01-26 20:33 ` [PATCH 32/35] nvmf-autoconnect: add unit file for nvme-monitor.service mwilck
2021-01-29 19:08 ` Sagi Grimberg
2021-01-29 19:50 ` Martin Wilck
2021-01-26 20:33 ` [PATCH 33/35] nvme-connect-all(1): fix documentation for --quiet/-S mwilck
2021-01-29 19:09 ` Sagi Grimberg
2021-01-26 20:33 ` [PATCH 34/35] nvme-monitor(1): add man page for nvme-monitor mwilck
2021-01-26 20:33 ` [PATCH 35/35] monitor: add option --keep/-K mwilck
2021-01-29 19:10 ` Sagi Grimberg
2021-01-29 19:53 ` Martin Wilck
2021-01-29 20:16 ` Sagi Grimberg
2021-01-29 20:30 ` Martin Wilck
2021-01-29 20:45 ` Sagi Grimberg
2021-01-29 20:51 ` Martin Wilck
2021-01-29 20:57 ` Sagi Grimberg
2021-01-29 21:05 ` Martin Wilck
2021-01-29 21:11 ` Sagi Grimberg
2021-01-29 21:15 ` Martin Wilck
2021-01-29 21:21 ` Sagi Grimberg
2021-02-04 7:34 ` Hannes Reinecke
2021-02-04 9:41 ` Martin Wilck
2021-01-29 1:14 ` [PATCH 00/35] RFC: add "nvme monitor" subcommand Sagi Grimberg
2021-01-29 11:18 ` Martin Wilck
2021-01-29 20:08 ` Sagi Grimberg
2021-01-29 20:27 ` Martin Wilck
2021-02-04 7:52 ` Hannes Reinecke
2021-02-22 19:02 ` Enzo Matsumiya
2021-02-22 21:05 ` Martin Wilck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210126203324.23610-5-mwilck@suse.com \
--to=mwilck@suse.com \
--cc=Chaitanya.Kulkarni@wdc.com \
--cc=hare@suse.de \
--cc=kbusch@kernel.org \
--cc=linux-nvme@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox