In the Linux kernel, the following vulnerability has been resolved:
mm/damon/core: fix damon_call() vs kdamond_fn() exit race
Patch series "mm/damon/core: fix damon_call()/damos_walk() vs kdmond exit race".
damon_call() and damos_walk() can leak memory and/or deadlock when they race with kdamond terminations. Fix those.
This patch (of 2);
When kdamond_fn() main loop is finished, the function cancels all remaining damon_call() requests and unset the damon_ctx->kdamond so that API callers and API functions themselves can know the context is terminated. damon_call() adds the caller's request to the queue first. After that, it shows if the kdamond of the damon_ctx is still running (damon_ctx->kdamond is set). Only if the kdamond is running, damon_call() starts waiting for the kdamond's handling of the newly added request.
The damon_call() requests registration and damon_ctx->kdamond unset are protected by different mutexes, though. Hence, damon_call() could race with damon_ctx->kdamond unset, and result in deadlocks.
For example, let's suppose kdamond successfully finished the damon_call() requests cancelling. Right after that, damon_call() is called for the context. It registers the new request, and shows the context is still running, because damon_ctx->kdamond unset is not yet done. Hence the damon_call() caller starts waiting for the handling of the request. However, the kdamond is already on the termination steps, so it never handles the new request. As a result, the damon_call() caller threads infinitely waits.
Fix this by introducing another damon_ctx field, namely call_controls_obsolete. It is protected by the damon_ctx->call_controls_lock, which protects damon_call() requests registration. Initialize (unset) it in kdamond_fn() before letting damon_start() returns and set it just before the cancelling of remaining damon_call() requests is executed. damon_call() reads the obsolete field under the lock and avoids adding a new request.
After this change, only requests that are guaranteed to be handled or cancelled are registered. Hence the after-registration DAMON context termination check is no longer needed. Remove it together.
Note that the deadlock will not happen when damon_call() is called for repeat mode request. In tis case, damon_call() returns instead of waiting for the handling when the request registration succeeds and it shows the kdamond is running. However, if the request also has dealloc_on_cancel, the request memory would be leaked.
The issue is found by sashiko [1].
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Amazon_linux_2023 | — | Upgrade kernel6.18-modules-extraUpgrade kernel6.18-debuginfo-common-x86_64Upgrade kernel6.18-toolsUpgrade kernel6.18-develUpgrade kernel6.18-tools-debuginfoUpgrade perf6.18Upgrade python3-perf6.18-debuginfoUpgrade kernel6.18-debuginfoUpgrade bpftool6.18-debuginfoUpgrade python3-perf6.18Upgrade kernel6.18-tools-develUpgrade kernel6.18Upgrade kernel6.18-headersUpgrade bpftool6.18Upgrade kernel6.18-modules-extra-commonUpgrade perf6.18-debuginfoUpgrade kernel-livepatch-6.18.30-61.116Upgrade kernel6.18-debuginfo-common-aarch64 | Jun 23, 2026 | May 27, 2026 |
| Ubuntu | — | Upgrade linux-image-gcp-64k-7.0Upgrade linux-image-7.0.0-28-genericUpgrade linux-image-7.0.0-27-generic-64kUpgrade linux-image-7.0.0-27-realtimeUpgrade linux-image-raspi-realtime-7.0Upgrade linux-image-generic-hwe-26.04Upgrade linux-image-realtime-64k-7.0Upgrade linux-image-7.0.0-1010-azureUpgrade linux-image-awsUpgrade linux-image-oem-7.0Upgrade linux-image-7.0.0-1008-oemUpgrade linux-image-oem-26.04aUpgrade linux-image-generic-7.0Upgrade linux-image-7.0.0-1007-gcpUpgrade linux-image-realtime-7.0Upgrade linux-image-aws-7.0Upgrade linux-image-azureUpgrade linux-image-oem-24.04cUpgrade linux-image-aws-64k-7.0Upgrade linux-image-raspi-7.0Upgrade linux-image-raspiUpgrade linux-image-7.0.0-1013-nvidia-64kUpgrade linux-image-7.0.0-1014-raspi-realtimeUpgrade linux-image-realtimeUpgrade linux-image-aws-64kUpgrade linux-image-generic-64k-hwe-24.04Upgrade linux-image-7.0.0-27-realtime-64kUpgrade linux-image-generic-64k-hwe-26.04Upgrade linux-image-realtime-64kUpgrade linux-image-oem-24.04Upgrade linux-image-7.0.0-28-generic-64kUpgrade linux-image-gcp-64kUpgrade linux-image-7.0.0-1009-ibmUpgrade linux-image-7.0.0-27-genericUpgrade linux-image-oracleUpgrade linux-image-oracle-7.0Upgrade linux-image-azure-fdeUpgrade linux-image-oem-24.04bUpgrade linux-image-7.0.0-1008-aws-64kUpgrade linux-image-virtual-hwe-26.04Upgrade linux-image-oracle-64k-7.0Upgrade linux-image-oem-26.04Upgrade linux-image-oem-24.04dUpgrade linux-image-azure-fde-7.0Upgrade linux-image-azure-7.0Upgrade linux-image-realtime-64k-hwe-26.04Upgrade linux-image-gcp-7.0Upgrade linux-image-7.0.0-1009-azure-fdeUpgrade linux-image-7.0.0-1008-awsUpgrade linux-image-generic-hwe-24.04Upgrade linux-image-virtual-hwe-24.04Upgrade linux-image-realtime-hwe-26.04Upgrade linux-image-nvidia-7.0Upgrade linux-image-7.0.0-1007-gcp-64kUpgrade linux-image-ibmUpgrade linux-image-7.0.0-1007-oracle-64kUpgrade linux-image-virtual-7.0Upgrade linux-image-7.0.0-1014-raspiUpgrade linux-image-generic-64kUpgrade linux-image-generic-64k-7.0Upgrade linux-image-7.0.0-1007-oracleUpgrade linux-image-oem-24.04aUpgrade linux-image-genericUpgrade linux-image-nvidia-64kUpgrade linux-image-nvidiaUpgrade linux-image-oracle-64kUpgrade linux-image-7.0.0-1013-nvidiaUpgrade linux-image-ibm-7.0Upgrade linux-image-gcpUpgrade linux-image-raspi-realtimeUpgrade linux-image-nvidia-64k-7.0Upgrade linux-image-virtual | Jul 1, 2026 | May 27, 2026 |
With curated Threat Intelligence, you can see which vulnerabilities truly put you at risk, prioritize what matters most, and act before attackers do.
Explore Intelligence Hub