1			TUNABLE FRAMEWORK
2			=================
3
4Tunables is a feature in the GNU C Library that allows application authors and
5distribution maintainers to alter the runtime library behaviour to match their
6workload.
7
8The tunable framework allows modules within glibc to register variables that
9may be tweaked through an environment variable.  It aims to enforce a strict
10namespace rule to bring consistency to naming of these tunable environment
11variables across the project.  This document is a guide for glibc developers to
12add tunables to the framework.
13
14ADDING A NEW TUNABLE
15--------------------
16
17The TOP_NAMESPACE macro is defined by default as 'glibc'.  If distributions
18intend to add their own tunables, they should do so in a different top
19namespace by overriding the TOP_NAMESPACE macro for that tunable.  Downstream
20implementations are discouraged from using the 'glibc' top namespace for
21tunables they don't already have consensus to push upstream.
22
23There are three steps to adding a tunable:
24
251. Add a tunable to the list and fully specify its properties:
26
27For each tunable you want to add, make an entry in elf/dl-tunables.list.  The
28format of the file is as follows:
29
30TOP_NAMESPACE {
31  NAMESPACE1 {
32    TUNABLE1 {
33      # tunable attributes, one per line
34    }
35    # A tunable with default attributes, i.e. string variable.
36    TUNABLE2
37    TUNABLE3 {
38      # its attributes
39    }
40  }
41  NAMESPACE2 {
42    ...
43  }
44}
45
46The list of allowed attributes are:
47
48- type:			Data type.  Defaults to STRING.  Allowed types are:
49			INT_32, UINT_64, SIZE_T and STRING.  Numeric types may
50			be in octal or hexadecimal format too.
51
52- minval:		Optional minimum acceptable value.  For a string type
53			this is the minimum length of the value.
54
55- maxval:		Optional maximum acceptable value.  For a string type
56			this is the maximum length of the value.
57
58- default:		Specify an optional default value for the tunable.
59
60- env_alias:		An alias environment variable
61
62- security_level:	Specify security level of the tunable for AT_SECURE
63			binaries.  Valid values are:
64
65			SXID_ERASE: (default) Do not read and do not pass on to
66			child processes.
67			SXID_IGNORE: Do not read, but retain for non-AT_SECURE
68			child processes.
69			NONE: Read all the time.
70
712. Use TUNABLE_GET/TUNABLE_SET/TUNABLE_SET_WITH_BOUNDS to get and set tunables.
72
733. OPTIONAL: If tunables in a namespace are being used multiple times within a
74   specific module, set the TUNABLE_NAMESPACE macro to reduce the amount of
75   typing.
76
77GETTING AND SETTING TUNABLES
78----------------------------
79
80When the TUNABLE_NAMESPACE macro is defined, one may get tunables in that
81module using the TUNABLE_GET macro as follows:
82
83  val = TUNABLE_GET (check, int32_t, TUNABLE_CALLBACK (check_callback))
84
85where 'check' is the tunable name, 'int32_t' is the C type of the tunable and
86'check_callback' is the function to call if the tunable got initialized to a
87non-default value.  The macro returns the value as type 'int32_t'.
88
89The callback function should be defined as follows:
90
91  void
92  TUNABLE_CALLBACK (check_callback) (int32_t *valp)
93  {
94  ...
95  }
96
97where it can expect the tunable value to be passed in VALP.
98
99Tunables in the module can be updated using:
100
101  TUNABLE_SET (check, val)
102
103where 'check' is the tunable name and 'val' is a value of same type.
104
105To get and set tunables in a different namespace from that module, use the full
106form of the macros as follows:
107
108  val = TUNABLE_GET_FULL (glibc, cpu, hwcap_mask, uint64_t, NULL)
109
110  TUNABLE_SET_FULL (glibc, cpu, hwcap_mask, val)
111
112where 'glibc' is the top namespace, 'cpu' is the tunable namespace and the
113remaining arguments are the same as the short form macros.
114
115The minimum and maximum values can updated together with the tunable value
116using:
117
118  TUNABLE_SET_WITH_BOUNDS (check, val, min, max)
119
120where 'check' is the tunable name, 'val' is a value of same type, 'min' and
121'max' are the minimum and maximum values of the tunable.
122
123To set the minimum and maximum values of tunables in a different namespace
124from that module, use the full form of the macros as follows:
125
126  val = TUNABLE_GET_FULL (glibc, cpu, hwcap_mask, uint64_t, NULL)
127
128  TUNABLE_SET_WITH_BOUNDS_FULL (glibc, cpu, hwcap_mask, val, min, max)
129
130where 'glibc' is the top namespace, 'cpu' is the tunable namespace and the
131remaining arguments are the same as the short form macros.
132
133When TUNABLE_NAMESPACE is not defined in a module, TUNABLE_GET is equivalent to
134TUNABLE_GET_FULL, so you will need to provide full namespace information for
135both macros.  Likewise for TUNABLE_SET, TUNABLE_SET_FULL,
136TUNABLE_SET_WITH_BOUNDS and TUNABLE_SET_WITH_BOUNDS_FULL.
137
138** IMPORTANT NOTE **
139
140The tunable list is set as read-only after the dynamic linker relocates itself,
141so setting tunable values must be limited only to tunables within the dynamic
142linker, that too before relocation.
143
144FUTURE WORK
145-----------
146
147The framework currently only allows a one-time initialization of variables
148through environment variables and in some cases, modification of variables via
149an API call.  A future goals for this project include:
150
151- Setting system-wide and user-wide defaults for tunables through some
152  mechanism like a configuration file.
153
154- Allow tweaking of some tunables at runtime
155