Re: [PATCH v5 2/4] man/man5/tunables.conf: Document system-wide tunables config

Alejandro Colomar <[email protected]>
Newsgroups org.kernel.vger.linux-man
Message-ID <anUiQua2QnWnzBeR@devuan>
> Date: 2026-08-07 02:07:00+0200
> From: Alejandro Colomar <[email protected]>
>
> Hi DJ,
> 
> > Date: 2026-08-06 18:15:15-0400
> > From: DJ Delorie <[email protected]>
> >
> > Alejandro Colomar <[email protected]> writes:
> > > You forgot to sign.
> > 
> > I will never remember that... :-P
> > 
> > >> +The resulting data is read when a new process is created by
> > >> +.IR ld.so .
> > >
> > > Sorry for noticing this in v4; I forgot about it.  I see this unresolved
> > > issue from earlier versions remains.
> > 
> > A program is a file on disk.  A process is a running memory image.
> 
> Yup.  fork(3) creates a process (produces a new PID).  execve(2)
> replaces the image of the current process with a program read from disk
> (or in short, executes a program in the current process).
> 
> > 
> > Neither fork() nor exec() cause the tunables to be loaded, the process
> > itself has to do that.  For dynamic ELF programs/processes built with
> > glibc, ld.so does it before it passes control to the ELF image.  There
> > are other types of programs/processes that do not use ld.so and thus do
> > not read the tunables cache (which is called "ld.so.cache" for a reason ;-)
> 
> Hmmmmm, let's say you call execve(2) several times without any fork(2)s.
> Assuming a that the program paths that you pass to execve(2) are all
> dynamic ELF programs built with glibc, I guess for every time you call
> execve(2), ld.so(8) will be run, and the tunables stored in ld.so.cache
> will be used.  Is this correct?
> 
> 	#include <unistd.h>
> 	int
> 	main(int, char *argv[])
> 	{
> 		sleep(1);
> 		execve("proc/self/exe", argv, NULL);
> 	}

Oh, I thought this would work as a recursive infinite-loop program.  It
doesn't seem to work.  I guess there's some race condition?  :D

	alx@devuan:~$ cd tmp/
	alx@devuan:~/tmp$ cat ex.c 
	#include <unistd.h>
	int
	main(int, char *argv[])
	{
		sleep(1);
		execve("proc/self/exe", argv, NULL);
	}

	alx@devuan:~/tmp$ gcc -Wall -Wextra ex.c 
	alx@devuan:~/tmp$ time ./a.out 

	real	0m1.003s
	user	0m0.003s
	sys	0m0.000s


Cheers,
Alex

> 
> Let's also say you fork(2) several times, without any execve(2) calls.
> I suppose that won't trigger any of this, right?
> 
> 	#include <unistd.h>
> 	int
> 	main(void)
> 	{
> 		for (int i = 0; i < 10; i++) {
> 			sleep(1);
> 			fork();
> 		}
> 	}
> 
> From my understanding, only the first program will trigger this more
> than once, right?
> 
> If so, I'd use the same wording that execve(2) uses:
> 
> 	execve() executes the program referred to by path.
> 
> That is, execve(2) executes programs, and ld.so.cache is read when
> a program is executed (in the current process).
> 
> > 
> > I don't know how to say this clearly with fewer words...
> > 
> > >> +The syntax allows lines to start with the keyword
> > >> +.I include
> > >
> > > s/I/B/  (since it's a literal, not a variable)
> > 
> > Fixed.
> > 
> 
> 
> Cheers,
> Alex
> 
> -- 
> <https://www.alejandro-colomar.es>



-- 
<https://www.alejandro-colomar.es>
signature.asc (application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEES7Jt9u9GbmlWADAi64mZXMKQwqkFAmp1IpUACgkQ64mZXMKQ
wqmbxQ/5Ad14PLRpjlrq1h8DOMiD63kuFQ+PLX9UaMNZ525rzRFEDyX9PXX3Wxjr
+z2IS6afCfYIxfBMWHfDi5YgP/E/Cls5qzQAwMwoHMT8CRfIsKtF4pYByaIWsVn1
rPsyIHSIGpKBaAL8GwOZwZPE4sK/A1KEhJriw20vWypIcKrLYXQzmkfqwEBWqYpd
D29iV6xd2I4809Z5IGpcKfpW8WA4v6EvbFEAtSY8z2PCUm2M+lg+UYB/UEa6joao
N5ZB8XarPruUiinL/Gc+z7G3hLafo3Zk3Ly5V8EuZGYdPV6EdOP5h6bt5LA5r2SH
P2Kue3/EClBCiNeXuCqkoKd7TMPo8JkMP70w2HLpwbY0hdmax2S2wQWUEWtovqol
M1A9Zj4MjcKeKCbccmyBBhD1bOTpwJDe6uIMOryVzSAKU5xYSSi9c7LXZu/sm7P3
NpUjqOZ2XzxxNIW5g+EqwJCTa3tBThOBVPraqT7US8yIrtuL+9S1nqV1fTs1dh/I
C2K2aTR5Diq3S2mpmgOw29jmodxc3Q3063OcU+jiIcTzBXVkDzy5DB9lwoBsUgoD
NQWqPoiCOZgUBGG4zvgdeRpJh/MbPS+fDeIX0+ax2HuSlONum4Wyf8qPRw9DWeSO
O2UZaonKfzfjoz5vIX3A9jG7TgJW0egAUXgCVAZmRqGiq0Hvzvs=
=IfPr
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.