mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
f2fs: remove inmem radix tree
Previously, we use radix tree to index all registered page entries for
atomic file, but now we only use radix tree to see whether current page
is indexed or not, since the other user of radix tree is gone in commit
042b7816aa
("f2fs: remove unnecessary call to invalidate inmemory pages").
So in this patch, we try to use one more efficient way:
Introducing a macro ATOMIC_WRITTEN_PAGE, and setting it as page private
value to indicate page indexing status. By using this way, we can save
memory and lookup time.
Signed-off-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
c15e8599ff
commit
decd36b6c4
5 changed files with 36 additions and 20 deletions
|
@ -197,28 +197,20 @@ void register_inmem_page(struct inode *inode, struct page *page)
|
|||
{
|
||||
struct f2fs_inode_info *fi = F2FS_I(inode);
|
||||
struct inmem_pages *new;
|
||||
int err;
|
||||
|
||||
SetPagePrivate(page);
|
||||
f2fs_trace_pid(page);
|
||||
|
||||
set_page_private(page, (unsigned long)ATOMIC_WRITTEN_PAGE);
|
||||
SetPagePrivate(page);
|
||||
|
||||
new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);
|
||||
|
||||
/* add atomic page indices to the list */
|
||||
new->page = page;
|
||||
INIT_LIST_HEAD(&new->list);
|
||||
retry:
|
||||
|
||||
/* increase reference count with clean state */
|
||||
mutex_lock(&fi->inmem_lock);
|
||||
err = radix_tree_insert(&fi->inmem_root, page->index, new);
|
||||
if (err == -EEXIST) {
|
||||
mutex_unlock(&fi->inmem_lock);
|
||||
kmem_cache_free(inmem_entry_slab, new);
|
||||
return;
|
||||
} else if (err) {
|
||||
mutex_unlock(&fi->inmem_lock);
|
||||
goto retry;
|
||||
}
|
||||
get_page(page);
|
||||
list_add_tail(&new->list, &fi->inmem_pages);
|
||||
inc_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES);
|
||||
|
@ -255,8 +247,8 @@ int commit_inmem_pages(struct inode *inode, bool abort)
|
|||
|
||||
mutex_lock(&fi->inmem_lock);
|
||||
list_for_each_entry_safe(cur, tmp, &fi->inmem_pages, list) {
|
||||
lock_page(cur->page);
|
||||
if (!abort) {
|
||||
lock_page(cur->page);
|
||||
if (cur->page->mapping == inode->i_mapping) {
|
||||
set_page_dirty(cur->page);
|
||||
f2fs_wait_on_page_writeback(cur->page, DATA);
|
||||
|
@ -271,12 +263,13 @@ int commit_inmem_pages(struct inode *inode, bool abort)
|
|||
break;
|
||||
}
|
||||
}
|
||||
f2fs_put_page(cur->page, 1);
|
||||
} else {
|
||||
trace_f2fs_commit_inmem_page(cur->page, INMEM_DROP);
|
||||
put_page(cur->page);
|
||||
}
|
||||
radix_tree_delete(&fi->inmem_root, cur->page->index);
|
||||
set_page_private(cur->page, 0);
|
||||
ClearPagePrivate(cur->page);
|
||||
f2fs_put_page(cur->page, 1);
|
||||
|
||||
list_del(&cur->list);
|
||||
kmem_cache_free(inmem_entry_slab, cur);
|
||||
dec_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue