Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
89eb946a
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
89eb946a
编写于
12月 04, 2017
作者:
M
Matthew Wilcox
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
mm: Convert page migration to XArray
Signed-off-by:
N
Matthew Wilcox
<
willy@infradead.org
>
上级
560d454b
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
18 addition
and
30 deletion
+18
-30
mm/migrate.c
mm/migrate.c
+18
-30
未找到文件。
mm/migrate.c
浏览文件 @
89eb946a
...
...
@@ -323,7 +323,7 @@ void __migration_entry_wait(struct mm_struct *mm, pte_t *ptep,
page
=
migration_entry_to_page
(
entry
);
/*
* Once
radix-tre
e replacement of page migration started, page_count
* Once
page cach
e replacement of page migration started, page_count
* *must* be zero. And, we don't want to call wait_on_page_locked()
* against a page without get_page().
* So, we use get_page_unless_zero(), here. Even failed, page fault
...
...
@@ -438,10 +438,10 @@ int migrate_page_move_mapping(struct address_space *mapping,
struct
buffer_head
*
head
,
enum
migrate_mode
mode
,
int
extra_count
)
{
XA_STATE
(
xas
,
&
mapping
->
i_pages
,
page_index
(
page
));
struct
zone
*
oldzone
,
*
newzone
;
int
dirty
;
int
expected_count
=
1
+
extra_count
;
void
**
pslot
;
/*
* Device public or private pages have an extra refcount as they are
...
...
@@ -467,21 +467,16 @@ int migrate_page_move_mapping(struct address_space *mapping,
oldzone
=
page_zone
(
page
);
newzone
=
page_zone
(
newpage
);
xa_lock_irq
(
&
mapping
->
i_pages
);
pslot
=
radix_tree_lookup_slot
(
&
mapping
->
i_pages
,
page_index
(
page
));
xas_lock_irq
(
&
xas
);
expected_count
+=
hpage_nr_pages
(
page
)
+
page_has_private
(
page
);
if
(
page_count
(
page
)
!=
expected_count
||
radix_tree_deref_slot_protected
(
pslot
,
&
mapping
->
i_pages
.
xa_lock
)
!=
page
)
{
xa_unlock_irq
(
&
mapping
->
i_pages
);
if
(
page_count
(
page
)
!=
expected_count
||
xas_load
(
&
xas
)
!=
page
)
{
xas_unlock_irq
(
&
xas
);
return
-
EAGAIN
;
}
if
(
!
page_ref_freeze
(
page
,
expected_count
))
{
xa
_unlock_irq
(
&
mapping
->
i_page
s
);
xa
s_unlock_irq
(
&
xa
s
);
return
-
EAGAIN
;
}
...
...
@@ -495,7 +490,7 @@ int migrate_page_move_mapping(struct address_space *mapping,
if
(
mode
==
MIGRATE_ASYNC
&&
head
&&
!
buffer_migrate_lock_buffers
(
head
,
mode
))
{
page_ref_unfreeze
(
page
,
expected_count
);
xa
_unlock_irq
(
&
mapping
->
i_page
s
);
xa
s_unlock_irq
(
&
xa
s
);
return
-
EAGAIN
;
}
...
...
@@ -523,16 +518,13 @@ int migrate_page_move_mapping(struct address_space *mapping,
SetPageDirty
(
newpage
);
}
radix_tree_replace_slot
(
&
mapping
->
i_pages
,
pslot
,
newpage
);
xas_store
(
&
xas
,
newpage
);
if
(
PageTransHuge
(
page
))
{
int
i
;
int
index
=
page_index
(
page
);
for
(
i
=
1
;
i
<
HPAGE_PMD_NR
;
i
++
)
{
pslot
=
radix_tree_lookup_slot
(
&
mapping
->
i_pages
,
index
+
i
);
radix_tree_replace_slot
(
&
mapping
->
i_pages
,
pslot
,
newpage
+
i
);
xas_next
(
&
xas
);
xas_store
(
&
xas
,
newpage
+
i
);
}
}
...
...
@@ -543,7 +535,7 @@ int migrate_page_move_mapping(struct address_space *mapping,
*/
page_ref_unfreeze
(
page
,
expected_count
-
hpage_nr_pages
(
page
));
xa
_unlock
(
&
mapping
->
i_page
s
);
xa
s_unlock
(
&
xa
s
);
/* Leave irq disabled to prevent preemption while updating stats */
/*
...
...
@@ -583,22 +575,18 @@ EXPORT_SYMBOL(migrate_page_move_mapping);
int
migrate_huge_page_move_mapping
(
struct
address_space
*
mapping
,
struct
page
*
newpage
,
struct
page
*
page
)
{
XA_STATE
(
xas
,
&
mapping
->
i_pages
,
page_index
(
page
));
int
expected_count
;
void
**
pslot
;
xa_lock_irq
(
&
mapping
->
i_pages
);
pslot
=
radix_tree_lookup_slot
(
&
mapping
->
i_pages
,
page_index
(
page
));
xas_lock_irq
(
&
xas
);
expected_count
=
2
+
page_has_private
(
page
);
if
(
page_count
(
page
)
!=
expected_count
||
radix_tree_deref_slot_protected
(
pslot
,
&
mapping
->
i_pages
.
xa_lock
)
!=
page
)
{
xa_unlock_irq
(
&
mapping
->
i_pages
);
if
(
page_count
(
page
)
!=
expected_count
||
xas_load
(
&
xas
)
!=
page
)
{
xas_unlock_irq
(
&
xas
);
return
-
EAGAIN
;
}
if
(
!
page_ref_freeze
(
page
,
expected_count
))
{
xa
_unlock_irq
(
&
mapping
->
i_page
s
);
xa
s_unlock_irq
(
&
xa
s
);
return
-
EAGAIN
;
}
...
...
@@ -607,11 +595,11 @@ int migrate_huge_page_move_mapping(struct address_space *mapping,
get_page
(
newpage
);
radix_tree_replace_slot
(
&
mapping
->
i_pages
,
pslot
,
newpage
);
xas_store
(
&
xas
,
newpage
);
page_ref_unfreeze
(
page
,
expected_count
-
1
);
xa
_unlock_irq
(
&
mapping
->
i_page
s
);
xa
s_unlock_irq
(
&
xa
s
);
return
MIGRATEPAGE_SUCCESS
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录