Clang supports the 'require_explicit_initialization' attribute on struct
fields to enforce that the field is explicitly initialized when an
aggregate object is constructed, emitting -Wuninitialized-explicit-init
(enabled by default) if the field is omitted.
Following discussion at the Linux Plumbers Conference [1], patch 1 adds
the attribute to include/linux/compiler_attributes.h as __must_init. In
v1 it was called __require_explicit_initialization. Kees picked up that
patch with a first seq_file user [2], and in that thread Greg suggested
the shorter __must_init spelling, which Kees and Miguel agreed to. As
the attribute did not land in the v7.4 merge window, Kees asked that
this series carry the renamed attribute. The Acked-by/Reviewed-by tags
on patch 1 were given for the original spelling; the rename is
mechanical.
As Documentation/core-api/kobject.rst notes:
"One important point cannot be overstated: every kobject must have a
release() method, and the kobject must persist (in a consistent state)
until that method is called. If these constraints are not met, the
code is flawed."
Annotating struct kobj_type::release caught struct kobj_type definitions
across the tree that omitted .release:
- Patches 2-8 fix struct kobj_type definitions where dynamically
allocated kobjects, ksets, or enclosing structures were either leaked
on kobject_put(), freed prematurely before kobject release, or missing
proper static initializers.
- Patch 9 annotates struct kobj_type::release with __must_init and
explicitly sets .release = NULL (with explanatory comments prefixed
with "Pre-existing:") on the remaining legacy struct kobj_type
definitions whose kobjects are static, per-CPU, permanent firmware
structures, or embedded in devm- or parent-managed structures.
Note on tool use: An LLM coding assistant was used to help audit the
compiler diagnostics across the tree, draft the fixes and changelog
descriptions, and verify builds and review feedback.
Changes in v2:
- Rebased on v7.3-16928-g83f32c773255 (v7.4 merge window).
- Patch 1: Rename __require_explicit_initialization to __must_init per
Greg Kroah-Hartman; document the Clang >= 20 requirement per Miguel
Ojeda; note the Clang gap for file-scope objects without an
initializer reported by Kees Cook; add tags from v1 and from Kees's
posting.
- Move LLM assistance attribution from Assisted-by tags to this cover
letter per commit 1e035297ffda ("docs: remove Assisted-by
references").
- Patch 4 (cpufreq): Use "cpufreq: governor:" prefix, drop Fixes tag,
fix typo, and remove the redundant runtime assignment in
cpufreq_dbs_governor_init() per Zhongqiu Han.
- Dropped v1 patch 5 (ACPI: CPPC), already fixed upstream by
commit 27954e29d7de ("ACPI: CPPC: Release CPC descriptors through
kobject").
- Patch 5 (dlm): Call kobject_del() before dlm_recoverd_stop() in
release_lockspace() and the new_lockspace() error path, and wait on a
new ls_kobj_done completion before freeing the lockspace or dropping
the module reference, avoiding races with delayed kobject release.
- Dropped v1 patch 8 (s390/sclp_mem) per Sumanth Korikkar: the
/sys/firmware/memory/memoryX kobjects are permanent, so sclp_mem.c is
folded into patch 9 with .release = NULL.
- Patch 7 (ubifs): Add Tested-by and Reviewed-by from Zhihao Cheng.
- Patch 8 (drm/amdkfd): Check q->kobj.state_in_sysfs before
kobject_del() in kfd_procfs_del_queue().
- Patch 9 (kobject): Cover sclp_mem.c and the new amdgpu_ualink.c
ualink_xcp_info_ktype, fix the overlay-sysfs.c comment, and prefix
legacy .release = NULL comments with "Pre-existing:".
- Patch 9 (kobject): The ioat, kunpeng_hccs and omapfb display comments
now say that the existing teardown can use-after-free under
CONFIG_DEBUG_KOBJECT_RELEASE (reported by Sashiko). Fixing those
drivers is left to follow-up patches.
v1: https://lore.kernel.org/all/[email protected]/
[1] https://lpc.events/event/20/contributions/2392/
[2] https://lore.kernel.org/lkml/[email protected]/
Ian Rogers (9):
Compiler Attributes: Add __must_init macro
powerpc/secvar: Add missing kobject release callback to secvar_ktype
sh: sq: Add missing kobject release callback to ktype_percpu_entry
cpufreq: governor: Initialize kobj_type release callback statically
dlm: Free dlm_ls in kobject release callback
xen/sys-hypervisor: Add release callback to hyp_sysfs_kobj_type
ubifs: sysfs: Use kset_create_and_add() for ubifs_kset
drm/amdkfd: Free queue in procfs_queue_type kobject release callback
kobject: Require explicit initialization of struct kobj_type::release
Documentation/conf.py | 1 +
arch/arm64/kernel/cpuinfo.c | 5 ++++
arch/powerpc/kernel/secvar-sysfs.c | 6 +++++
arch/sh/kernel/cpu/sh4/sq.c | 6 +++++
drivers/acpi/sysfs.c | 2 ++
drivers/cpufreq/cpufreq_conservative.c | 5 +++-
drivers/cpufreq/cpufreq_governor.c | 4 +--
drivers/cpufreq/cpufreq_governor.h | 1 +
drivers/cpufreq/cpufreq_ondemand.c | 5 +++-
drivers/dma/ioat/sysfs.c | 7 +++++
drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c | 5 ++++
drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c | 10 +++++++
drivers/gpu/drm/amd/amdkfd/kfd_process.c | 12 ++++++---
drivers/gpu/drm/amd/amdkfd/kfd_queue.c | 5 +++-
drivers/infiniband/hw/hfi1/sysfs.c | 5 ++++
drivers/infiniband/hw/usnic/usnic_ib_sysfs.c | 2 ++
drivers/parisc/pdc_stable.c | 5 ++++
drivers/power/supply/ab8500_fg.c | 5 ++++
drivers/s390/char/sclp_mem.c | 2 ++
drivers/soc/hisilicon/kunpeng_hccs.c | 21 +++++++++++++++
.../fbdev/omap2/omapfb/dss/display-sysfs.c | 7 +++++
.../fbdev/omap2/omapfb/dss/manager-sysfs.c | 5 ++++
.../fbdev/omap2/omapfb/dss/overlay-sysfs.c | 5 ++++
drivers/xen/sys-hypervisor.c | 6 +++++
fs/dlm/dlm_internal.h | 1 +
fs/dlm/lockspace.c | 26 ++++++++++++++-----
fs/erofs/sysfs.c | 10 +++++++
fs/f2fs/sysfs.c | 15 +++++++++++
fs/ocfs2/cluster/masklog.c | 5 ++++
fs/ubifs/sysfs.c | 24 +++++------------
include/linux/compiler_attributes.h | 12 +++++++++
include/linux/kobject.h | 2 +-
scripts/checkpatch.pl | 1 +
tools/lib/python/kdoc/xforms_lists.py | 1 +
34 files changed, 202 insertions(+), 32 deletions(-)
base-commit: 83f32c773255720a661aa45d83e36278135f23f5
--
2.56.0.313.g2479322e68-goog