diff --git a/src/libsysprof/sysprof-process-info.c b/src/libsysprof/sysprof-process-info.c index fc35d981..795ce438 100644 --- a/src/libsysprof/sysprof-process-info.c +++ b/src/libsysprof/sysprof-process-info.c @@ -51,6 +51,9 @@ sysprof_process_info_new (SysprofMountNamespace *mount_namespace, 0, 0, SYSPROF_SYMBOL_KIND_PROCESS); + if (pid == 0) + self->fallback_symbol->is_kernel_process = TRUE; + if (pid > 0) egg_bitset_add (self->thread_ids, pid); diff --git a/src/libsysprof/sysprof-symbol-private.h b/src/libsysprof/sysprof-symbol-private.h index d6085bc3..331a5f45 100644 --- a/src/libsysprof/sysprof-symbol-private.h +++ b/src/libsysprof/sysprof-symbol-private.h @@ -41,6 +41,7 @@ struct _SysprofSymbol guint kind : 3; guint is_fallback : 1; + guint is_kernel_process : 1; }; SysprofSymbol *_sysprof_symbol_new (GRefString *name, diff --git a/src/libsysprof/sysprof-symbol.c b/src/libsysprof/sysprof-symbol.c index ed09d216..7524e3a3 100644 --- a/src/libsysprof/sysprof-symbol.c +++ b/src/libsysprof/sysprof-symbol.c @@ -151,6 +151,20 @@ sysprof_symbol_get_binary_path (SysprofSymbol *self) return self->binary_path; } +static gboolean +sniff_maybe_kernel_process (const char *str) +{ + if (g_str_has_prefix (str, "kworker/") || + g_str_equal (str, "rcu_preempt") || + g_str_has_prefix (str, "migration/") || + g_str_has_prefix (str, "dmcrypt_write/") || + g_str_has_prefix (str, "hwrng") || + g_str_has_prefix (str, "ksoftirqd/")) + return TRUE; + + return FALSE; +} + SysprofSymbol * _sysprof_symbol_new (GRefString *name, GRefString *binary_path, @@ -176,6 +190,9 @@ _sysprof_symbol_new (GRefString *name, self->simple_hash = g_str_hash (name); self->kind = kind; + if (self->kind == SYSPROF_SYMBOL_KIND_PROCESS) + self->is_kernel_process = sniff_maybe_kernel_process (name); + if (binary_nick != NULL) self->simple_hash ^= g_str_hash (binary_nick);