chiark / gitweb /
swap: listen for POLLPRI events on /proc/swaps if available
[elogind.git] / src / swap.c
index 487b18350a21cfcf4276eacfe008efbec3ffc254..cf9644fc69a860e0658e33c10ab8d0410ef13e5c 100644 (file)
@@ -1056,16 +1056,23 @@ static int swap_load_proc_swaps(Manager *m, bool set_flags) {
 }
 
 int swap_dispatch_reload(Manager *m) {
-        Meta *meta;
-        int r;
-
-        assert(m);
+        /* This function should go as soon as the kernel properly notifies us */
 
         if (_likely_(!m->request_reload))
                 return 0;
 
         m->request_reload = false;
 
+        return swap_fd_event(m, EPOLLPRI);
+}
+
+int swap_fd_event(Manager *m, int events) {
+        Meta *meta;
+        int r;
+
+        assert(m);
+        assert(events & EPOLLPRI);
+
         if ((r == swap_load_proc_swaps(m, true)) < 0) {
                 log_error("Failed to reread /proc/swaps: %s", strerror(-r));
 
@@ -1169,12 +1176,24 @@ static void swap_shutdown(Manager *m) {
 
 static int swap_enumerate(Manager *m) {
         int r;
+        struct epoll_event ev;
         assert(m);
 
-        if (!m->proc_swaps)
+        if (!m->proc_swaps) {
                 if (!(m->proc_swaps = fopen("/proc/swaps", "re")))
                         return -errno;
 
+                m->swap_watch.type = WATCH_SWAP;
+                m->swap_watch.fd = fileno(m->proc_swaps);
+
+                zero(ev);
+                ev.events = EPOLLPRI;
+                ev.data.ptr = &m->swap_watch;
+
+                if (epoll_ctl(m->epoll_fd, EPOLL_CTL_ADD, m->swap_watch.fd, &ev) < 0)
+                        return -errno;
+        }
+
         /* We rely on mount.c to load /etc/fstab for us */
 
         if ((r = swap_load_proc_swaps(m, false)) < 0)