cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

frontswap.h (2220B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _LINUX_FRONTSWAP_H
      3#define _LINUX_FRONTSWAP_H
      4
      5#include <linux/swap.h>
      6#include <linux/mm.h>
      7#include <linux/bitops.h>
      8#include <linux/jump_label.h>
      9
     10struct frontswap_ops {
     11	void (*init)(unsigned); /* this swap type was just swapon'ed */
     12	int (*store)(unsigned, pgoff_t, struct page *); /* store a page */
     13	int (*load)(unsigned, pgoff_t, struct page *); /* load a page */
     14	void (*invalidate_page)(unsigned, pgoff_t); /* page no longer needed */
     15	void (*invalidate_area)(unsigned); /* swap type just swapoff'ed */
     16};
     17
     18int frontswap_register_ops(const struct frontswap_ops *ops);
     19
     20extern void frontswap_init(unsigned type, unsigned long *map);
     21extern int __frontswap_store(struct page *page);
     22extern int __frontswap_load(struct page *page);
     23extern void __frontswap_invalidate_page(unsigned, pgoff_t);
     24extern void __frontswap_invalidate_area(unsigned);
     25
     26#ifdef CONFIG_FRONTSWAP
     27extern struct static_key_false frontswap_enabled_key;
     28
     29static inline bool frontswap_enabled(void)
     30{
     31	return static_branch_unlikely(&frontswap_enabled_key);
     32}
     33
     34static inline void frontswap_map_set(struct swap_info_struct *p,
     35				     unsigned long *map)
     36{
     37	p->frontswap_map = map;
     38}
     39
     40static inline unsigned long *frontswap_map_get(struct swap_info_struct *p)
     41{
     42	return p->frontswap_map;
     43}
     44#else
     45/* all inline routines become no-ops and all externs are ignored */
     46
     47static inline bool frontswap_enabled(void)
     48{
     49	return false;
     50}
     51
     52static inline void frontswap_map_set(struct swap_info_struct *p,
     53				     unsigned long *map)
     54{
     55}
     56
     57static inline unsigned long *frontswap_map_get(struct swap_info_struct *p)
     58{
     59	return NULL;
     60}
     61#endif
     62
     63static inline int frontswap_store(struct page *page)
     64{
     65	if (frontswap_enabled())
     66		return __frontswap_store(page);
     67
     68	return -1;
     69}
     70
     71static inline int frontswap_load(struct page *page)
     72{
     73	if (frontswap_enabled())
     74		return __frontswap_load(page);
     75
     76	return -1;
     77}
     78
     79static inline void frontswap_invalidate_page(unsigned type, pgoff_t offset)
     80{
     81	if (frontswap_enabled())
     82		__frontswap_invalidate_page(type, offset);
     83}
     84
     85static inline void frontswap_invalidate_area(unsigned type)
     86{
     87	if (frontswap_enabled())
     88		__frontswap_invalidate_area(type);
     89}
     90
     91#endif /* _LINUX_FRONTSWAP_H */