sessiond: log error message when libkmod operations fail
authorKienan Stewart <kstewart@efficios.com>
Wed, 22 Nov 2023 16:18:23 +0000 (11:18 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 4 Dec 2023 15:11:57 +0000 (10:11 -0500)
Issue observed
--------------

When loading or unloading modules and libkmod is being used, there are
no details available in the `lttng-sessiond` error ouput.

For example,

```
$ sudo -E lttng-sessiond
Error: Unable to load required module lttng-ring-buffer-client-discard
Warning: No kernel tracer available
```

When libkmod is not available or disabled in the configuration
options, `lttng-sessiond` falls back to invoking `modprobe` via a
`system` call. The command's error output will be visible and provide
the necessary details, eg.

```
$ sudo -E lttng-sessiond
modprobe: FATAL: Module lttng-ring-buffer-client-discard not found in directory /usr/lib/modules/6.2.0-36-generic
Error: Unable to load required module lttng-ring-buffer-client-discard
Warning: No kernel tracer available
```

Solution
--------

Include the error message from `strerror` in the message that is
logged via the `DBG` or `ERR` macros.

The error is no clearer for users, eg.

```
$ sudo -E lttng-sessiond
PERROR - 12:00:05.004593045 [Main]: Unable to load required module
lttng-ring-buffer-client-discard: No such file or directory (in
modprobe_lttng() at modprobe.cpp:396)
Warning: No kernel tracer available
```

Known drawbacks
---------------

The debug message emitted when a non-obligatory kernel module fails to
load is now printed with `PERROR`.

Change-Id: Ibd25614a6c5b5dd3b801063eafc272a4017058cd
Signed-off-by: Kienan Stewart <kstewart@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/modprobe.cpp

index ac9f14257c6c5334a38be31e494d98fd6e619656..547756de9413d864eb908b351ec9d777c2702364 100644 (file)
@@ -393,11 +393,11 @@ static int modprobe_lttng(struct kern_modules_param *modules, int entries)
                        ret = 0;
                } else if (ret < 0) {
                        if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED) {
-                               ERR("Unable to load required module %s", modules[i].name);
+                               PERROR("Unable to load required module `%s`", modules[i].name)
                                goto error;
                        } else {
-                               DBG("Unable to load optional module %s; continuing",
-                                   modules[i].name);
+                               PERROR("Unable to load optional module `%s`; continuing",
+                                      modules[i].name);
                                ret = 0;
                        }
                } else {
@@ -491,7 +491,7 @@ static void modprobe_remove_lttng(const struct kern_modules_param *modules, int
                        DBG("Module %s is not in kernel.", modules[i].name);
                } else if (modules[i].load_policy == KERNEL_MODULE_PROPERTY_LOAD_POLICY_REQUIRED &&
                           ret < 0) {
-                       ERR("Unable to remove module %s", modules[i].name);
+                       PERROR("Unable to remove module `%s`", modules[i].name);
                } else {
                        DBG("Modprobe removal successful %s", modules[i].name);
                }
This page took 0.02675 seconds and 4 git commands to generate.