Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mballoc.h
Go to the documentation of this file.
1 /*
2  * fs/ext4/mballoc.h
3  *
4  * Written by: Alex Tomas <[email protected]>
5  *
6  */
7 #ifndef _EXT4_MBALLOC_H
8 #define _EXT4_MBALLOC_H
9 
10 #include <linux/time.h>
11 #include <linux/fs.h>
12 #include <linux/namei.h>
13 #include <linux/quotaops.h>
14 #include <linux/buffer_head.h>
15 #include <linux/module.h>
16 #include <linux/swap.h>
17 #include <linux/proc_fs.h>
18 #include <linux/pagemap.h>
19 #include <linux/seq_file.h>
20 #include <linux/blkdev.h>
21 #include <linux/mutex.h>
22 #include "ext4_jbd2.h"
23 #include "ext4.h"
24 
25 /*
26  * with AGGRESSIVE_CHECK allocator runs consistency checks over
27  * structures. these checks slow things down a lot
28  */
29 #define AGGRESSIVE_CHECK__
30 
31 /*
32  * with DOUBLE_CHECK defined mballoc creates persistent in-core
33  * bitmaps, maintains and uses them to check for double allocations
34  */
35 #define DOUBLE_CHECK__
36 
37 /*
38  */
39 #ifdef CONFIG_EXT4_DEBUG
40 extern u8 mb_enable_debug;
41 
42 #define mb_debug(n, fmt, a...) \
43  do { \
44  if ((n) <= mb_enable_debug) { \
45  printk(KERN_DEBUG "(%s, %d): %s: ", \
46  __FILE__, __LINE__, __func__); \
47  printk(fmt, ## a); \
48  } \
49  } while (0)
50 #else
51 #define mb_debug(n, fmt, a...)
52 #endif
53 
54 #define EXT4_MB_HISTORY_ALLOC 1 /* allocation */
55 #define EXT4_MB_HISTORY_PREALLOC 2 /* preallocated blocks used */
56 
57 /*
58  * How long mballoc can look for a best extent (in found extents)
59  */
60 #define MB_DEFAULT_MAX_TO_SCAN 200
61 
62 /*
63  * How long mballoc must look for a best extent
64  */
65 #define MB_DEFAULT_MIN_TO_SCAN 10
66 
67 /*
68  * with 'ext4_mb_stats' allocator will collect stats that will be
69  * shown at umount. The collecting costs though!
70  */
71 #define MB_DEFAULT_STATS 0
72 
73 /*
74  * files smaller than MB_DEFAULT_STREAM_THRESHOLD are served
75  * by the stream allocator, which purpose is to pack requests
76  * as close each to other as possible to produce smooth I/O traffic
77  * We use locality group prealloc space for stream request.
78  * We can tune the same via /proc/fs/ext4/<parition>/stream_req
79  */
80 #define MB_DEFAULT_STREAM_THRESHOLD 16 /* 64K */
81 
82 /*
83  * for which requests use 2^N search using buddies
84  */
85 #define MB_DEFAULT_ORDER2_REQS 2
86 
87 /*
88  * default group prealloc size 512 blocks
89  */
90 #define MB_DEFAULT_GROUP_PREALLOC 512
91 
92 
94  /* MUST be the first member */
96 
97  /* ext4_free_data private data starts from here */
98 
99  /* this links the free block information from group_info */
101 
102  /* group which free block extent belongs */
104 
105  /* free block extent */
108 
109  /* transaction which freed this extent */
111 };
112 
116  union {
118  struct rcu_head pa_rcu;
119  } u;
122  unsigned pa_deleted;
123  ext4_fsblk_t pa_pstart; /* phys. block */
124  ext4_lblk_t pa_lstart; /* log. block */
125  ext4_grpblk_t pa_len; /* len of preallocated chunk */
126  ext4_grpblk_t pa_free; /* how many blocks are free */
127  unsigned short pa_type; /* pa type. inode or group */
129  struct inode *pa_inode; /* hack, for history only */
130 };
131 
132 enum {
135 };
136 
139  ext4_grpblk_t fe_start; /* In cluster units */
141  ext4_grpblk_t fe_len; /* In cluster units */
142 };
143 
144 /*
145  * Locality group:
146  * we try to group all related changes together
147  * so that writeback can flush/allocate them together as well
148  * Size of lg_prealloc_list hash is determined by MB_DEFAULT_GROUP_PREALLOC
149  * (512). We store prealloc space into the hash based on the pa_free blocks
150  * order value.ie, fls(pa_free)-1;
151  */
152 #define PREALLOC_TB_SIZE 10
154  /* for allocator */
155  /* to serialize allocates */
156  struct mutex lg_mutex;
157  /* list of preallocations */
160 };
161 
163  struct inode *ac_inode;
165 
166  /* original request */
168 
169  /* goal request (normalized ac_o_ex) */
171 
172  /* the best found extent */
174 
175  /* copy of the best found extent taken before preallocation efforts */
177 
178  /* number of iterations done. we have to track to limit searching */
179  unsigned long ac_ex_scanned;
184  __u16 ac_flags; /* allocation hints */
187  __u8 ac_2order; /* if request is to allocate 2^N blocks and
188  * N > 0, the field stores N, otherwise 0 */
189  __u8 ac_op; /* operation, for history only */
194 };
195 
196 #define AC_STATUS_CONTINUE 1
197 #define AC_STATUS_FOUND 2
198 #define AC_STATUS_BREAK 3
199 
200 struct ext4_buddy {
202  void *bd_buddy;
204  void *bd_bitmap;
205  struct ext4_group_info *bd_info;
209 };
210 
211 static inline ext4_fsblk_t ext4_grp_offs_to_block(struct super_block *sb,
212  struct ext4_free_extent *fex)
213 {
214  return ext4_group_first_block_no(sb, fex->fe_group) +
215  (fex->fe_start << EXT4_SB(sb)->s_cluster_bits);
216 }
217 #endif