NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/55663 (Support for EVFILT_USER in kqueue(2))
The following reply was made to PR kern/55663; it has been noted by GNATS.
From: Ruslan Nikolaev <nruslan_devel%yahoo.com@localhost>
To: gnats-bugs%netbsd.org@localhost, jnemeth%netbsd.org@localhost, kern-bug-people%netbsd.org@localhost,
netbsd-bugs%netbsd.org@localhost, gnats-admin%netbsd.org@localhost
Cc:
Subject: Re: kern/55663 (Support for EVFILT_USER in kqueue(2))
Date: Tue, 20 Oct 2020 17:21:29 -0400
[I am re-sending the email, the previous message was corrupted by the
email client ]
I greatly apologize for the delay. Recently, I had so many things to do...
Please keep in mind that my understanding may be incomplete since I have
not really introduced this feature, I just ported it from
FreeBSD/OpenBSD. In fact, I have far more experience with epoll() rather
than kqueue(). So, let me start the discussion with the motivation
first, and then we can go to specific technical details (in a separate
email which I will try to prepare next as needed).
1. Why is it needed?
Quite a few applications use it. To be specific, please consider Nginx.
Although, it *does* compile under NetBSD, several critical features are
missing without EVFILT_USER.
Take a look at
https://nginx.googlesource.com/nginx/+/refs/heads/master/src/core/ngx_thread_pool.c:
static ngx_int_t
ngx_thread_pool_init_worker(ngx_cycle_t *cycle)
{
...
   if (ngx_notify_init == NULL || ngx_notify == NULL) {
       ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
              "the configured event method cannot be used with thread
pools");
       return NGX_ERROR;
   }
...
Note that if ngx_notify is *NOT* initialized to some function, Nginx
will not support the thread pool mode, which is arguably a very
important Nginx feature that boosts performance greatly!
So, where is this function initialized? For kqueue, Nginx provides
https://nginx.googlesource.com/nginx/+/refs/heads/master/src/event/modules/ngx_kqueue_module.c
Note these lines:
static ngx_event_module_t ngx_kqueue_module_ctx = {
...
       NULL,                             /* delete an connection */
#ifdef EVFILT_USER
       ngx_kqueue_notify_init,           /* init a notify */
       ngx_kqueue_notify,                /* trigger a notify */
       NULL,                             /* close a notify */
#else
       NULL,                             /* init a notify */
       NULL,                             /* trigger a notify */
       NULL,                             /* close a notify */
#endif
...
So, in other words, Nginx compiles and runs but lacks the thread pool
support, which is an important feature. I am not saying that they could
not have implemented it differently, but quite a few applications just
assume you have EVFILT_USER and do not provide any good fallback.
If we can just implement EVFILT_USER as in FreeBSD (regardless of its
merits), that would take care of those cases completely.
As another example, see the bug report for mySQL:
http://gnats.netbsd.org/54627
Without EVFILT_USER, it will even have uninitialized data
2. Regarding the EVFILT_USER itself, the FreeBSD man page says the
following:
EVFILT_USERÂ Â Â Â Â Establishes a user event identified by ident which is
                not associated with any kernel mechanism but is trig-
                gered by user level code. The lower 24 bits of the
                fflags may be used for user defined flags and manipu-
                lated using the following:
                NOTE_FFNOP         Ignore the input fflags.
                NOTE_FFAND         Bitwise AND fflags.
                NOTE_FFOR          Bitwise OR fflags.
                NOTE_FFCOPY        Copy fflags.
                NOTE_FFCTRLMASK    Control mask for fflags.
                NOTE_FFLAGSMASK    User defined flag mask for
                                    fflags.
                A user event is triggered for output with the follow-
                ing:
                NOTE_TRIGGER       Cause the event to be triggered.
                On return, fflags contains the users defined flags in
                the lower 24 bits.
Please let me know if EVFILT_USER may sound interesting for NetBSD. If
so, I can try to recollect technical details (it has been really a
while). But for the most part it was based on OpenBSD's patch (with some
adaptations for NetBSD):
https://www.mail-archive.com/tech%openbsd.org@localhost/msg42433.html
Thanks,
Ruslan
Home |
Main Index |
Thread Index |
Old Index