Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 3 Oct 2016 12:48:03 -0500
From:      Eric Badger <badger@FreeBSD.org>
To:        freebsd-hackers@freebsd.org
Cc:        wjw@digiware.nl
Subject:   Re: Kqueue and threading
Message-ID:  <4209b8d4-6674-a51d-dceb-81c3ecd179c2@FreeBSD.org>
In-Reply-To: <111e0c35-7a4b-b6c7-ef1d-1a0d85112e61@digiware.nl>
References:  <111e0c35-7a4b-b6c7-ef1d-1a0d85112e61@digiware.nl>

next in thread | previous in thread | raw e-mail | index | archive | help
This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--3D4nSlAjJQtbUB3ovR0IQ2RN0FjcQx52D
Content-Type: multipart/mixed; boundary="NJmlvC3pRPsoUetngw9qSPsiTUs965LJ9";
 protected-headers="v1"
From: Eric Badger <badger@FreeBSD.org>
To: freebsd-hackers@freebsd.org
Cc: wjw@digiware.nl
Message-ID: <4209b8d4-6674-a51d-dceb-81c3ecd179c2@FreeBSD.org>
Subject: Re: Kqueue and threading
References: <111e0c35-7a4b-b6c7-ef1d-1a0d85112e61@digiware.nl>
In-Reply-To: <111e0c35-7a4b-b6c7-ef1d-1a0d85112e61@digiware.nl>

--NJmlvC3pRPsoUetngw9qSPsiTUs965LJ9
Content-Type: text/plain; charset=windows-1252
Content-Transfer-Encoding: quoted-printable

On 10/01/2016 13:02, Willem Jan Withagen wrote:
> Hi,
>
> Ceph uses a lot of threading, and for any part of it communication it
> uses epoll(), which FreeBSD does not use. For that there was already a
> EvenKqueue implementation.
>
> But I think I'm now running into:
>      The kqueue() system call creates a new kernel event queue and
>      returns a descriptor.  The queue is not inherited by a child
>      created with fork(2). However, if rfork(2) is called without the
>      RFFDG flag, then the descriptor table is shared, which will allow
>      sharing of the kqueue between two processes.
>
> Kqueue descriptors are created and events are added, but then the
> process starts other threads and expects the kqueue-id to be valid ther=
e.
>
> However adding more events returns an error, also waiting on the ID for=

> events to happen returns an error (descriptor invalid)
>
> Threading is done with 2 different constructions:
> 	std::thread
> and 	creating Workers
>
> Would any of these qualify with the quoted warning? and invalidate the
> descriptor table?
>
> If not, how can I (easily) debug the reason why my descriptors go inval=
id?
>

Sharing a kqueue between threads of a process works. Are the workers
created  using rfork without RFFDG as suggested in the manpage? I've
never had reason to do this, but a quick test seems to indicate that it
works as advertised. A normal fork closes the kqueue file descriptor. If
you suspect that's what's happening, you might run "procstat -f {worker
pid}" to see if file descriptors with a "k" (kqueue) in the "T" (type)
column appear (if not, they were presumably closed on the fork).

Eric


--NJmlvC3pRPsoUetngw9qSPsiTUs965LJ9--

--3D4nSlAjJQtbUB3ovR0IQ2RN0FjcQx52D
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQGQBAEBCgB6BQJX8pnfXxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25zLm9w
ZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXQzQTlFODAxM0JDQTdDOTQ1ODI1Mzc3NTk2
MkU1MDA5NjVBM0YyNEFDExxiYWRnZXJAZnJlZWJzZC5vcmcACgkQYuUAllo/JKzc
cQgA3/9zl9I4TZDdn+Gljbt7w/q/g0tiDoJudqogcNaR0cIwIl91dUh5KuchcuHd
EdEwsVDoWoNDlESLdGpDo4dHnifVT1ax9tQKt4pdRwFd8/eg5GYvekZa3AnWTCFX
m7VDE9osJpMKROoh+moLqufmkegH9iXtcsPRhpOExtou4zX9kZ8D6znmzn1DlMRS
csO5ym8qxWl6Aeh2FRqoYwnezZw3qA0bYS+Rd0W2UyA8p8VF1eEAqXqNoAyW+DQ0
U6mv1LKcOsp1aDAVlVeuqJ/sQl25c53QjuFx0rLVJSiSO7haswCy9CBEUTIZBGiW
PGJJr6SycNN6SgX2cZRu9SyzWA==
=Q9ht
-----END PGP SIGNATURE-----

--3D4nSlAjJQtbUB3ovR0IQ2RN0FjcQx52D--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4209b8d4-6674-a51d-dceb-81c3ecd179c2>