162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
262306a36Sopenharmony_ci#ifndef _LINUX_SECRETMEM_H
362306a36Sopenharmony_ci#define _LINUX_SECRETMEM_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#ifdef CONFIG_SECRETMEM
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciextern const struct address_space_operations secretmem_aops;
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistatic inline bool folio_is_secretmem(struct folio *folio)
1062306a36Sopenharmony_ci{
1162306a36Sopenharmony_ci	struct address_space *mapping;
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci	/*
1462306a36Sopenharmony_ci	 * Using folio_mapping() is quite slow because of the actual call
1562306a36Sopenharmony_ci	 * instruction.
1662306a36Sopenharmony_ci	 * We know that secretmem pages are not compound and LRU so we can
1762306a36Sopenharmony_ci	 * save a couple of cycles here.
1862306a36Sopenharmony_ci	 */
1962306a36Sopenharmony_ci	if (folio_test_large(folio) || !folio_test_lru(folio))
2062306a36Sopenharmony_ci		return false;
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	mapping = (struct address_space *)
2362306a36Sopenharmony_ci		((unsigned long)folio->mapping & ~PAGE_MAPPING_FLAGS);
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	if (!mapping || mapping != folio->mapping)
2662306a36Sopenharmony_ci		return false;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	return mapping->a_ops == &secretmem_aops;
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cibool vma_is_secretmem(struct vm_area_struct *vma);
3262306a36Sopenharmony_cibool secretmem_active(void);
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#else
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cistatic inline bool vma_is_secretmem(struct vm_area_struct *vma)
3762306a36Sopenharmony_ci{
3862306a36Sopenharmony_ci	return false;
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistatic inline bool folio_is_secretmem(struct folio *folio)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	return false;
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic inline bool secretmem_active(void)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	return false;
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#endif /* CONFIG_SECRETMEM */
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#endif /* _LINUX_SECRETMEM_H */
54