:: Re: [DNG] libudev-compat documentat…
Top Page
Delete this message
Reply to this message
Author: aitor
Date:  
To: dng
Subject: Re: [DNG] libudev-compat documentation (Was: Remarks on vdev, Eudev, Mdev)
Hi again,

On 14/6/22 13:39, aitor wrote:
> Hi,
> On 11/6/22 14:07, aitor wrote:
>> I started documenting libudev-compat in my website as part of the documentation about vdev:
>> https://www.gnuinos.org/libudev-compat/  <https://www.gnuinos.org/libudev-compat/>
>> This documentation is a work in progress.
> Jude Nelson was wondering whether or not is possible to use `sendfile(2)`:
>     *ssize_t sendfile(int */out_fd/*, int */in_fd/*, off_t **/offset/*, size_t */count/*); *
> in the function:
>     static int udev_monitor_fs_push_event( int fd, struct udev_monitor* monitor );
> of the file:

>
> https://github.com/jcnelson/vdev/blob/master/libudev-compat/libudev-fs.c <https://github.com/jcnelson/vdev/blob/master/libudev-compat/libudev-fs.c>
>
> If you read his comment between the lines 759-771:
>
>
>     // send the contents of a file containing a serialized packet to the libudev client:
>     // * read the contents
>     // * send it along to the receiving struct udev_monitor
>     // NOTE: The file format is expected to be the same as a uevent packet:
>     //       * all newlines (\n) will be converted to null (\0), since that's how
>     //         the kernel sends it.
>     //       * the buffer is expected to be at most 8192 bytes long.
>     // return 0 on success
>     // return -errno on failure
>     // return -EMSGSIZE if the file is too big
>     // return -EBADMSG if the file is invalid
>     // return -EAGAIN if we'd block on send
>     // TODO: can we use sendfile(2)?

>
>
> The use of `sendfile` would imply to convert the function below (used by `udev_monitor_fs_push_event`):
>
>     // send udev_device along
>     // TODO: sendfile(2)?
>     rc = udev_monitor_send_device( monitor, NULL, dev );
>     if( rc < 0 ) {
>        log_error("udev_monitor_send_device rc = %d", rc );
>     }
>     else {
>        rc = 0;
>     }
> into something like this:
>     off_t offset = 0;

>
>    // send file descriptor
>    rc = sendfile( monitor->sock_fs, fd, &offset, BUFSIZ );
>    if( rc < 0 ) {
>
>       rc = -errno;
>       log_error("udev_monitor_send_device rc = %d", rc );
>    }
>    else {
>
>       rc = 0;
>    }
>
> Other modifications would be required in the receiver side, of course.
>
> According to the description in the Linux Man Page:
>
> https://man7.org/linux/man-pages/man2/sendfile.2.html <https://man7.org/linux/man-pages/man2/sendfile.2.html>
>
> *sendfile*() copies data between one file descriptor and another.
> Because this copying is done within the kernel,*sendfile*() is
> more efficient than the combination ofread(2) <https://man7.org/linux/man-pages/man2/read.2.html> andwrite(2) <https://man7.org/linux/man-pages/man2/write.2.html>,
> which would require transferring data to and from user space.
> Well, I've been trying to make such improvement in libudev-compat, and appearently it's working fine.
> So, I'll update my git repository soon.
> ... And again: if you catch some inaccuracy or glaring error in my documentation,
> please let me know and I'll update it.



I pushed the commit to gitea.devuan.dev, but now i'm stuck in how to integrate eventfs in libudev-compat.
I do understand how it works and the example given by Jude Nelson in the README.md file works for me. The
problem I have is related to the insufficient space if I mount eventfs within a tmpfs filesystem (whether
`/tmp/test` or `/dev/metadata/udev/events`), independently of the value given to `default_max_bytes` in
the config file of eventfs, to the point where I can't even receive a single uevent packet!

Any hints?

I think I'll make a brief pause here... :(

Thanks,

Aitor.