glibc/manual
Adhemerval Zanella 06ab719d30 Fix Linux fcntl OFD locks for non-LFS architectures (BZ#20251)
This patch fixes the OFD ("file private") locks for architectures that
support non-LFS flock definition (__USE_FILE_OFFSET64 not defined). The
issue in this case is both F_OFD_{GETLK,SETLK,SETLKW} and
F_{SET,GET}L{W}K64 expects a flock64 argument and when using old
F_OFD_* flags with a non LFS flock argument the kernel might interpret
the underlying data wrongly.  Kernel idea originally was to avoid using
such flags in non-LFS syscall, but since GLIBC uses fcntl with LFS
semantic as default it is possible to provide the functionality and
avoid the bogus struct kernel passing by adjusting the struct manually
for the required flags.

The idea follows other LFS interfaces that provide two symbols:

  1. A new LFS fcntl64 is added on default ABI with the usual macros to
     select it for FILE_OFFSET_BITS=64.

  2. The Linux non-LFS fcntl use a stack allocated struct flock64 for
     F_OFD_{GETLK,SETLK,SETLKW} copy the results on the user provided
     struct.

  3. Keep a compat symbol with old broken semantic for architectures
     that do not define __OFF_T_MATCHES_OFF64_T.

So for architectures which defines __USE_FILE_OFFSET64, fcntl64 will
aliased to fcntl and no adjustment would be required.  So to actually
use F_OFD_* with LFS support the source must be built with LFS support
(_FILE_OFFSET_BITS=64).

Also F_OFD_SETLKW command is handled a cancellation point, as for
F_SETLKW{64}.

Checked on x86_64-linux-gnu and i686-linux-gnu.

	[BZ #20251]
	* NEWS: Mention fcntl64 addition.
	* csu/check_fds.c: Replace __fcntl_nocancel by __fcntl64_nocancel.
	* login/utmp_file.c: Likewise.
	* sysdeps/posix/fdopendir.c: Likewise.
	* sysdeps/posix/opendir.c: Likewise.
	* sysdeps/unix/pt-fcntl.c: Likewise.
	* include/fcntl.h (__libc_fcntl64, __fcntl64,
	__fcntl64_nocancel_adjusted): New prototype.
	(__fcntl_nocancel_adjusted): Remove prototype.
	* io/Makefile (routines): Add fcntl64.
	(CFLAGS-fcntl64.c): New rule.
	* io/Versions [GLIBC_2.28] (fcntl64): New symbol.
	[GLIBC_PRIVATE] (__libc_fcntl): Rename to __libc_fcntl64.
	* io/fcntl.h (fcntl64): Add prototype and redirect if
	__USE_FILE_OFFSET64 is defined.
	* io/fcntl64.c: New file.
	* manual/llio.text: Add a note for which commands fcntl acts a
	cancellation point.
	* nptl/Makefile (CFLAGS-fcntl64.c): New rule.
	* sysdeps/mach/hurd/fcntl.c: Alias fcntl to fcntl64 symbols.
	* sysdeps/mach/hurd/i386/libc.abilist [GLIBC_2.28] (fcntl, fcntl64):
	New symbols.
	* sysdeps/unix/sysv/linux/fcntl.c (__libc_fcntl): Fix F_GETLK64,
	F_OFD_GETLK, F_SETLK64, F_SETLKW64, F_OFD_SETLK, and F_OFD_SETLKW for
	non-LFS case.
	* sysdeps/unix/sysv/linux/fcntl64.c: New file.
	* sysdeps/unix/sysv/linux/fcntl_nocancel.c (__fcntl_nocancel): Rename
	to __fcntl64_nocancel.
	(__fcntl_nocancel_adjusted): Rename to __fcntl64_nocancel_adjusted.
	* sysdeps/unix/sysv/linux/not-cancel.h (__fcntl_nocancel): Rename
	to __fcntl64_nocancel.
	* sysdeps/unix/sysv/linux/tst-ofdlocks.c: New file.
	* sysdeps/unix/sysv/linux/tst-ofdlocks-compat.c: Likewise.
	* sysdeps/unix/sysv/linux/Makefile (tests): Add tst-ofdlocks.
	(tests-internal): Add tst-ofdlocks-compat.
	* sysdeps/unix/sysv/linux/aarch64/libc.abilist [GLIBC_2.28]
	(fcntl64): New symbol.
	* sysdeps/unix/sysv/linux/alpha/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/ia64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist: Likewise.
	* sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/64/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/arm/libc.abilist [GLIBC_2.28] (fcntl,
	fcntl64): Likewise.
	* sysdeps/unix/sysv/linux/hppa/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/i386/libc.abilis: Likewise.
	* sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/microblaze/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/nios2/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sh/libc.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist: Likewise.
2018-06-26 13:22:53 -03:00
..
examples manual: Various fixes to the mbstouwcs example, and mbrtowc update 2018-04-05 12:52:19 +02:00
argp.texi manual: Complete @standards in argp.texi. 2017-06-16 01:19:30 -07:00
arith.texi Add narrowing divide functions. 2018-05-17 00:40:52 +00:00
charset.texi Fix missing @ before texinfo command 2018-04-06 08:56:24 +02:00
check-safety.sh Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
conf.texi manual/conf.texi: add a missing underscore in front of SC_SSIZE_MAX [BZ #22588] 2017-12-12 00:11:29 +01:00
contrib.texi Remove tilegx port. 2018-04-27 19:11:24 +00:00
creature.texi manual: Update _DEFAULT_SOURCE. [BZ #22862] 2018-02-21 02:38:42 -08:00
crypt.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
ctype.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
debug.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
dir .. 2005-11-21 15:45:19 +00:00
errno.texi Fix errno values 2018-03-20 03:10:57 +01:00
fdl-1.3.texi BZ#13738: Switch manual to FDL 1.3. 2012-02-24 12:58:10 -08:00
filesys.texi manual: Improve documentation of get_current_dir_name. [BZ #6889] 2018-02-19 01:59:52 -08:00
freemanuals.texi Update to canonical freemanuals.texi file. 2013-09-24 14:06:56 -07:00
getopt.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
header.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
install-plain.texi BZ #15941: Fix INSTALL file regeneration failure with makeinfo 5.x 2013-12-05 09:58:20 +05:30
install.texi Document use of CC and CFLAGS in more detail (bug 20980, bug 21234). 2018-02-15 23:48:47 +00:00
intro.texi manual: fix typo in the introduction 2016-05-19 23:22:59 -04:00
io.texi Clean up glibc manual references to "GNU system" (bug 6911). 2012-03-08 01:27:38 +00:00
ipc.texi manual/ipc.texi: Fix AC-safety notes. 2014-04-08 17:12:15 -04:00
job.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
lang.texi manual: Rewrite the section on widths of integer types. 2017-08-10 20:28:28 -07:00
lgpl-2.1.texi Use canonical FSF .texi files for LGPL and FDL texts. 2011-06-06 16:16:55 -07:00
libc-texinfo.sh Remove add-ons mechanism. 2017-10-05 15:58:13 +00:00
libc.texinfo Update copyright dates not handled by scripts/update-copyrights. 2018-01-01 00:41:16 +00:00
libcbook.texi initial import 1995-02-18 01:27:10 +00:00
libdl.texi * manual/libdl.texi: New. 2014-01-31 23:23:59 -02:00
libm-err-tab.pl Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
llio.texi Fix Linux fcntl OFD locks for non-LFS architectures (BZ#20251) 2018-06-26 13:22:53 -03:00
locale.texi manual: Touch up documentation for strftime and ALTMON_* constants. 2018-01-22 19:36:51 -08:00
macros.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
maint.texi Remove add-ons mechanism. 2017-10-05 15:58:13 +00:00
Makefile Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
math.texi Skeleton documentation for the RISC-V port 2018-01-29 10:22:26 -08:00
memory.texi Run thread shutdown functions in an explicit order 2018-06-26 15:27:12 +02:00
message.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
nss.texi Remove compat from DEFAULT_CONFIG lookup strings 2017-09-12 10:21:48 -07:00
nsswitch.texi update from main archive 960814 1996-08-15 01:23:29 +00:00
pattern.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
pipe.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
platform.texi manual: Fix a syntax error. 2018-02-16 08:21:47 -08:00
probes.texi Remove slow paths from exp 2018-02-12 11:33:33 +00:00
process.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
README.pretty-printers Remove obsolete notes at top level of source tree. 2017-09-01 08:04:22 -04:00
README.tunables Remove obsolete notes at top level of source tree. 2017-09-01 08:04:22 -04:00
resource.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
search.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
setjmp.texi manual: Document getcontext uc_stack value on Linux [BZ #759] 2017-08-08 16:16:43 -03:00
signal.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
socket.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
startup.texi Revert: 2018-05-07 01:40:30 -03:00
stdio-fp.c update from main archive 970225 1997-02-25 05:18:05 +00:00
stdio.texi manual: Fix Texinfo warnings about improper node names. 2018-02-09 04:40:48 -08:00
string.texi manual: Fix Texinfo warnings about improper node names. 2018-02-09 04:40:48 -08:00
summary.pl Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
sysinfo.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
syslog.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
terminal.texi manual: Update to mention ENODEV for ttyname and ttyname_r 2017-11-15 20:46:45 +01:00
texinfo.tex Update miscellaneous files from upstream sources. 2018-01-01 18:05:06 +00:00
texis.awk Correct close statement. 2001-05-18 13:01:32 +00:00
threads.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
time.texi manual: Touch up documentation for strftime and ALTMON_* constants. 2018-01-22 19:36:51 -08:00
tsort.awk Update copyright dates with scripts/update-copyrights. 2018-01-01 00:32:25 +00:00
tunables.texi manual: Fix spelling of "Auxiliary." 2018-01-23 11:40:44 -08:00
users.texi manual: Replace summary.awk with summary.pl. 2017-06-15 21:26:20 -07:00
xtract-typefun.awk Make shebang interpreter directives consistent 2016-01-07 04:03:21 -05:00

			TUNABLE FRAMEWORK
			=================

Tunables is a feature in the GNU C Library that allows application authors and
distribution maintainers to alter the runtime library behaviour to match their
workload.

The tunable framework allows modules within glibc to register variables that
may be tweaked through an environment variable.  It aims to enforce a strict
namespace rule to bring consistency to naming of these tunable environment
variables across the project.  This document is a guide for glibc developers to
add tunables to the framework.

ADDING A NEW TUNABLE
--------------------

The TOP_NAMESPACE macro is defined by default as 'glibc'.  If distributions
intend to add their own tunables, they should do so in a different top
namespace by overriding the TOP_NAMESPACE macro for that tunable.  Downstream
implementations are discouraged from using the 'glibc' top namespace for
tunables they don't already have consensus to push upstream.

There are three steps to adding a tunable:

1. Add a tunable to the list and fully specify its properties:

For each tunable you want to add, make an entry in elf/dl-tunables.list.  The
format of the file is as follows:

TOP_NAMESPACE {
  NAMESPACE1 {
    TUNABLE1 {
      # tunable attributes, one per line
    }
    # A tunable with default attributes, i.e. string variable.
    TUNABLE2
    TUNABLE3 {
      # its attributes
    }
  }
  NAMESPACE2 {
    ...
  }
}

The list of allowed attributes are:

- type:			Data type.  Defaults to STRING.  Allowed types are:
			INT_32, UINT_64, SIZE_T and STRING.  Numeric types may
			be in octal or hexadecimal format too.

- minval:		Optional minimum acceptable value.  For a string type
			this is the minimum length of the value.

- maxval:		Optional maximum acceptable value.  For a string type
			this is the maximum length of the value.

- default:		Specify an optional default value for the tunable.

- env_alias:		An alias environment variable

- security_level:	Specify security level of the tunable.  Valid values:

			SXID_ERASE: (default) Don't read for AT_SECURE binaries and
				    removed so that child processes can't read it.
			SXID_IGNORE: Don't read for AT_SECURE binaries, but retained for
				     non-AT_SECURE subprocesses.
			NONE: Read all the time.

2. Use TUNABLE_GET/TUNABLE_SET to get and set tunables.

3. OPTIONAL: If tunables in a namespace are being used multiple times within a
   specific module, set the TUNABLE_NAMESPACE macro to reduce the amount of
   typing.

GETTING AND SETTING TUNABLES
----------------------------

When the TUNABLE_NAMESPACE macro is defined, one may get tunables in that
module using the TUNABLE_GET macro as follows:

  val = TUNABLE_GET (check, int32_t, TUNABLE_CALLBACK (check_callback))

where 'check' is the tunable name, 'int32_t' is the C type of the tunable and
'check_callback' is the function to call if the tunable got initialized to a
non-default value.  The macro returns the value as type 'int32_t'.

The callback function should be defined as follows:

  void
  TUNABLE_CALLBACK (check_callback) (int32_t *valp)
  {
  ...
  }

where it can expect the tunable value to be passed in VALP.

Tunables in the module can be updated using:

  TUNABLE_SET (check, int32_t, val)

where 'check' is the tunable name, 'int32_t' is the C type of the tunable and
'val' is a value of same type.

To get and set tunables in a different namespace from that module, use the full
form of the macros as follows:

  val = TUNABLE_GET_FULL (glibc, tune, hwcap_mask, uint64_t, NULL)

  TUNABLE_SET_FULL (glibc, tune, hwcap_mask, uint64_t, val)

where 'glibc' is the top namespace, 'tune' is the tunable namespace and the
remaining arguments are the same as the short form macros.

When TUNABLE_NAMESPACE is not defined in a module, TUNABLE_GET is equivalent to
TUNABLE_GET_FULL, so you will need to provide full namespace information for
both macros.  Likewise for TUNABLE_SET and TUNABLE_SET_FULL.

** IMPORTANT NOTE **

The tunable list is set as read-only after the dynamic linker relocates itself,
so setting tunable values must be limited only to tunables within the dynamic
linker, that too before relocation.

FUTURE WORK
-----------

The framework currently only allows a one-time initialization of variables
through environment variables and in some cases, modification of variables via
an API call.  A future goals for this project include:

- Setting system-wide and user-wide defaults for tunables through some
  mechanism like a configuration file.

- Allow tweaking of some tunables at runtime