diff options
author | Alan Jenkins <alan-jenkins@tuffmail.co.uk> | 2009-05-21 22:22:37 +0200 |
---|---|---|
committer | Kay Sievers <kay.sievers@vrfy.org> | 2009-05-21 22:22:37 +0200 |
commit | f503f6b22fa54d1a65156a51d8b3311190c73ae5 (patch) | |
tree | 5003144371ce463fe5ba2387b9777cd8cddd24ad /udev/lib/libudev-private.h | |
parent | f9b3f88f71f5bdfb18aa4bfba00d72fa41fdf286 (diff) |
udevd: implement a more efficient queue file format
Directory lookups show up in profiling. The queue files are responsible
for a large proportion of file-related system calls in udev coldplug.
Instead of creating a file for each event, append their details to a
log file. The file is periodically rebuilt (garbage-collected) to
prevent it from growing indefinitely.
This single queue file replaces both the queue directory and the
uevent_seqnum file. On desktop systems the file tends not to grow
beyond one page. So it should also save a small amount of memory in
tmpfs.
Tests on a running EeePC indicate average savings of 5% *udevd* cpu time
as measured by oprofile. __link_path_walk is reduced from 1.5% to
1.3%. It is not completely clear where the rest of the gains come from.
In tests running ~400 events, the queue file is rebuilt about 5 times.
Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
Diffstat (limited to 'udev/lib/libudev-private.h')
-rw-r--r-- | udev/lib/libudev-private.h | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/udev/lib/libudev-private.h b/udev/lib/libudev-private.h index 9ec5e1aae2..3eb3d7957f 100644 --- a/udev/lib/libudev-private.h +++ b/udev/lib/libudev-private.h @@ -150,10 +150,18 @@ void udev_list_entry_set_flag(struct udev_list_entry *list_entry, int flag); entry = tmp, tmp = udev_list_entry_get_next(tmp)) /* libudev-queue */ -int udev_queue_export_udev_seqnum(struct udev_queue *udev_queue, unsigned long long int seqnum); -int udev_queue_export_device_queued(struct udev_queue *udev_queue, struct udev_device *udev_device); -int udev_queue_export_device_finished(struct udev_queue *udev_queue, struct udev_device *udev_device); -int udev_queue_export_device_failed(struct udev_queue *udev_queue, struct udev_device *udev_device); +unsigned long long int udev_get_kernel_seqnum(struct udev *udev); +int udev_queue_read_seqnum(FILE *queue_file, unsigned long long int *seqnum); +ssize_t udev_queue_read_devpath(FILE *queue_file, char *devpath, size_t size); +ssize_t udev_queue_skip_devpath(FILE *queue_file); + +/* libudev-queue-export */ +struct udev_queue_export *udev_queue_export_new(struct udev *udev); +void udev_queue_export_unref(struct udev_queue_export *udev_queue_export); +void udev_queue_export_cleanup(struct udev_queue_export *udev_queue_export); +int udev_queue_export_device_queued(struct udev_queue_export *udev_queue_export, struct udev_device *udev_device); +int udev_queue_export_device_finished(struct udev_queue_export *udev_queue_export, struct udev_device *udev_device); +int udev_queue_export_device_failed(struct udev_queue_export *udev_queue_export, struct udev_device *udev_device); /* libudev-utils */ #define UTIL_PATH_SIZE 1024 |