🇰🇷 한글 설명
Linux 커널의 Tegra241 CMDQV 드라이버에서 SMMU 드라이버 롤백 시 devres 콜백 순서가 잘못되어 dmam_free_coherent() 호출 중 경고(WARNING)가 발생하는 문제를 수정했습니다. 초기화 실패 시 불필요한 unwind 루틴을 제거하고, devres가 메모리 해제를 담당하도록 변경했습니다.
💡 쉬운 설명
NVIDIA Tegra241 칩의 메모리 관리 드라이버가 오류 발생 시 정리 순서를 잘못 처리해 커널 경고가 출력되던 문제입니다. 정리 방식을 바로잡아 경고가 나오지 않도록 고쳤습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
iommu/tegra241-cmdqv: Fix warnings due to dmam_free_coherent()
Two WARNINGs are observed when SMMU driver rolls back upon failure:
arm-smmu-v3.9.auto: Failed to register iommu
arm-smmu-v3.9.auto: probe with driver arm-smmu-v3 failed with error -22
------------[ cut here ]------------
WARNING: CPU: 5 PID: 1 at kernel/dma/mapping.c:74 dmam_free_coherent+0xc0/0xd8
Call trace:
dmam_free_coherent+0xc0/0xd8 (P)
tegra241_vintf_free_lvcmdq+0x74/0x188
tegra241_cmdqv_remove_vintf+0x60/0x148
tegra241_cmdqv_remove+0x48/0xc8
arm_smmu_impl_remove+0x28/0x60
devm_action_release+0x1c/0x40
------------[ cut here ]------------
128 pages are still in use!
WARNING: CPU: 16 PID: 1 at mm/page_alloc.c:6902 free_contig_range+0x18c/0x1c8
Call trace:
free_contig_range+0x18c/0x1c8 (P)
cma_release+0x154/0x2f0
dma_free_contiguous+0x38/0xa0
dma_direct_free+0x10c/0x248
dma_free_attrs+0x100/0x290
dmam_free_coherent+0x78/0xd8
tegra241_vintf_free_lvcmdq+0x74/0x160
tegra241_cmdqv_remove+0x98/0x198
arm_smmu_impl_remove+0x28/0x60
devm_action_release+0x1c/0x40
This is because the LVCMDQ queue memory are managed by devres, while that
dmam_free_coherent() is called in the context of devm_action_release().
Jason pointed out that "arm_smmu_impl_probe() has mis-ordered the devres
callbacks if ops->device_remove() is going to be manually freeing things
that probe allocated":
https://lore.kernel.org/linux-iommu/
[email protected]/
In fact, tegra241_cmdqv_init_structures() only allocates memory resources
which means any failure that it generates would be similar to -ENOMEM, so
there is no point in having that "falling back to standard SMMU" routine,
as the standard SMMU would likely fail to allocate memory too.
Remove the unwind part in tegra241_cmdqv_init_structures(), and return a
proper error code to ask SMMU driver to call tegra241_cmdqv_remove() via
impl_ops->device_remove(). Then, drop tegra241_vintf_free_lvcmdq() since
devres will take care of that.
📍 영향받는 시스템
Tegra241 CMDQV 기능을 사용하는 NVIDIA Tegra241(Grace 계열) 플랫폼에서 해당 수정이 적용되지 않은 Linux 커널 버전
⚔️ 공격 벡터
로컬 권한이나 원격 공격 경로가 확인되지 않은 커널 안정성(경고 출력) 결함으로, 직접적인 악용 방법은 보고되지 않았습니다
🛡️ 대응 방법
수정이 포함된 최신 Linux 커널 버전 또는 배포판 보안 업데이트로 업그레이드하십시오
🔧 검증 코드
출력된 커널 버전을 배포판 보안 공지 또는 커널 stable 브랜치의 수정 커밋 포함 여부와 비교하고, 해당 버전 이상이거나 수정 패치가 적용되었다면 안전합니다.