[PATCH v2 2/3] kernfs: Unmap mmaps of removed files via file->f_mapping
Krzysztof Wilczyński <[email protected]> Sat, 25 Jul 2026 21:05:48 +0000
| Newsgroups | org.infradead.lists.kexec,dev.linux.lists.driver-core,org.kernel.vger.linux-pci,org.kernel.vger.linux-sound,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
Currently, kernfs_drain_open_files() unmaps the mapping of the sysfs
inode, file_inode(of->file)->i_mapping, when a node with mmapped open
files is removed. Since commit 636b21b50152 ("PCI: Revoke mappings
like devmem"), PCI resource and legacy sysfs files swap their
f_mapping to iomem_get_mapping() at open time, so their VMAs are
attached to the shared iomem address space, which the drain never
unmaps.
As a result, userspace mappings of PCI BARs survive device removal
and BAR resize, keeping stale PTEs into physical address space that
the kernel may have reassigned since.
Thus, use unmap_mapping_file() for every open file, so that only the
VMAs of the node being removed are zapped, while unrelated mappings
are left intact. The same helper also covers files without a swapped
f_mapping, and the driver-claim revocation through revoke_iomem() is
unaffected, as those VMAs remain on the shared address space.
This restores the behaviour these files had before the f_mapping swap
was introduced. A read through a stale mapping after removal now
raises SIGBUS instead of returning stale data.
Fixes: 636b21b50152 ("PCI: Revoke mappings like devmem")
Signed-off-by: Krzysztof Wilczyński <[email protected]>
---
fs/kernfs/file.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c
index 8e0e90c93372..eb04439e9c3e 100644
--- a/fs/kernfs/file.c
+++ b/fs/kernfs/file.c
@@ -815,10 +815,8 @@ void kernfs_drain_open_files(struct kernfs_node *kn)
}
list_for_each_entry(of, &on->files, list) {
- struct inode *inode = file_inode(of->file);
-
if (of->mmapped) {
- unmap_mapping_range(inode->i_mapping, 0, 0, 1);
+ unmap_mapping_file(of->file);
of->mmapped = false;
on->nr_mmapped--;
}
--
2.55.0