1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2#ifndef _LINUX_SECRETMEM_H
3#define _LINUX_SECRETMEM_H
4
5#ifdef CONFIG_SECRETMEM
6
7extern const struct address_space_operations secretmem_aops;
8
9static inline bool folio_is_secretmem(struct folio *folio)
10{
11	struct address_space *mapping;
12
13	/*
14	 * Using folio_mapping() is quite slow because of the actual call
15	 * instruction.
16	 * We know that secretmem pages are not compound, so we can
17	 * save a couple of cycles here.
18	 */
19	if (folio_test_large(folio))
20		return false;
21
22	mapping = (struct address_space *)
23		((unsigned long)folio->mapping & ~PAGE_MAPPING_FLAGS);
24
25	if (!mapping || mapping != folio->mapping)
26		return false;
27
28	return mapping->a_ops == &secretmem_aops;
29}
30
31bool vma_is_secretmem(struct vm_area_struct *vma);
32bool secretmem_active(void);
33
34#else
35
36static inline bool vma_is_secretmem(struct vm_area_struct *vma)
37{
38	return false;
39}
40
41static inline bool folio_is_secretmem(struct folio *folio)
42{
43	return false;
44}
45
46static inline bool secretmem_active(void)
47{
48	return false;
49}
50
51#endif /* CONFIG_SECRETMEM */
52
53#endif /* _LINUX_SECRETMEM_H */
54