[systemd-devel] [PATCH 2/2] path: do not watch IN_ATTRIB for parent directories

Michal Schmidt mschmidt at redhat.com
Wed Dec 1 06:39:58 PST 2010


While testing with lots (~20000) of fake block devices with scsi_debug, I found
that systemd was quite slow at processing the udev events. The queue of the
udev monitor netlink socket grew to several megabytes.
The queue length can be observed with:
  watch "grep -E '^(\S+\s+){2}1\s+' /proc/net/netlink"

strace showed that apart from processing the events from netlink as expected,
systemd was also spending a lot of time re-setting its inotify watches:

  epoll_wait(4, {{EPOLLIN, {u32=13412248, u64=13412248}}}, 1, 4294967295) = 1
  ioctl(17, FIONREAD, [2048])             = 0
  read(17, "\3\0\0\0\4\0\0\0\0\0\0\0\20\0\0\0sg279\0\0\0\0\0\0\0\0\0\0\0"..., 2048) = 2048
  open("/dev/.systemd/ask-password", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 18
  getdents(18, /* 2 entries */, 32768)    = 48
  getdents(18, /* 0 entries */, 32768)    = 0
  close(18)                               = 0
  epoll_ctl(4, EPOLL_CTL_DEL, 17, NULL)   = 0
  close(17)                               = 0
  inotify_init1(O_NONBLOCK|O_CLOEXEC)     = 17
  epoll_ctl(4, EPOLL_CTL_ADD, 17, {EPOLLIN, {u32=13412248, u64=13412248}}) = 0
  inotify_add_watch(17, "/dev/.systemd/ask-password", IN_ATTRIB|IN_MOVED_TO|IN_CREATE|IN_DELETE_SELF|IN_MOVE_SELF) = 1
  inotify_add_watch(17, "/dev/.systemd", IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 2
  inotify_add_watch(17, "/dev", IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 3
  inotify_add_watch(17, "/", IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 4

The reason for this activity is that systemd receives inotify notifications for
the /dev directory as udev creates the new device nodes there.

But why should systemd be interested in these events?
Should /dev/.systemd go away, an IN_DELETE_SELF|IN_MOVE_SELF watch on it
ought to be fully sufficient for systemd to take note of the event. IN_ATTRIB
seems to be an overkill.

IN_ATTRIB was added in commit 782195a3c31a79428874a32e0264c0aa97a664f7:
  Author: Lennart Poettering <lennart at poettering.net>
  Date:   Mon Nov 15 00:47:29 2010 +0100

    path: always look for IN_ATTRIB since deletion is signalled that way

But I do not understand what deletion is the description referring to.
---

 src/path.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/src/path.c b/src/path.c
index 77de32d..e1ec33b 100644
--- a/src/path.c
+++ b/src/path.c
@@ -223,7 +223,7 @@ static int path_watch_one(Path *p, PathSpec *s) {
                 /* Trim the path at the last slash. Keep the slash if it's the root dir. */
                 slash[slash == k] = 0;
 
-                flags = IN_DELETE_SELF|IN_MOVE_SELF|IN_ATTRIB;
+                flags = IN_DELETE_SELF|IN_MOVE_SELF;
                 if (!exists)
                         flags |= IN_CREATE | IN_MOVED_TO;
 



More information about the systemd-devel mailing list