• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * f2fs extent cache support
4  *
5  * Copyright (c) 2015 Motorola Mobility
6  * Copyright (c) 2015 Samsung Electronics
7  * Authors: Jaegeuk Kim <jaegeuk@kernel.org>
8  *          Chao Yu <chao2.yu@samsung.com>
9  *
10  * block_age-based extent cache added by:
11  * Copyright (c) 2022 xiaomi Co., Ltd.
12  *             http://www.xiaomi.com/
13  */
14 
15 #include <linux/fs.h>
16 #include <linux/f2fs_fs.h>
17 
18 #include "f2fs.h"
19 #include "node.h"
20 #include <trace/events/f2fs.h>
21 
sanity_check_extent_cache(struct inode * inode,struct page * ipage)22 bool sanity_check_extent_cache(struct inode *inode, struct page *ipage)
23 {
24 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
25 	struct f2fs_extent *i_ext = &F2FS_INODE(ipage)->i_ext;
26 	struct extent_info ei;
27 
28 	get_read_extent_info(&ei, i_ext);
29 
30 	if (!ei.len)
31 		return true;
32 
33 	if (!f2fs_is_valid_blkaddr(sbi, ei.blk, DATA_GENERIC_ENHANCE) ||
34 	    !f2fs_is_valid_blkaddr(sbi, ei.blk + ei.len - 1,
35 					DATA_GENERIC_ENHANCE)) {
36 		f2fs_warn(sbi, "%s: inode (ino=%lx) extent info [%u, %u, %u] is incorrect, run fsck to fix",
37 			  __func__, inode->i_ino,
38 			  ei.blk, ei.fofs, ei.len);
39 		return false;
40 	}
41 	return true;
42 }
43 
__set_extent_info(struct extent_info * ei,unsigned int fofs,unsigned int len,block_t blk,bool keep_clen,unsigned long age,unsigned long last_blocks,enum extent_type type)44 static void __set_extent_info(struct extent_info *ei,
45 				unsigned int fofs, unsigned int len,
46 				block_t blk, bool keep_clen,
47 				unsigned long age, unsigned long last_blocks,
48 				enum extent_type type)
49 {
50 	ei->fofs = fofs;
51 	ei->len = len;
52 
53 	if (type == EX_READ) {
54 		ei->blk = blk;
55 		if (keep_clen)
56 			return;
57 #ifdef CONFIG_F2FS_FS_COMPRESSION
58 		ei->c_len = 0;
59 #endif
60 	} else if (type == EX_BLOCK_AGE) {
61 		ei->age = age;
62 		ei->last_blocks = last_blocks;
63 	}
64 }
65 
__init_may_extent_tree(struct inode * inode,enum extent_type type)66 static bool __init_may_extent_tree(struct inode *inode, enum extent_type type)
67 {
68 	if (type == EX_READ)
69 		return test_opt(F2FS_I_SB(inode), READ_EXTENT_CACHE) &&
70 			S_ISREG(inode->i_mode);
71 	if (type == EX_BLOCK_AGE)
72 		return test_opt(F2FS_I_SB(inode), AGE_EXTENT_CACHE) &&
73 			(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode));
74 	return false;
75 }
76 
__may_extent_tree(struct inode * inode,enum extent_type type)77 static bool __may_extent_tree(struct inode *inode, enum extent_type type)
78 {
79 	/*
80 	 * for recovered files during mount do not create extents
81 	 * if shrinker is not registered.
82 	 */
83 	if (list_empty(&F2FS_I_SB(inode)->s_list))
84 		return false;
85 
86 	if (!__init_may_extent_tree(inode, type))
87 		return false;
88 
89 	if (type == EX_READ) {
90 		if (is_inode_flag_set(inode, FI_NO_EXTENT))
91 			return false;
92 		if (is_inode_flag_set(inode, FI_COMPRESSED_FILE) &&
93 				 !f2fs_sb_has_readonly(F2FS_I_SB(inode)))
94 			return false;
95 	} else if (type == EX_BLOCK_AGE) {
96 		if (is_inode_flag_set(inode, FI_COMPRESSED_FILE))
97 			return false;
98 		if (file_is_cold(inode))
99 			return false;
100 	}
101 	return true;
102 }
103 
__try_update_largest_extent(struct extent_tree * et,struct extent_node * en)104 static void __try_update_largest_extent(struct extent_tree *et,
105 						struct extent_node *en)
106 {
107 	if (et->type != EX_READ)
108 		return;
109 	if (en->ei.len <= et->largest.len)
110 		return;
111 
112 	et->largest = en->ei;
113 	et->largest_updated = true;
114 }
115 
__is_extent_mergeable(struct extent_info * back,struct extent_info * front,enum extent_type type)116 static bool __is_extent_mergeable(struct extent_info *back,
117 		struct extent_info *front, enum extent_type type)
118 {
119 	if (type == EX_READ) {
120 #ifdef CONFIG_F2FS_FS_COMPRESSION
121 		if (back->c_len && back->len != back->c_len)
122 			return false;
123 		if (front->c_len && front->len != front->c_len)
124 			return false;
125 #endif
126 		return (back->fofs + back->len == front->fofs &&
127 				back->blk + back->len == front->blk);
128 	} else if (type == EX_BLOCK_AGE) {
129 		return (back->fofs + back->len == front->fofs &&
130 			abs(back->age - front->age) <= SAME_AGE_REGION &&
131 			abs(back->last_blocks - front->last_blocks) <=
132 							SAME_AGE_REGION);
133 	}
134 	return false;
135 }
136 
__is_back_mergeable(struct extent_info * cur,struct extent_info * back,enum extent_type type)137 static bool __is_back_mergeable(struct extent_info *cur,
138 		struct extent_info *back, enum extent_type type)
139 {
140 	return __is_extent_mergeable(back, cur, type);
141 }
142 
__is_front_mergeable(struct extent_info * cur,struct extent_info * front,enum extent_type type)143 static bool __is_front_mergeable(struct extent_info *cur,
144 		struct extent_info *front, enum extent_type type)
145 {
146 	return __is_extent_mergeable(cur, front, type);
147 }
148 
__lookup_extent_node(struct rb_root_cached * root,struct extent_node * cached_en,unsigned int fofs)149 static struct extent_node *__lookup_extent_node(struct rb_root_cached *root,
150 			struct extent_node *cached_en, unsigned int fofs)
151 {
152 	struct rb_node *node = root->rb_root.rb_node;
153 	struct extent_node *en;
154 
155 	/* check a cached entry */
156 	if (cached_en && cached_en->ei.fofs <= fofs &&
157 			cached_en->ei.fofs + cached_en->ei.len > fofs)
158 		return cached_en;
159 
160 	/* check rb_tree */
161 	while (node) {
162 		en = rb_entry(node, struct extent_node, rb_node);
163 
164 		if (fofs < en->ei.fofs)
165 			node = node->rb_left;
166 		else if (fofs >= en->ei.fofs + en->ei.len)
167 			node = node->rb_right;
168 		else
169 			return en;
170 	}
171 	return NULL;
172 }
173 
174 /*
175  * lookup rb entry in position of @fofs in rb-tree,
176  * if hit, return the entry, otherwise, return NULL
177  * @prev_ex: extent before fofs
178  * @next_ex: extent after fofs
179  * @insert_p: insert point for new extent at fofs
180  * in order to simplify the insertion after.
181  * tree must stay unchanged between lookup and insertion.
182  */
__lookup_extent_node_ret(struct rb_root_cached * root,struct extent_node * cached_en,unsigned int fofs,struct extent_node ** prev_entry,struct extent_node ** next_entry,struct rb_node *** insert_p,struct rb_node ** insert_parent,bool * leftmost)183 static struct extent_node *__lookup_extent_node_ret(struct rb_root_cached *root,
184 				struct extent_node *cached_en,
185 				unsigned int fofs,
186 				struct extent_node **prev_entry,
187 				struct extent_node **next_entry,
188 				struct rb_node ***insert_p,
189 				struct rb_node **insert_parent,
190 				bool *leftmost)
191 {
192 	struct rb_node **pnode = &root->rb_root.rb_node;
193 	struct rb_node *parent = NULL, *tmp_node;
194 	struct extent_node *en = cached_en;
195 
196 	*insert_p = NULL;
197 	*insert_parent = NULL;
198 	*prev_entry = NULL;
199 	*next_entry = NULL;
200 
201 	if (RB_EMPTY_ROOT(&root->rb_root))
202 		return NULL;
203 
204 	if (en && en->ei.fofs <= fofs && en->ei.fofs + en->ei.len > fofs)
205 		goto lookup_neighbors;
206 
207 	*leftmost = true;
208 
209 	while (*pnode) {
210 		parent = *pnode;
211 		en = rb_entry(*pnode, struct extent_node, rb_node);
212 
213 		if (fofs < en->ei.fofs) {
214 			pnode = &(*pnode)->rb_left;
215 		} else if (fofs >= en->ei.fofs + en->ei.len) {
216 			pnode = &(*pnode)->rb_right;
217 			*leftmost = false;
218 		} else {
219 			goto lookup_neighbors;
220 		}
221 	}
222 
223 	*insert_p = pnode;
224 	*insert_parent = parent;
225 
226 	en = rb_entry(parent, struct extent_node, rb_node);
227 	tmp_node = parent;
228 	if (parent && fofs > en->ei.fofs)
229 		tmp_node = rb_next(parent);
230 	*next_entry = rb_entry_safe(tmp_node, struct extent_node, rb_node);
231 
232 	tmp_node = parent;
233 	if (parent && fofs < en->ei.fofs)
234 		tmp_node = rb_prev(parent);
235 	*prev_entry = rb_entry_safe(tmp_node, struct extent_node, rb_node);
236 	return NULL;
237 
238 lookup_neighbors:
239 	if (fofs == en->ei.fofs) {
240 		/* lookup prev node for merging backward later */
241 		tmp_node = rb_prev(&en->rb_node);
242 		*prev_entry = rb_entry_safe(tmp_node,
243 					struct extent_node, rb_node);
244 	}
245 	if (fofs == en->ei.fofs + en->ei.len - 1) {
246 		/* lookup next node for merging frontward later */
247 		tmp_node = rb_next(&en->rb_node);
248 		*next_entry = rb_entry_safe(tmp_node,
249 					struct extent_node, rb_node);
250 	}
251 	return en;
252 }
253 
254 static struct kmem_cache *extent_tree_slab;
255 static struct kmem_cache *extent_node_slab;
256 
__attach_extent_node(struct f2fs_sb_info * sbi,struct extent_tree * et,struct extent_info * ei,struct rb_node * parent,struct rb_node ** p,bool leftmost)257 static struct extent_node *__attach_extent_node(struct f2fs_sb_info *sbi,
258 				struct extent_tree *et, struct extent_info *ei,
259 				struct rb_node *parent, struct rb_node **p,
260 				bool leftmost)
261 {
262 	struct extent_tree_info *eti = &sbi->extent_tree[et->type];
263 	struct extent_node *en;
264 
265 	en = f2fs_kmem_cache_alloc(extent_node_slab, GFP_ATOMIC, false, sbi);
266 	if (!en)
267 		return NULL;
268 
269 	en->ei = *ei;
270 	INIT_LIST_HEAD(&en->list);
271 	en->et = et;
272 
273 	rb_link_node(&en->rb_node, parent, p);
274 	rb_insert_color_cached(&en->rb_node, &et->root, leftmost);
275 	atomic_inc(&et->node_cnt);
276 	atomic_inc(&eti->total_ext_node);
277 	return en;
278 }
279 
__detach_extent_node(struct f2fs_sb_info * sbi,struct extent_tree * et,struct extent_node * en)280 static void __detach_extent_node(struct f2fs_sb_info *sbi,
281 				struct extent_tree *et, struct extent_node *en)
282 {
283 	struct extent_tree_info *eti = &sbi->extent_tree[et->type];
284 
285 	rb_erase_cached(&en->rb_node, &et->root);
286 	atomic_dec(&et->node_cnt);
287 	atomic_dec(&eti->total_ext_node);
288 
289 	if (et->cached_en == en)
290 		et->cached_en = NULL;
291 	kmem_cache_free(extent_node_slab, en);
292 }
293 
294 /*
295  * Flow to release an extent_node:
296  * 1. list_del_init
297  * 2. __detach_extent_node
298  * 3. kmem_cache_free.
299  */
__release_extent_node(struct f2fs_sb_info * sbi,struct extent_tree * et,struct extent_node * en)300 static void __release_extent_node(struct f2fs_sb_info *sbi,
301 			struct extent_tree *et, struct extent_node *en)
302 {
303 	struct extent_tree_info *eti = &sbi->extent_tree[et->type];
304 
305 	spin_lock(&eti->extent_lock);
306 	f2fs_bug_on(sbi, list_empty(&en->list));
307 	list_del_init(&en->list);
308 	spin_unlock(&eti->extent_lock);
309 
310 	__detach_extent_node(sbi, et, en);
311 }
312 
__grab_extent_tree(struct inode * inode,enum extent_type type)313 static struct extent_tree *__grab_extent_tree(struct inode *inode,
314 						enum extent_type type)
315 {
316 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
317 	struct extent_tree_info *eti = &sbi->extent_tree[type];
318 	struct extent_tree *et;
319 	nid_t ino = inode->i_ino;
320 
321 	mutex_lock(&eti->extent_tree_lock);
322 	et = radix_tree_lookup(&eti->extent_tree_root, ino);
323 	if (!et) {
324 		et = f2fs_kmem_cache_alloc(extent_tree_slab,
325 					GFP_NOFS, true, NULL);
326 		f2fs_radix_tree_insert(&eti->extent_tree_root, ino, et);
327 		memset(et, 0, sizeof(struct extent_tree));
328 		et->ino = ino;
329 		et->type = type;
330 		et->root = RB_ROOT_CACHED;
331 		et->cached_en = NULL;
332 		rwlock_init(&et->lock);
333 		INIT_LIST_HEAD(&et->list);
334 		atomic_set(&et->node_cnt, 0);
335 		atomic_inc(&eti->total_ext_tree);
336 	} else {
337 		atomic_dec(&eti->total_zombie_tree);
338 		list_del_init(&et->list);
339 	}
340 	mutex_unlock(&eti->extent_tree_lock);
341 
342 	/* never died until evict_inode */
343 	F2FS_I(inode)->extent_tree[type] = et;
344 
345 	return et;
346 }
347 
__free_extent_tree(struct f2fs_sb_info * sbi,struct extent_tree * et)348 static unsigned int __free_extent_tree(struct f2fs_sb_info *sbi,
349 					struct extent_tree *et)
350 {
351 	struct rb_node *node, *next;
352 	struct extent_node *en;
353 	unsigned int count = atomic_read(&et->node_cnt);
354 
355 	node = rb_first_cached(&et->root);
356 	while (node) {
357 		next = rb_next(node);
358 		en = rb_entry(node, struct extent_node, rb_node);
359 		__release_extent_node(sbi, et, en);
360 		node = next;
361 	}
362 
363 	return count - atomic_read(&et->node_cnt);
364 }
365 
__drop_largest_extent(struct extent_tree * et,pgoff_t fofs,unsigned int len)366 static void __drop_largest_extent(struct extent_tree *et,
367 					pgoff_t fofs, unsigned int len)
368 {
369 	if (fofs < et->largest.fofs + et->largest.len &&
370 			fofs + len > et->largest.fofs) {
371 		et->largest.len = 0;
372 		et->largest_updated = true;
373 	}
374 }
375 
f2fs_init_read_extent_tree(struct inode * inode,struct page * ipage)376 void f2fs_init_read_extent_tree(struct inode *inode, struct page *ipage)
377 {
378 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
379 	struct extent_tree_info *eti = &sbi->extent_tree[EX_READ];
380 	struct f2fs_extent *i_ext = &F2FS_INODE(ipage)->i_ext;
381 	struct extent_tree *et;
382 	struct extent_node *en;
383 	struct extent_info ei;
384 
385 	if (!__may_extent_tree(inode, EX_READ)) {
386 		/* drop largest read extent */
387 		if (i_ext->len) {
388 			f2fs_wait_on_page_writeback(ipage, NODE, true, true);
389 			i_ext->len = 0;
390 			set_page_dirty(ipage);
391 		}
392 		set_inode_flag(inode, FI_NO_EXTENT);
393 		return;
394 	}
395 
396 	et = __grab_extent_tree(inode, EX_READ);
397 
398 	get_read_extent_info(&ei, i_ext);
399 
400 	write_lock(&et->lock);
401 	if (atomic_read(&et->node_cnt) || !ei.len)
402 		goto skip;
403 
404 	en = __attach_extent_node(sbi, et, &ei, NULL,
405 				&et->root.rb_root.rb_node, true);
406 	if (en) {
407 		et->largest = en->ei;
408 		et->cached_en = en;
409 
410 		spin_lock(&eti->extent_lock);
411 		list_add_tail(&en->list, &eti->extent_list);
412 		spin_unlock(&eti->extent_lock);
413 	}
414 skip:
415 	/* Let's drop, if checkpoint got corrupted. */
416 	if (f2fs_cp_error(sbi)) {
417 		et->largest.len = 0;
418 		et->largest_updated = true;
419 	}
420 	write_unlock(&et->lock);
421 }
422 
f2fs_init_age_extent_tree(struct inode * inode)423 void f2fs_init_age_extent_tree(struct inode *inode)
424 {
425 	if (!__init_may_extent_tree(inode, EX_BLOCK_AGE))
426 		return;
427 	__grab_extent_tree(inode, EX_BLOCK_AGE);
428 }
429 
f2fs_init_extent_tree(struct inode * inode)430 void f2fs_init_extent_tree(struct inode *inode)
431 {
432 	/* initialize read cache */
433 	if (__init_may_extent_tree(inode, EX_READ))
434 		__grab_extent_tree(inode, EX_READ);
435 
436 	/* initialize block age cache */
437 	if (__init_may_extent_tree(inode, EX_BLOCK_AGE))
438 		__grab_extent_tree(inode, EX_BLOCK_AGE);
439 }
440 
__lookup_extent_tree(struct inode * inode,pgoff_t pgofs,struct extent_info * ei,enum extent_type type)441 static bool __lookup_extent_tree(struct inode *inode, pgoff_t pgofs,
442 			struct extent_info *ei, enum extent_type type)
443 {
444 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
445 	struct extent_tree_info *eti = &sbi->extent_tree[type];
446 	struct extent_tree *et = F2FS_I(inode)->extent_tree[type];
447 	struct extent_node *en;
448 	bool ret = false;
449 
450 	if (!et)
451 		return false;
452 
453 	trace_f2fs_lookup_extent_tree_start(inode, pgofs, type);
454 
455 	read_lock(&et->lock);
456 
457 	if (type == EX_READ &&
458 			et->largest.fofs <= pgofs &&
459 			et->largest.fofs + et->largest.len > pgofs) {
460 		*ei = et->largest;
461 		ret = true;
462 		stat_inc_largest_node_hit(sbi);
463 		goto out;
464 	}
465 
466 	en = __lookup_extent_node(&et->root, et->cached_en, pgofs);
467 	if (!en)
468 		goto out;
469 
470 	if (en == et->cached_en)
471 		stat_inc_cached_node_hit(sbi, type);
472 	else
473 		stat_inc_rbtree_node_hit(sbi, type);
474 
475 	*ei = en->ei;
476 	spin_lock(&eti->extent_lock);
477 	if (!list_empty(&en->list)) {
478 		list_move_tail(&en->list, &eti->extent_list);
479 		et->cached_en = en;
480 	}
481 	spin_unlock(&eti->extent_lock);
482 	ret = true;
483 out:
484 	stat_inc_total_hit(sbi, type);
485 	read_unlock(&et->lock);
486 
487 	if (type == EX_READ)
488 		trace_f2fs_lookup_read_extent_tree_end(inode, pgofs, ei);
489 	else if (type == EX_BLOCK_AGE)
490 		trace_f2fs_lookup_age_extent_tree_end(inode, pgofs, ei);
491 	return ret;
492 }
493 
__try_merge_extent_node(struct f2fs_sb_info * sbi,struct extent_tree * et,struct extent_info * ei,struct extent_node * prev_ex,struct extent_node * next_ex)494 static struct extent_node *__try_merge_extent_node(struct f2fs_sb_info *sbi,
495 				struct extent_tree *et, struct extent_info *ei,
496 				struct extent_node *prev_ex,
497 				struct extent_node *next_ex)
498 {
499 	struct extent_tree_info *eti = &sbi->extent_tree[et->type];
500 	struct extent_node *en = NULL;
501 
502 	if (prev_ex && __is_back_mergeable(ei, &prev_ex->ei, et->type)) {
503 		prev_ex->ei.len += ei->len;
504 		ei = &prev_ex->ei;
505 		en = prev_ex;
506 	}
507 
508 	if (next_ex && __is_front_mergeable(ei, &next_ex->ei, et->type)) {
509 		next_ex->ei.fofs = ei->fofs;
510 		next_ex->ei.len += ei->len;
511 		if (et->type == EX_READ)
512 			next_ex->ei.blk = ei->blk;
513 		if (en)
514 			__release_extent_node(sbi, et, prev_ex);
515 
516 		en = next_ex;
517 	}
518 
519 	if (!en)
520 		return NULL;
521 
522 	__try_update_largest_extent(et, en);
523 
524 	spin_lock(&eti->extent_lock);
525 	if (!list_empty(&en->list)) {
526 		list_move_tail(&en->list, &eti->extent_list);
527 		et->cached_en = en;
528 	}
529 	spin_unlock(&eti->extent_lock);
530 	return en;
531 }
532 
__insert_extent_tree(struct f2fs_sb_info * sbi,struct extent_tree * et,struct extent_info * ei,struct rb_node ** insert_p,struct rb_node * insert_parent,bool leftmost)533 static struct extent_node *__insert_extent_tree(struct f2fs_sb_info *sbi,
534 				struct extent_tree *et, struct extent_info *ei,
535 				struct rb_node **insert_p,
536 				struct rb_node *insert_parent,
537 				bool leftmost)
538 {
539 	struct extent_tree_info *eti = &sbi->extent_tree[et->type];
540 	struct rb_node **p = &et->root.rb_root.rb_node;
541 	struct rb_node *parent = NULL;
542 	struct extent_node *en = NULL;
543 
544 	if (insert_p && insert_parent) {
545 		parent = insert_parent;
546 		p = insert_p;
547 		goto do_insert;
548 	}
549 
550 	leftmost = true;
551 
552 	/* look up extent_node in the rb tree */
553 	while (*p) {
554 		parent = *p;
555 		en = rb_entry(parent, struct extent_node, rb_node);
556 
557 		if (ei->fofs < en->ei.fofs) {
558 			p = &(*p)->rb_left;
559 		} else if (ei->fofs >= en->ei.fofs + en->ei.len) {
560 			p = &(*p)->rb_right;
561 			leftmost = false;
562 		} else {
563 			f2fs_bug_on(sbi, 1);
564 		}
565 	}
566 
567 do_insert:
568 	en = __attach_extent_node(sbi, et, ei, parent, p, leftmost);
569 	if (!en)
570 		return NULL;
571 
572 	__try_update_largest_extent(et, en);
573 
574 	/* update in global extent list */
575 	spin_lock(&eti->extent_lock);
576 	list_add_tail(&en->list, &eti->extent_list);
577 	et->cached_en = en;
578 	spin_unlock(&eti->extent_lock);
579 	return en;
580 }
581 
__update_extent_tree_range(struct inode * inode,struct extent_info * tei,enum extent_type type)582 static void __update_extent_tree_range(struct inode *inode,
583 			struct extent_info *tei, enum extent_type type)
584 {
585 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
586 	struct extent_tree *et = F2FS_I(inode)->extent_tree[type];
587 	struct extent_node *en = NULL, *en1 = NULL;
588 	struct extent_node *prev_en = NULL, *next_en = NULL;
589 	struct extent_info ei, dei, prev;
590 	struct rb_node **insert_p = NULL, *insert_parent = NULL;
591 	unsigned int fofs = tei->fofs, len = tei->len;
592 	unsigned int end = fofs + len;
593 	bool updated = false;
594 	bool leftmost = false;
595 
596 	if (!et)
597 		return;
598 
599 	if (type == EX_READ)
600 		trace_f2fs_update_read_extent_tree_range(inode, fofs, len,
601 						tei->blk, 0);
602 	else if (type == EX_BLOCK_AGE)
603 		trace_f2fs_update_age_extent_tree_range(inode, fofs, len,
604 						tei->age, tei->last_blocks);
605 
606 	write_lock(&et->lock);
607 
608 	if (type == EX_READ) {
609 		if (is_inode_flag_set(inode, FI_NO_EXTENT)) {
610 			write_unlock(&et->lock);
611 			return;
612 		}
613 
614 		prev = et->largest;
615 		dei.len = 0;
616 
617 		/*
618 		 * drop largest extent before lookup, in case it's already
619 		 * been shrunk from extent tree
620 		 */
621 		__drop_largest_extent(et, fofs, len);
622 	}
623 
624 	/* 1. lookup first extent node in range [fofs, fofs + len - 1] */
625 	en = __lookup_extent_node_ret(&et->root,
626 					et->cached_en, fofs,
627 					&prev_en, &next_en,
628 					&insert_p, &insert_parent,
629 					&leftmost);
630 	if (!en)
631 		en = next_en;
632 
633 	/* 2. invalidate all extent nodes in range [fofs, fofs + len - 1] */
634 	while (en && en->ei.fofs < end) {
635 		unsigned int org_end;
636 		int parts = 0;	/* # of parts current extent split into */
637 
638 		next_en = en1 = NULL;
639 
640 		dei = en->ei;
641 		org_end = dei.fofs + dei.len;
642 		f2fs_bug_on(sbi, fofs >= org_end);
643 
644 		if (fofs > dei.fofs && (type != EX_READ ||
645 				fofs - dei.fofs >= F2FS_MIN_EXTENT_LEN)) {
646 			en->ei.len = fofs - en->ei.fofs;
647 			prev_en = en;
648 			parts = 1;
649 		}
650 
651 		if (end < org_end && (type != EX_READ ||
652 				org_end - end >= F2FS_MIN_EXTENT_LEN)) {
653 			if (parts) {
654 				__set_extent_info(&ei,
655 					end, org_end - end,
656 					end - dei.fofs + dei.blk, false,
657 					dei.age, dei.last_blocks,
658 					type);
659 				en1 = __insert_extent_tree(sbi, et, &ei,
660 							NULL, NULL, true);
661 				next_en = en1;
662 			} else {
663 				__set_extent_info(&en->ei,
664 					end, en->ei.len - (end - dei.fofs),
665 					en->ei.blk + (end - dei.fofs), true,
666 					dei.age, dei.last_blocks,
667 					type);
668 				next_en = en;
669 			}
670 			parts++;
671 		}
672 
673 		if (!next_en) {
674 			struct rb_node *node = rb_next(&en->rb_node);
675 
676 			next_en = rb_entry_safe(node, struct extent_node,
677 						rb_node);
678 		}
679 
680 		if (parts)
681 			__try_update_largest_extent(et, en);
682 		else
683 			__release_extent_node(sbi, et, en);
684 
685 		/*
686 		 * if original extent is split into zero or two parts, extent
687 		 * tree has been altered by deletion or insertion, therefore
688 		 * invalidate pointers regard to tree.
689 		 */
690 		if (parts != 1) {
691 			insert_p = NULL;
692 			insert_parent = NULL;
693 		}
694 		en = next_en;
695 	}
696 
697 	if (type == EX_BLOCK_AGE)
698 		goto update_age_extent_cache;
699 
700 	/* 3. update extent in read extent cache */
701 	BUG_ON(type != EX_READ);
702 
703 	if (tei->blk) {
704 		__set_extent_info(&ei, fofs, len, tei->blk, false,
705 				  0, 0, EX_READ);
706 		if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en))
707 			__insert_extent_tree(sbi, et, &ei,
708 					insert_p, insert_parent, leftmost);
709 
710 		/* give up extent_cache, if split and small updates happen */
711 		if (dei.len >= 1 &&
712 				prev.len < F2FS_MIN_EXTENT_LEN &&
713 				et->largest.len < F2FS_MIN_EXTENT_LEN) {
714 			et->largest.len = 0;
715 			et->largest_updated = true;
716 			set_inode_flag(inode, FI_NO_EXTENT);
717 		}
718 	}
719 
720 	if (is_inode_flag_set(inode, FI_NO_EXTENT))
721 		__free_extent_tree(sbi, et);
722 
723 	if (et->largest_updated) {
724 		et->largest_updated = false;
725 		updated = true;
726 	}
727 	goto out_read_extent_cache;
728 update_age_extent_cache:
729 	if (!tei->last_blocks)
730 		goto out_read_extent_cache;
731 
732 	__set_extent_info(&ei, fofs, len, 0, false,
733 			tei->age, tei->last_blocks, EX_BLOCK_AGE);
734 	if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en))
735 		__insert_extent_tree(sbi, et, &ei,
736 					insert_p, insert_parent, leftmost);
737 out_read_extent_cache:
738 	write_unlock(&et->lock);
739 
740 	if (updated)
741 		f2fs_mark_inode_dirty_sync(inode, true);
742 }
743 
744 #ifdef CONFIG_F2FS_FS_COMPRESSION
f2fs_update_read_extent_tree_range_compressed(struct inode * inode,pgoff_t fofs,block_t blkaddr,unsigned int llen,unsigned int c_len)745 void f2fs_update_read_extent_tree_range_compressed(struct inode *inode,
746 				pgoff_t fofs, block_t blkaddr, unsigned int llen,
747 				unsigned int c_len)
748 {
749 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
750 	struct extent_tree *et = F2FS_I(inode)->extent_tree[EX_READ];
751 	struct extent_node *en = NULL;
752 	struct extent_node *prev_en = NULL, *next_en = NULL;
753 	struct extent_info ei;
754 	struct rb_node **insert_p = NULL, *insert_parent = NULL;
755 	bool leftmost = false;
756 
757 	trace_f2fs_update_read_extent_tree_range(inode, fofs, llen,
758 						blkaddr, c_len);
759 
760 	/* it is safe here to check FI_NO_EXTENT w/o et->lock in ro image */
761 	if (is_inode_flag_set(inode, FI_NO_EXTENT))
762 		return;
763 
764 	write_lock(&et->lock);
765 
766 	en = __lookup_extent_node_ret(&et->root,
767 					et->cached_en, fofs,
768 					&prev_en, &next_en,
769 					&insert_p, &insert_parent,
770 					&leftmost);
771 	if (en)
772 		goto unlock_out;
773 
774 	__set_extent_info(&ei, fofs, llen, blkaddr, true, 0, 0, EX_READ);
775 	ei.c_len = c_len;
776 
777 	if (!__try_merge_extent_node(sbi, et, &ei, prev_en, next_en))
778 		__insert_extent_tree(sbi, et, &ei,
779 				insert_p, insert_parent, leftmost);
780 unlock_out:
781 	write_unlock(&et->lock);
782 }
783 #endif
784 
__calculate_block_age(struct f2fs_sb_info * sbi,unsigned long long new,unsigned long long old)785 static unsigned long long __calculate_block_age(struct f2fs_sb_info *sbi,
786 						unsigned long long new,
787 						unsigned long long old)
788 {
789 	unsigned int rem_old, rem_new;
790 	unsigned long long res;
791 	unsigned int weight = sbi->last_age_weight;
792 
793 	res = div_u64_rem(new, 100, &rem_new) * (100 - weight)
794 		+ div_u64_rem(old, 100, &rem_old) * weight;
795 
796 	if (rem_new)
797 		res += rem_new * (100 - weight) / 100;
798 	if (rem_old)
799 		res += rem_old * weight / 100;
800 
801 	return res;
802 }
803 
804 /* This returns a new age and allocated blocks in ei */
__get_new_block_age(struct inode * inode,struct extent_info * ei,block_t blkaddr)805 static int __get_new_block_age(struct inode *inode, struct extent_info *ei,
806 						block_t blkaddr)
807 {
808 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
809 	loff_t f_size = i_size_read(inode);
810 	unsigned long long cur_blocks =
811 				atomic64_read(&sbi->allocated_data_blocks);
812 	struct extent_info tei = *ei;	/* only fofs and len are valid */
813 
814 	/*
815 	 * When I/O is not aligned to a PAGE_SIZE, update will happen to the last
816 	 * file block even in seq write. So don't record age for newly last file
817 	 * block here.
818 	 */
819 	if ((f_size >> PAGE_SHIFT) == ei->fofs && f_size & (PAGE_SIZE - 1) &&
820 			blkaddr == NEW_ADDR)
821 		return -EINVAL;
822 
823 	if (__lookup_extent_tree(inode, ei->fofs, &tei, EX_BLOCK_AGE)) {
824 		unsigned long long cur_age;
825 
826 		if (cur_blocks >= tei.last_blocks)
827 			cur_age = cur_blocks - tei.last_blocks;
828 		else
829 			/* allocated_data_blocks overflow */
830 			cur_age = ULLONG_MAX - tei.last_blocks + cur_blocks;
831 
832 		if (tei.age)
833 			ei->age = __calculate_block_age(sbi, cur_age, tei.age);
834 		else
835 			ei->age = cur_age;
836 		ei->last_blocks = cur_blocks;
837 		WARN_ON(ei->age > cur_blocks);
838 		return 0;
839 	}
840 
841 	f2fs_bug_on(sbi, blkaddr == NULL_ADDR);
842 
843 	/* the data block was allocated for the first time */
844 	if (blkaddr == NEW_ADDR)
845 		goto out;
846 
847 	if (__is_valid_data_blkaddr(blkaddr) &&
848 	    !f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC_ENHANCE))
849 		return -EINVAL;
850 out:
851 	/*
852 	 * init block age with zero, this can happen when the block age extent
853 	 * was reclaimed due to memory constraint or system reboot
854 	 */
855 	ei->age = 0;
856 	ei->last_blocks = cur_blocks;
857 	return 0;
858 }
859 
__update_extent_cache(struct dnode_of_data * dn,enum extent_type type)860 static void __update_extent_cache(struct dnode_of_data *dn, enum extent_type type)
861 {
862 	struct extent_info ei = {};
863 
864 	if (!__may_extent_tree(dn->inode, type))
865 		return;
866 
867 	ei.fofs = f2fs_start_bidx_of_node(ofs_of_node(dn->node_page), dn->inode) +
868 								dn->ofs_in_node;
869 	ei.len = 1;
870 
871 	if (type == EX_READ) {
872 		if (dn->data_blkaddr == NEW_ADDR)
873 			ei.blk = NULL_ADDR;
874 		else
875 			ei.blk = dn->data_blkaddr;
876 	} else if (type == EX_BLOCK_AGE) {
877 		if (__get_new_block_age(dn->inode, &ei, dn->data_blkaddr))
878 			return;
879 	}
880 	__update_extent_tree_range(dn->inode, &ei, type);
881 }
882 
__shrink_extent_tree(struct f2fs_sb_info * sbi,int nr_shrink,enum extent_type type)883 static unsigned int __shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink,
884 					enum extent_type type)
885 {
886 	struct extent_tree_info *eti = &sbi->extent_tree[type];
887 	struct extent_tree *et, *next;
888 	struct extent_node *en;
889 	unsigned int node_cnt = 0, tree_cnt = 0;
890 	int remained;
891 
892 	if (!atomic_read(&eti->total_zombie_tree))
893 		goto free_node;
894 
895 	if (!mutex_trylock(&eti->extent_tree_lock))
896 		goto out;
897 
898 	/* 1. remove unreferenced extent tree */
899 	list_for_each_entry_safe(et, next, &eti->zombie_list, list) {
900 		if (atomic_read(&et->node_cnt)) {
901 			write_lock(&et->lock);
902 			node_cnt += __free_extent_tree(sbi, et);
903 			write_unlock(&et->lock);
904 		}
905 		f2fs_bug_on(sbi, atomic_read(&et->node_cnt));
906 		list_del_init(&et->list);
907 		radix_tree_delete(&eti->extent_tree_root, et->ino);
908 		kmem_cache_free(extent_tree_slab, et);
909 		atomic_dec(&eti->total_ext_tree);
910 		atomic_dec(&eti->total_zombie_tree);
911 		tree_cnt++;
912 
913 		if (node_cnt + tree_cnt >= nr_shrink)
914 			goto unlock_out;
915 		cond_resched();
916 	}
917 	mutex_unlock(&eti->extent_tree_lock);
918 
919 free_node:
920 	/* 2. remove LRU extent entries */
921 	if (!mutex_trylock(&eti->extent_tree_lock))
922 		goto out;
923 
924 	remained = nr_shrink - (node_cnt + tree_cnt);
925 
926 	spin_lock(&eti->extent_lock);
927 	for (; remained > 0; remained--) {
928 		if (list_empty(&eti->extent_list))
929 			break;
930 		en = list_first_entry(&eti->extent_list,
931 					struct extent_node, list);
932 		et = en->et;
933 		if (!write_trylock(&et->lock)) {
934 			/* refresh this extent node's position in extent list */
935 			list_move_tail(&en->list, &eti->extent_list);
936 			continue;
937 		}
938 
939 		list_del_init(&en->list);
940 		spin_unlock(&eti->extent_lock);
941 
942 		__detach_extent_node(sbi, et, en);
943 
944 		write_unlock(&et->lock);
945 		node_cnt++;
946 		spin_lock(&eti->extent_lock);
947 	}
948 	spin_unlock(&eti->extent_lock);
949 
950 unlock_out:
951 	mutex_unlock(&eti->extent_tree_lock);
952 out:
953 	trace_f2fs_shrink_extent_tree(sbi, node_cnt, tree_cnt, type);
954 
955 	return node_cnt + tree_cnt;
956 }
957 
958 /* read extent cache operations */
f2fs_lookup_read_extent_cache(struct inode * inode,pgoff_t pgofs,struct extent_info * ei)959 bool f2fs_lookup_read_extent_cache(struct inode *inode, pgoff_t pgofs,
960 				struct extent_info *ei)
961 {
962 	if (!__may_extent_tree(inode, EX_READ))
963 		return false;
964 
965 	return __lookup_extent_tree(inode, pgofs, ei, EX_READ);
966 }
967 
f2fs_lookup_read_extent_cache_block(struct inode * inode,pgoff_t index,block_t * blkaddr)968 bool f2fs_lookup_read_extent_cache_block(struct inode *inode, pgoff_t index,
969 				block_t *blkaddr)
970 {
971 	struct extent_info ei = {};
972 
973 	if (!f2fs_lookup_read_extent_cache(inode, index, &ei))
974 		return false;
975 	*blkaddr = ei.blk + index - ei.fofs;
976 	return true;
977 }
978 
f2fs_update_read_extent_cache(struct dnode_of_data * dn)979 void f2fs_update_read_extent_cache(struct dnode_of_data *dn)
980 {
981 	return __update_extent_cache(dn, EX_READ);
982 }
983 
f2fs_update_read_extent_cache_range(struct dnode_of_data * dn,pgoff_t fofs,block_t blkaddr,unsigned int len)984 void f2fs_update_read_extent_cache_range(struct dnode_of_data *dn,
985 				pgoff_t fofs, block_t blkaddr, unsigned int len)
986 {
987 	struct extent_info ei = {
988 		.fofs = fofs,
989 		.len = len,
990 		.blk = blkaddr,
991 	};
992 
993 	if (!__may_extent_tree(dn->inode, EX_READ))
994 		return;
995 
996 	__update_extent_tree_range(dn->inode, &ei, EX_READ);
997 }
998 
f2fs_shrink_read_extent_tree(struct f2fs_sb_info * sbi,int nr_shrink)999 unsigned int f2fs_shrink_read_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink)
1000 {
1001 	if (!test_opt(sbi, READ_EXTENT_CACHE))
1002 		return 0;
1003 
1004 	return __shrink_extent_tree(sbi, nr_shrink, EX_READ);
1005 }
1006 
1007 /* block age extent cache operations */
f2fs_lookup_age_extent_cache(struct inode * inode,pgoff_t pgofs,struct extent_info * ei)1008 bool f2fs_lookup_age_extent_cache(struct inode *inode, pgoff_t pgofs,
1009 				struct extent_info *ei)
1010 {
1011 	if (!__may_extent_tree(inode, EX_BLOCK_AGE))
1012 		return false;
1013 
1014 	return __lookup_extent_tree(inode, pgofs, ei, EX_BLOCK_AGE);
1015 }
1016 
f2fs_update_age_extent_cache(struct dnode_of_data * dn)1017 void f2fs_update_age_extent_cache(struct dnode_of_data *dn)
1018 {
1019 	return __update_extent_cache(dn, EX_BLOCK_AGE);
1020 }
1021 
f2fs_update_age_extent_cache_range(struct dnode_of_data * dn,pgoff_t fofs,unsigned int len)1022 void f2fs_update_age_extent_cache_range(struct dnode_of_data *dn,
1023 				pgoff_t fofs, unsigned int len)
1024 {
1025 	struct extent_info ei = {
1026 		.fofs = fofs,
1027 		.len = len,
1028 	};
1029 
1030 	if (!__may_extent_tree(dn->inode, EX_BLOCK_AGE))
1031 		return;
1032 
1033 	__update_extent_tree_range(dn->inode, &ei, EX_BLOCK_AGE);
1034 }
1035 
f2fs_shrink_age_extent_tree(struct f2fs_sb_info * sbi,int nr_shrink)1036 unsigned int f2fs_shrink_age_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink)
1037 {
1038 	if (!test_opt(sbi, AGE_EXTENT_CACHE))
1039 		return 0;
1040 
1041 	return __shrink_extent_tree(sbi, nr_shrink, EX_BLOCK_AGE);
1042 }
1043 
__destroy_extent_node(struct inode * inode,enum extent_type type)1044 static unsigned int __destroy_extent_node(struct inode *inode,
1045 					enum extent_type type)
1046 {
1047 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1048 	struct extent_tree *et = F2FS_I(inode)->extent_tree[type];
1049 	unsigned int node_cnt = 0;
1050 
1051 	if (!et || !atomic_read(&et->node_cnt))
1052 		return 0;
1053 
1054 	write_lock(&et->lock);
1055 	node_cnt = __free_extent_tree(sbi, et);
1056 	write_unlock(&et->lock);
1057 
1058 	return node_cnt;
1059 }
1060 
f2fs_destroy_extent_node(struct inode * inode)1061 void f2fs_destroy_extent_node(struct inode *inode)
1062 {
1063 	__destroy_extent_node(inode, EX_READ);
1064 	__destroy_extent_node(inode, EX_BLOCK_AGE);
1065 }
1066 
__drop_extent_tree(struct inode * inode,enum extent_type type)1067 static void __drop_extent_tree(struct inode *inode, enum extent_type type)
1068 {
1069 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1070 	struct extent_tree *et = F2FS_I(inode)->extent_tree[type];
1071 	bool updated = false;
1072 
1073 	if (!__may_extent_tree(inode, type))
1074 		return;
1075 
1076 	write_lock(&et->lock);
1077 	__free_extent_tree(sbi, et);
1078 	if (type == EX_READ) {
1079 		set_inode_flag(inode, FI_NO_EXTENT);
1080 		if (et->largest.len) {
1081 			et->largest.len = 0;
1082 			updated = true;
1083 		}
1084 	}
1085 	write_unlock(&et->lock);
1086 	if (updated)
1087 		f2fs_mark_inode_dirty_sync(inode, true);
1088 }
1089 
f2fs_drop_extent_tree(struct inode * inode)1090 void f2fs_drop_extent_tree(struct inode *inode)
1091 {
1092 	__drop_extent_tree(inode, EX_READ);
1093 	__drop_extent_tree(inode, EX_BLOCK_AGE);
1094 }
1095 
__destroy_extent_tree(struct inode * inode,enum extent_type type)1096 static void __destroy_extent_tree(struct inode *inode, enum extent_type type)
1097 {
1098 	struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
1099 	struct extent_tree_info *eti = &sbi->extent_tree[type];
1100 	struct extent_tree *et = F2FS_I(inode)->extent_tree[type];
1101 	unsigned int node_cnt = 0;
1102 
1103 	if (!et)
1104 		return;
1105 
1106 	if (inode->i_nlink && !is_bad_inode(inode) &&
1107 					atomic_read(&et->node_cnt)) {
1108 		mutex_lock(&eti->extent_tree_lock);
1109 		list_add_tail(&et->list, &eti->zombie_list);
1110 		atomic_inc(&eti->total_zombie_tree);
1111 		mutex_unlock(&eti->extent_tree_lock);
1112 		return;
1113 	}
1114 
1115 	/* free all extent info belong to this extent tree */
1116 	node_cnt = __destroy_extent_node(inode, type);
1117 
1118 	/* delete extent tree entry in radix tree */
1119 	mutex_lock(&eti->extent_tree_lock);
1120 	f2fs_bug_on(sbi, atomic_read(&et->node_cnt));
1121 	radix_tree_delete(&eti->extent_tree_root, inode->i_ino);
1122 	kmem_cache_free(extent_tree_slab, et);
1123 	atomic_dec(&eti->total_ext_tree);
1124 	mutex_unlock(&eti->extent_tree_lock);
1125 
1126 	F2FS_I(inode)->extent_tree[type] = NULL;
1127 
1128 	trace_f2fs_destroy_extent_tree(inode, node_cnt, type);
1129 }
1130 
f2fs_destroy_extent_tree(struct inode * inode)1131 void f2fs_destroy_extent_tree(struct inode *inode)
1132 {
1133 	__destroy_extent_tree(inode, EX_READ);
1134 	__destroy_extent_tree(inode, EX_BLOCK_AGE);
1135 }
1136 
__init_extent_tree_info(struct extent_tree_info * eti)1137 static void __init_extent_tree_info(struct extent_tree_info *eti)
1138 {
1139 	INIT_RADIX_TREE(&eti->extent_tree_root, GFP_NOIO);
1140 	mutex_init(&eti->extent_tree_lock);
1141 	INIT_LIST_HEAD(&eti->extent_list);
1142 	spin_lock_init(&eti->extent_lock);
1143 	atomic_set(&eti->total_ext_tree, 0);
1144 	INIT_LIST_HEAD(&eti->zombie_list);
1145 	atomic_set(&eti->total_zombie_tree, 0);
1146 	atomic_set(&eti->total_ext_node, 0);
1147 }
1148 
f2fs_init_extent_cache_info(struct f2fs_sb_info * sbi)1149 void f2fs_init_extent_cache_info(struct f2fs_sb_info *sbi)
1150 {
1151 	__init_extent_tree_info(&sbi->extent_tree[EX_READ]);
1152 	__init_extent_tree_info(&sbi->extent_tree[EX_BLOCK_AGE]);
1153 
1154 	/* initialize for block age extents */
1155 	atomic64_set(&sbi->allocated_data_blocks, 0);
1156 	sbi->hot_data_age_threshold = DEF_HOT_DATA_AGE_THRESHOLD;
1157 	sbi->warm_data_age_threshold = DEF_WARM_DATA_AGE_THRESHOLD;
1158 	sbi->last_age_weight = LAST_AGE_WEIGHT;
1159 }
1160 
f2fs_create_extent_cache(void)1161 int __init f2fs_create_extent_cache(void)
1162 {
1163 	extent_tree_slab = f2fs_kmem_cache_create("f2fs_extent_tree",
1164 			sizeof(struct extent_tree));
1165 	if (!extent_tree_slab)
1166 		return -ENOMEM;
1167 	extent_node_slab = f2fs_kmem_cache_create("f2fs_extent_node",
1168 			sizeof(struct extent_node));
1169 	if (!extent_node_slab) {
1170 		kmem_cache_destroy(extent_tree_slab);
1171 		return -ENOMEM;
1172 	}
1173 	return 0;
1174 }
1175 
f2fs_destroy_extent_cache(void)1176 void f2fs_destroy_extent_cache(void)
1177 {
1178 	kmem_cache_destroy(extent_node_slab);
1179 	kmem_cache_destroy(extent_tree_slab);
1180 }
1181