]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
process-util: add pidref_is_kernel_thread()
authorLennart Poettering <lennart@poettering.net>
Mon, 16 Oct 2023 21:18:05 +0000 (23:18 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 18 Oct 2023 12:39:33 +0000 (14:39 +0200)
src/basic/process-util.c
src/basic/process-util.h
src/cgtop/cgtop.c
src/core/dbus-unit.c
src/core/unit.c
src/shared/cgroup-setup.c
src/shared/cgroup-show.c
src/shared/killall.c
src/test/test-cgroup-util.c
src/test/test-process-util.c

index f02d66e556f16c18156bbfe34e3f1007cfc569d1..d607c7eb7310eadfd4fb43eb15865ba189b6f07c 100644 (file)
@@ -389,7 +389,7 @@ int namespace_get_leader(pid_t pid, NamespaceType type, pid_t *ret) {
         }
 }
 
-int is_kernel_thread(pid_t pid) {
+int pid_is_kernel_thread(pid_t pid) {
         _cleanup_free_ char *line = NULL;
         unsigned long long flags;
         size_t l, i;
@@ -447,6 +447,23 @@ int is_kernel_thread(pid_t pid) {
         return !!(flags & PF_KTHREAD);
 }
 
+int pidref_is_kernel_thread(const PidRef *pid) {
+        int result, r;
+
+        if (!pidref_is_set(pid))
+                return -ESRCH;
+
+        result = pid_is_kernel_thread(pid->pid);
+        if (result < 0)
+                return result;
+
+        r = pidref_verify(pid); /* Verify that the PID wasn't reused since */
+        if (r < 0)
+                return r;
+
+        return result;
+}
+
 int get_process_capeff(pid_t pid, char **ret) {
         const char *p;
         int r;
index 78f7d409a0d31a7588b7b2cbd4718d2f6f2c3829..c6f2687697258b12747f93c2c41693a8d9f3df09 100644 (file)
@@ -79,7 +79,8 @@ void sigkill_nowaitp(pid_t *pid);
 
 int kill_and_sigcont(pid_t pid, int sig);
 
-int is_kernel_thread(pid_t pid);
+int pid_is_kernel_thread(pid_t pid);
+int pidref_is_kernel_thread(const PidRef *pid);
 
 int getenv_for_pid(pid_t pid, const char *field, char **_value);
 
index a6adb8ce314be7bb1d5abbdaacf777a1a21b4a00..e34da7cf7282e7577dbc0f96b93dc82b5572fe77 100644 (file)
@@ -209,7 +209,7 @@ static int process(
                 g->n_tasks = 0;
                 while (cg_read_pid(f, &pid) > 0) {
 
-                        if (arg_count == COUNT_USERSPACE_PROCESSES && is_kernel_thread(pid) > 0)
+                        if (arg_count == COUNT_USERSPACE_PROCESSES && pid_is_kernel_thread(pid) > 0)
                                 continue;
 
                         g->n_tasks++;
index ec3cf519e92261521b8966e03bfbfb9a43f56c0f..501055c10b8ba1d2a3284a30d4835a3757e1395f 100644 (file)
@@ -1295,7 +1295,7 @@ static int append_cgroup(sd_bus_message *reply, const char *p, Set *pids) {
                 if (r < 0)
                         return r;
 
-                if (is_kernel_thread(pid) > 0)
+                if (pid_is_kernel_thread(pid) > 0)
                         continue;
 
                 r = append_process(reply, p, pid, pids);
index 4aef2e97de3acd600ae422d9e0d674d500b442fb..69e758e6d35f9ba89a23440b1431323648e406f5 100644 (file)
@@ -5953,7 +5953,7 @@ int unit_pid_attachable(Unit *u, PidRef *pid, sd_bus_error *error) {
                 return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Process " PID_FMT " is a manager process, refusing.", pid->pid);
 
         /* Don't even begin to bother with kernel threads */
-        r = is_kernel_thread(pid->pid);
+        r = pidref_is_kernel_thread(pid);
         if (r == -ESRCH)
                 return sd_bus_error_setf(error, SD_BUS_ERROR_UNIX_PROCESS_ID_UNKNOWN, "Process with ID " PID_FMT " does not exist.", pid->pid);
         if (r < 0)
index fac2e08afc11f8a4dc52ded31bebf3d9edbf8084..811f129f6cd9bc4747af683b0a792fa7c0286a3f 100644 (file)
@@ -611,7 +611,7 @@ int cg_migrate(
                          * them there. */
                         if (cfrom &&
                             empty_or_root(pfrom) &&
-                            is_kernel_thread(pid) > 0)
+                            pid_is_kernel_thread(pid) > 0)
                                 continue;
 
                         r = cg_attach(cto, pto, pid);
index 98375776332f8414d0c0ac3354092f7da8e58d87..b77bab0215ec37a2d89e1de5e2c40da4ac92a5e0 100644 (file)
@@ -114,7 +114,7 @@ static int show_cgroup_one_by_path(
                 if (r < 0)
                         return r;
 
-                if (!(flags & OUTPUT_KERNEL_THREADS) && is_kernel_thread(pid) > 0)
+                if (!(flags & OUTPUT_KERNEL_THREADS) && pid_is_kernel_thread(pid) > 0)
                         continue;
 
                 if (!GREEDY_REALLOC(pids, n + 1))
index ef715dbdfe365d2e8824047e76063941af9e268e..4da6335e10b37352cf55e37d1c8ad3ddc3a1a411 100644 (file)
@@ -77,7 +77,7 @@ static bool ignore_proc(pid_t pid, bool warn_rootfs) {
                 return true;
 
         /* Ignore kernel threads */
-        r = is_kernel_thread(pid);
+        r = pid_is_kernel_thread(pid);
         if (r != 0)
                 return true; /* also ignore processes where we can't determine this */
 
index afa6283011fa082ea79583466407988127e5beee..57facfe632df2cbbb0071d20de610ae344b0a17a 100644 (file)
@@ -209,7 +209,7 @@ TEST(proc) {
                 if (r < 0)
                         continue;
 
-                if (is_kernel_thread(pid))
+                if (pid_is_kernel_thread(pid) != 0)
                         continue;
 
                 cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &path);
index 53c7184e22627bc86dca0fdfcf975640a8f76278..460cd318db8314a4cae6b7f11d1c91bede0b210f 100644 (file)
@@ -76,7 +76,7 @@ static void test_get_process_comm_one(pid_t pid) {
                 assert_se(e > 0);
         }
 
-        assert_se(is_kernel_thread(pid) == 0 || pid != 1);
+        assert_se(pid_is_kernel_thread(pid) == 0 || pid != 1);
 
         r = get_process_exe(pid, &f);
         assert_se(r >= 0 || r == -EACCES);