[DTrace-devel] [PATCH v2] Set the lockmem limit to "unlimited" by default
Kris Van Hees
kris.van.hees at oracle.com
Tue Feb 20 17:14:43 UTC 2024
On Mon, Feb 12, 2024 at 01:08:56PM -0500, eugene.loh at oracle.com wrote:
>
> Commit d5a2077d ("Locked-memory limit") described the importance of
> setting the locked-memory limit appropriately for DTrace, but it put
> that burden on users, admittedly providing several mechanisms to do so.
>
> Driven by commit 5a12c51c ("options: ensure lockmem is set before
> retrieving probe info"), commit 7e159efa ("Forbid setting lockmem value
> with a pragma") eliminated one such mechanism.
>
> That pragma mechanism, however, had proven to be a popular way of
> constructing D scripts that could run both under legacy DTrace, which
> does not recognize the lockmem option, and DTrace on Linux, which
> essentially requires the option. That is, the mechanism allowed a
> script to set the pragma conditionally based on DTrace version.
>
> Further, it is difficult to size the amount of locked memory needed,
> and so users end up just routinely setting the limit to "unlimited."
>
> While there are good reasons not to change resource limits quietly, the
> usability issues around lockmem have become nuisances.
>
> Therefore, continue to support the lockmem option, but change the default
> behavior to set the lockmem limit to "unlimited."
>
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libdtrace/dt_open.c | 13 ++++++-------
> test/unittest/misc/tst.lockmem-cmdline.r | 9 +++------
> test/unittest/misc/tst.lockmem-cmdline.x | 16 ----------------
> 3 files changed, 9 insertions(+), 29 deletions(-)
> delete mode 100755 test/unittest/misc/tst.lockmem-cmdline.x
>
> diff --git a/libdtrace/dt_open.c b/libdtrace/dt_open.c
> index 708f1f50..a0a2cefb 100644
> --- a/libdtrace/dt_open.c
> +++ b/libdtrace/dt_open.c
> @@ -1180,6 +1180,7 @@ dtrace_init(dtrace_hdl_t *dtp)
> {
> int i;
> dtrace_optval_t lockmem = dtp->dt_options[DTRACEOPT_LOCKMEM];
> + struct rlimit rl;
>
> /*
> * Initialize the BPF library handling.
> @@ -1187,14 +1188,12 @@ dtrace_init(dtrace_hdl_t *dtp)
> dt_dlib_init(dtp);
>
> /*
> - * Set the locked-memory limit if so directed by the user.
> + * Set the locked-memory limit.
> */
> - if (lockmem != DTRACEOPT_UNSET) {
> - struct rlimit rl;
> -
> - rl.rlim_cur = rl.rlim_max = lockmem;
> - setrlimit(RLIMIT_MEMLOCK, &rl);
> - }
> + if (lockmem == DTRACEOPT_UNSET)
> + lockmem = RLIM_INFINITY;
> + rl.rlim_cur = rl.rlim_max = lockmem;
> + setrlimit(RLIMIT_MEMLOCK, &rl);
>
> /*
> * Initialize consume handling.
> diff --git a/test/unittest/misc/tst.lockmem-cmdline.r b/test/unittest/misc/tst.lockmem-cmdline.r
> index 537d655d..a2d5ad5f 100644
> --- a/test/unittest/misc/tst.lockmem-cmdline.r
> +++ b/test/unittest/misc/tst.lockmem-cmdline.r
> @@ -1,12 +1,9 @@
> -1
>
> 1234
> 0
>
> 1234
> 0
> --- @@stderr --
> -dtrace: could not enable tracing: failed to create BPF map 'state':
> - The kernel locked-memory limit is possibly too low. Set a
> - higher limit with the DTrace option '-xlockmem=N'. Or, use
> - 'ulimit -l N' (Kbytes). Or, make N the string 'unlimited'.
> +
> + 1234
> +0
> diff --git a/test/unittest/misc/tst.lockmem-cmdline.x b/test/unittest/misc/tst.lockmem-cmdline.x
> deleted file mode 100755
> index a779416b..00000000
> --- a/test/unittest/misc/tst.lockmem-cmdline.x
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -#!/bin/bash
> -
> -read MAJOR MINOR <<< `uname -r | grep -Eo '^[0-9]+\.[0-9]+' | tr '.' ' '`
> -
> -if [ $MAJOR -lt 5 ]; then
> - exit 0
> -fi
> -if [ $MAJOR -eq 5 -a $MINOR -lt 15 ]; then
> - exit 0
> -fi
> -
> -# Somehow, UEKR6 (5.4.17) has problems with the the locked-memory limit,
> -# but UEKR7 (5.15.0) does not
> -
> -echo "no locked-memory limit on newer kernels?"
> -exit 1
> --
> 2.18.4
>
>
More information about the DTrace-devel
mailing list