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

mballoc.h (6031B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 *  fs/ext4/mballoc.h
      4 *
      5 *  Written by: Alex Tomas <alex@clusterfs.com>
      6 *
      7 */
      8#ifndef _EXT4_MBALLOC_H
      9#define _EXT4_MBALLOC_H
     10
     11#include <linux/time.h>
     12#include <linux/fs.h>
     13#include <linux/namei.h>
     14#include <linux/quotaops.h>
     15#include <linux/buffer_head.h>
     16#include <linux/module.h>
     17#include <linux/swap.h>
     18#include <linux/proc_fs.h>
     19#include <linux/pagemap.h>
     20#include <linux/seq_file.h>
     21#include <linux/blkdev.h>
     22#include <linux/mutex.h>
     23#include "ext4_jbd2.h"
     24#include "ext4.h"
     25
     26/*
     27 * mb_debug() dynamic printk msgs could be used to debug mballoc code.
     28 */
     29#ifdef CONFIG_EXT4_DEBUG
     30#define mb_debug(sb, fmt, ...)						\
     31	pr_debug("[%s/%d] EXT4-fs (%s): (%s, %d): %s: " fmt,		\
     32		current->comm, task_pid_nr(current), sb->s_id,		\
     33	       __FILE__, __LINE__, __func__, ##__VA_ARGS__)
     34#else
     35#define mb_debug(sb, fmt, ...)	no_printk(fmt, ##__VA_ARGS__)
     36#endif
     37
     38#define EXT4_MB_HISTORY_ALLOC		1	/* allocation */
     39#define EXT4_MB_HISTORY_PREALLOC	2	/* preallocated blocks used */
     40
     41/*
     42 * How long mballoc can look for a best extent (in found extents)
     43 */
     44#define MB_DEFAULT_MAX_TO_SCAN		200
     45
     46/*
     47 * How long mballoc must look for a best extent
     48 */
     49#define MB_DEFAULT_MIN_TO_SCAN		10
     50
     51/*
     52 * with 'ext4_mb_stats' allocator will collect stats that will be
     53 * shown at umount. The collecting costs though!
     54 */
     55#define MB_DEFAULT_STATS		0
     56
     57/*
     58 * files smaller than MB_DEFAULT_STREAM_THRESHOLD are served
     59 * by the stream allocator, which purpose is to pack requests
     60 * as close each to other as possible to produce smooth I/O traffic
     61 * We use locality group prealloc space for stream request.
     62 * We can tune the same via /proc/fs/ext4/<partition>/stream_req
     63 */
     64#define MB_DEFAULT_STREAM_THRESHOLD	16	/* 64K */
     65
     66/*
     67 * for which requests use 2^N search using buddies
     68 */
     69#define MB_DEFAULT_ORDER2_REQS		2
     70
     71/*
     72 * default group prealloc size 512 blocks
     73 */
     74#define MB_DEFAULT_GROUP_PREALLOC	512
     75
     76/*
     77 * maximum length of inode prealloc list
     78 */
     79#define MB_DEFAULT_MAX_INODE_PREALLOC	512
     80
     81/*
     82 * Number of groups to search linearly before performing group scanning
     83 * optimization.
     84 */
     85#define MB_DEFAULT_LINEAR_LIMIT		4
     86
     87/*
     88 * Minimum number of groups that should be present in the file system to perform
     89 * group scanning optimizations.
     90 */
     91#define MB_DEFAULT_LINEAR_SCAN_THRESHOLD	16
     92
     93/*
     94 * Number of valid buddy orders
     95 */
     96#define MB_NUM_ORDERS(sb)		((sb)->s_blocksize_bits + 2)
     97
     98struct ext4_free_data {
     99	/* this links the free block information from sb_info */
    100	struct list_head		efd_list;
    101
    102	/* this links the free block information from group_info */
    103	struct rb_node			efd_node;
    104
    105	/* group which free block extent belongs */
    106	ext4_group_t			efd_group;
    107
    108	/* free block extent */
    109	ext4_grpblk_t			efd_start_cluster;
    110	ext4_grpblk_t			efd_count;
    111
    112	/* transaction which freed this extent */
    113	tid_t				efd_tid;
    114};
    115
    116struct ext4_prealloc_space {
    117	struct list_head	pa_inode_list;
    118	struct list_head	pa_group_list;
    119	union {
    120		struct list_head pa_tmp_list;
    121		struct rcu_head	pa_rcu;
    122	} u;
    123	spinlock_t		pa_lock;
    124	atomic_t		pa_count;
    125	unsigned		pa_deleted;
    126	ext4_fsblk_t		pa_pstart;	/* phys. block */
    127	ext4_lblk_t		pa_lstart;	/* log. block */
    128	ext4_grpblk_t		pa_len;		/* len of preallocated chunk */
    129	ext4_grpblk_t		pa_free;	/* how many blocks are free */
    130	unsigned short		pa_type;	/* pa type. inode or group */
    131	spinlock_t		*pa_obj_lock;
    132	struct inode		*pa_inode;	/* hack, for history only */
    133};
    134
    135enum {
    136	MB_INODE_PA = 0,
    137	MB_GROUP_PA = 1
    138};
    139
    140struct ext4_free_extent {
    141	ext4_lblk_t fe_logical;
    142	ext4_grpblk_t fe_start;	/* In cluster units */
    143	ext4_group_t fe_group;
    144	ext4_grpblk_t fe_len;	/* In cluster units */
    145};
    146
    147/*
    148 * Locality group:
    149 *   we try to group all related changes together
    150 *   so that writeback can flush/allocate them together as well
    151 *   Size of lg_prealloc_list hash is determined by MB_DEFAULT_GROUP_PREALLOC
    152 *   (512). We store prealloc space into the hash based on the pa_free blocks
    153 *   order value.ie, fls(pa_free)-1;
    154 */
    155#define PREALLOC_TB_SIZE 10
    156struct ext4_locality_group {
    157	/* for allocator */
    158	/* to serialize allocates */
    159	struct mutex		lg_mutex;
    160	/* list of preallocations */
    161	struct list_head	lg_prealloc_list[PREALLOC_TB_SIZE];
    162	spinlock_t		lg_prealloc_lock;
    163};
    164
    165struct ext4_allocation_context {
    166	struct inode *ac_inode;
    167	struct super_block *ac_sb;
    168
    169	/* original request */
    170	struct ext4_free_extent ac_o_ex;
    171
    172	/* goal request (normalized ac_o_ex) */
    173	struct ext4_free_extent ac_g_ex;
    174
    175	/* the best found extent */
    176	struct ext4_free_extent ac_b_ex;
    177
    178	/* copy of the best found extent taken before preallocation efforts */
    179	struct ext4_free_extent ac_f_ex;
    180
    181	ext4_group_t ac_last_optimal_group;
    182	__u32 ac_groups_considered;
    183	__u32 ac_flags;		/* allocation hints */
    184	__u16 ac_groups_scanned;
    185	__u16 ac_groups_linear_remaining;
    186	__u16 ac_found;
    187	__u16 ac_tail;
    188	__u16 ac_buddy;
    189	__u8 ac_status;
    190	__u8 ac_criteria;
    191	__u8 ac_2order;		/* if request is to allocate 2^N blocks and
    192				 * N > 0, the field stores N, otherwise 0 */
    193	__u8 ac_op;		/* operation, for history only */
    194	struct page *ac_bitmap_page;
    195	struct page *ac_buddy_page;
    196	struct ext4_prealloc_space *ac_pa;
    197	struct ext4_locality_group *ac_lg;
    198};
    199
    200#define AC_STATUS_CONTINUE	1
    201#define AC_STATUS_FOUND		2
    202#define AC_STATUS_BREAK		3
    203
    204struct ext4_buddy {
    205	struct page *bd_buddy_page;
    206	void *bd_buddy;
    207	struct page *bd_bitmap_page;
    208	void *bd_bitmap;
    209	struct ext4_group_info *bd_info;
    210	struct super_block *bd_sb;
    211	__u16 bd_blkbits;
    212	ext4_group_t bd_group;
    213};
    214
    215static inline ext4_fsblk_t ext4_grp_offs_to_block(struct super_block *sb,
    216					struct ext4_free_extent *fex)
    217{
    218	return ext4_group_first_block_no(sb, fex->fe_group) +
    219		(fex->fe_start << EXT4_SB(sb)->s_cluster_bits);
    220}
    221
    222typedef int (*ext4_mballoc_query_range_fn)(
    223	struct super_block		*sb,
    224	ext4_group_t			agno,
    225	ext4_grpblk_t			start,
    226	ext4_grpblk_t			len,
    227	void				*priv);
    228
    229int
    230ext4_mballoc_query_range(
    231	struct super_block		*sb,
    232	ext4_group_t			agno,
    233	ext4_grpblk_t			start,
    234	ext4_grpblk_t			end,
    235	ext4_mballoc_query_range_fn	formatter,
    236	void				*priv);
    237
    238#endif