summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorenzo Stoakes (ARM) <ljs@kernel.org>2026-09-08 12:23:39 +0100
committerAndrew Morton <akpm@linux-foundation.org>2026-09-13 21:31:59 -0700
commit11afc077ea3e754568ba953b7191f55d212c9e43 (patch)
treec080d44af9d0acb9b4b4504142c77c32c73ef6c3
parent6a2509521d2b309a7c7ca4f4b41bc0c5aaeb76cb (diff)
downloadlinux-next-11afc077ea3e754568ba953b7191f55d212c9e43.tar.gz
linux-next-11afc077ea3e754568ba953b7191f55d212c9e43.zip
mm: implement file_is_dev_zero() to uniquely identify /dev/zero
To lay the foundation for a future change that converts MAP_PRIVATE-/dev/zero mappings to be truly anonymous, add the ability to uniquely identify these mappings. With the memory character device now part of mm/ this is trivially achievable through a file_is_dev_zero() predicate that simply tests that the file operation hooks are zero_fops. Also update userland VMA tests to expose file_is_dev_zero() and provide a stub zero_fops for testing. Link: https://lore.kernel.org/20260908-map-private-dev-zero-v2-2-acc7b5625305@kernel.org Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Acked-by: David Hildenbrand (Arm) <david@kernel.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Baolin Wang <baolin.wang@linux.alibaba.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Hugh Dickins <hughd@google.com> Cc: Jan Kara <jack@suse.cz> Cc: Jann Horn <jannh@google.com> Cc: Liam R. Howlett <liam@infradead.org> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Michal Hocko <mhocko@suse.com> Cc: Mike Rapoport (Microsoft) <rppt@kernel.org> Cc: Pedro Falcato <pfalcato@suse.de> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Vlastimil Babka <vbabka@kernel.org>
-rw-r--r--mm/char-mem.c13
-rw-r--r--mm/internal.h3
-rw-r--r--tools/testing/vma/include/dup.h7
-rw-r--r--tools/testing/vma/shared.c9
4 files changed, 32 insertions, 0 deletions
diff --git a/mm/char-mem.c b/mm/char-mem.c
index d2e575545044..e53e89e6ddd8 100644
--- a/mm/char-mem.c
+++ b/mm/char-mem.c
@@ -31,6 +31,8 @@
#include <linux/uaccess.h>
#include <linux/security.h>
+#include "internal.h"
+
#define DEVMEM_MINOR 1
#define DEVPORT_MINOR 4
@@ -707,6 +709,17 @@ static const struct memdev {
#endif
};
+/**
+ * file_is_dev_zero() - is the specified @file associated with the /dev/zero
+ * driver?
+ * @file: File to test.
+ * Returns: true if it is, false otherwise.
+ */
+bool file_is_dev_zero(const struct file *file)
+{
+ return file && file->f_op == &zero_fops;
+}
+
static int memory_open(struct inode *inode, struct file *filp)
{
int minor;
diff --git a/mm/internal.h b/mm/internal.h
index e16f1250b25c..5d474e5f7709 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -1638,4 +1638,7 @@ static inline bool can_spin_trylock(void)
return true;
}
+/* char-mem.c */
+bool file_is_dev_zero(const struct file *file);
+
#endif /* __MM_INTERNAL_H */
diff --git a/tools/testing/vma/include/dup.h b/tools/testing/vma/include/dup.h
index 57046d8ac81d..0d1a2ac88922 100644
--- a/tools/testing/vma/include/dup.h
+++ b/tools/testing/vma/include/dup.h
@@ -1641,3 +1641,10 @@ static inline pgoff_t linear_anon_page_index(const struct vm_area_struct *vma,
return pgoff;
}
+
+extern const struct file_operations zero_fops;
+
+static inline bool file_is_dev_zero(const struct file *file)
+{
+ return file && file->f_op == &zero_fops;
+}
diff --git a/tools/testing/vma/shared.c b/tools/testing/vma/shared.c
index 4a39c9d50489..8c4826499f40 100644
--- a/tools/testing/vma/shared.c
+++ b/tools/testing/vma/shared.c
@@ -12,6 +12,15 @@ const struct vm_operations_struct vma_dummy_vm_ops;
struct anon_vma dummy_anon_vma;
struct task_struct __current;
+static int mmap_zero_prepare(struct vm_area_desc *desc)
+{
+ return 0;
+}
+
+const struct file_operations zero_fops = {
+ .mmap_prepare = mmap_zero_prepare,
+};
+
struct vm_area_struct *alloc_vma(struct mm_struct *mm,
unsigned long start, unsigned long end,
pgoff_t pgoff, vma_flags_t vma_flags)