]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev-config: allow to enable trace logging through kernel command line
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 11 Jan 2025 16:35:48 +0000 (01:35 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 20 Jan 2025 19:12:18 +0000 (04:12 +0900)
This adds udev.trace[=BOOL] kernel command line option to control trace
logging.

man/kernel-command-line.xml
man/systemd-udevd.service.xml
src/udev/udev-config.c
src/udev/udev-config.h
src/udev/udev-worker.c

index 528f23b8093b389fd358aed8b30ca703f1382d68..6cf16e5b5541f469a6777dc310ec6b78b7221faa 100644 (file)
       <varlistentry>
         <term><varname>udev.log_level=</varname></term>
         <term><varname>rd.udev.log_level=</varname></term>
+        <term><varname>udev.trace=</varname></term>
+        <term><varname>rd.udev.trace=</varname></term>
         <term><varname>udev.children_max=</varname></term>
         <term><varname>rd.udev.children_max=</varname></term>
         <term><varname>udev.exec_delay=</varname></term>
index ad0be5bdab27e47624e87f5ef11f0b1c69fabbb5..ab50fb65a25db821c3fa563b78489107d9a67424 100644 (file)
         <xi:include href="version-info.xml" xpointer="v247"/>
         </listitem>
       </varlistentry>
+      <varlistentry>
+        <term><varname>udev.trace[=<replaceable>BOOL</replaceable>]</varname></term>
+        <term><varname>rd.udev.trace[=<replaceable>BOOL</replaceable>]</varname></term>
+        <listitem>
+          <para>Enable/disable trace logging. When enabled, <varname>udev.log_level=</varname> will be
+          ignored, and <literal>debug</literal> level is assumed.</para>
+
+          <xi:include href="version-info.xml" xpointer="v258"/>
+        </listitem>
+      </varlistentry>
       <varlistentry>
         <term><varname>udev.children_max=</varname></term>
         <term><varname>rd.udev.children_max=</varname></term>
index 5c963e4ffdd40d96d7905a8819ac8c3667f905b0..19d57526db040991e4122eff4f4ed62d396e501e 100644 (file)
@@ -112,6 +112,20 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
 
                 return 0;
 
+        } else if (proc_cmdline_key_streq(key, "udev.trace")) {
+
+                if (!value)
+                        config->trace = true;
+                else {
+                        r = parse_boolean(value);
+                        if (r < 0)
+                                log_warning_errno(r, "Failed to parse udev.trace argument, ignoring: %s", value);
+                        else
+                                config->trace = r;
+                }
+
+                return 0;
+
         } else {
                 if (startswith(key, "udev."))
                         log_warning("Unknown udev kernel command line option \"%s\", ignoring.", key);
@@ -257,13 +271,24 @@ static int parse_argv(int argc, char *argv[], UdevConfig *config) {
                 manager->config_by_command.name ||                      \
                 manager->config_by_udev_conf.name;
 
+static void manager_merge_config_log_level(Manager *manager) {
+        assert(manager);
+
+        MERGE_BOOL(trace);
+
+        if (manager->config.trace)
+                manager->config.log_level = LOG_DEBUG;
+        else
+                MERGE_NON_NEGATIVE(log_level, log_get_max_level());
+}
+
 static void manager_merge_config(Manager *manager) {
         assert(manager);
 
         /* udev.conf has the lowest priority, then followed by command line arguments, kernel command line
            options, and values set by udev control. */
 
-        MERGE_NON_NEGATIVE(log_level, log_get_max_level());
+        manager_merge_config_log_level(manager);
         MERGE_NON_NEGATIVE(resolve_name_timing, RESOLVE_NAME_EARLY);
         MERGE_NON_ZERO(exec_delay_usec, 0);
         MERGE_NON_ZERO(timeout_usec, DEFAULT_WORKER_TIMEOUT_USEC);
@@ -310,11 +335,14 @@ void manager_set_log_level(Manager *manager, int log_level) {
 
         int old = log_get_max_level();
 
-        log_set_max_level(log_level);
-        manager->config.log_level = manager->config_by_control.log_level = log_level;
+        manager->config_by_control.log_level = log_level;
+        manager_merge_config_log_level(manager);
 
-        if (log_level != old)
-                manager_kill_workers(manager, /* force = */ false);
+        if (manager->config.log_level == old)
+                return;
+
+        log_set_max_level(manager->config.log_level);
+        manager_kill_workers(manager, /* force = */ false);
 }
 
 static void manager_adjust_config(UdevConfig *config) {
@@ -434,7 +462,8 @@ UdevReloadFlags manager_reload_config(Manager *manager) {
             manager->config.exec_delay_usec != old.exec_delay_usec ||
             manager->config.timeout_usec != old.timeout_usec ||
             manager->config.timeout_signal != old.timeout_signal ||
-            manager->config.blockdev_read_only != old.blockdev_read_only)
+            manager->config.blockdev_read_only != old.blockdev_read_only ||
+            manager->config.trace != old.trace)
                 return UDEV_RELOAD_KILL_WORKERS;
 
         return 0;
index 68bb1ea98cf8595c6514057d2baefaa7e5dc0807..9e8a48dae2aaf162dc368c9925d1897c0f19b8cf 100644 (file)
@@ -18,6 +18,7 @@ typedef struct UdevConfig {
         usec_t timeout_usec;
         int timeout_signal;
         bool blockdev_read_only;
+        bool trace;
 } UdevConfig;
 
 #define UDEV_CONFIG_INIT                                             \
index 52b2203677a3a90b43781e8674f39d6513d8b79b..5c7583a9ffed3284497bc4eecb6690971670f78b 100644 (file)
@@ -182,6 +182,7 @@ static int worker_process_device(UdevWorker *worker, sd_device *dev) {
         udev_event = udev_event_new(dev, worker, EVENT_UDEV_WORKER);
         if (!udev_event)
                 return -ENOMEM;
+        udev_event->trace = worker->config.trace;
 
         /* If this is a block device and the device is locked currently via the BSD advisory locks,
          * someone else is using it exclusively. We don't run our udev rules now to not interfere.