Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
a461930b
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 1 年 前同步成功
通知
158
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a461930b
编写于
12月 25, 2008
作者:
A
Avi Kivity
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
KVM: MMU: Replace walk_shadow() by for_each_shadow_entry() in invlpg()
Signed-off-by:
N
Avi Kivity
<
avi@redhat.com
>
上级
e7a04c99
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
32 addition
and
49 deletion
+32
-49
arch/x86/kvm/paging_tmpl.h
arch/x86/kvm/paging_tmpl.h
+32
-49
未找到文件。
arch/x86/kvm/paging_tmpl.h
浏览文件 @
a461930b
...
...
@@ -25,7 +25,6 @@
#if PTTYPE == 64
#define pt_element_t u64
#define guest_walker guest_walker64
#define shadow_walker shadow_walker64
#define FNAME(name) paging##64_##name
#define PT_BASE_ADDR_MASK PT64_BASE_ADDR_MASK
#define PT_DIR_BASE_ADDR_MASK PT64_DIR_BASE_ADDR_MASK
...
...
@@ -42,7 +41,6 @@
#elif PTTYPE == 32
#define pt_element_t u32
#define guest_walker guest_walker32
#define shadow_walker shadow_walker32
#define FNAME(name) paging##32_##name
#define PT_BASE_ADDR_MASK PT32_BASE_ADDR_MASK
#define PT_DIR_BASE_ADDR_MASK PT32_DIR_BASE_ADDR_MASK
...
...
@@ -73,18 +71,6 @@ struct guest_walker {
u32
error_code
;
};
struct
shadow_walker
{
struct
kvm_shadow_walk
walker
;
struct
guest_walker
*
guest_walker
;
int
user_fault
;
int
write_fault
;
int
largepage
;
int
*
ptwrite
;
pfn_t
pfn
;
u64
*
sptep
;
gpa_t
pte_gpa
;
};
static
gfn_t
gpte_to_gfn
(
pt_element_t
gpte
)
{
return
(
gpte
&
PT_BASE_ADDR_MASK
)
>>
PAGE_SHIFT
;
...
...
@@ -453,20 +439,27 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr,
return
0
;
}
static
int
FNAME
(
shadow_invlpg_entry
)(
struct
kvm_shadow_walk
*
_sw
,
struct
kvm_vcpu
*
vcpu
,
u64
addr
,
u64
*
sptep
,
int
level
)
static
void
FNAME
(
invlpg
)(
struct
kvm_vcpu
*
vcpu
,
gva_t
gva
)
{
struct
shadow_walker
*
sw
=
container_of
(
_sw
,
struct
shadow_walker
,
walker
);
struct
kvm_shadow_walk_iterator
iterator
;
pt_element_t
gpte
;
gpa_t
pte_gpa
=
-
1
;
int
level
;
u64
*
sptep
;
spin_lock
(
&
vcpu
->
kvm
->
mmu_lock
);
for_each_shadow_entry
(
vcpu
,
gva
,
iterator
)
{
level
=
iterator
.
level
;
sptep
=
iterator
.
sptep
;
/* FIXME: properly handle invlpg on large guest pages */
if
(
level
==
PT_PAGE_TABLE_LEVEL
||
((
level
==
PT_DIRECTORY_LEVEL
)
&&
is_large_pte
(
*
sptep
)))
{
struct
kvm_mmu_page
*
sp
=
page_header
(
__pa
(
sptep
));
sw
->
pte_gpa
=
(
sp
->
gfn
<<
PAGE_SHIFT
);
sw
->
pte_gpa
+=
(
sptep
-
sp
->
spt
)
*
sizeof
(
pt_element_t
);
pte_gpa
=
(
sp
->
gfn
<<
PAGE_SHIFT
);
pte_gpa
+=
(
sptep
-
sp
->
spt
)
*
sizeof
(
pt_element_t
);
if
(
is_shadow_present_pte
(
*
sptep
))
{
rmap_remove
(
vcpu
->
kvm
,
sptep
);
...
...
@@ -474,33 +467,24 @@ static int FNAME(shadow_invlpg_entry)(struct kvm_shadow_walk *_sw,
--
vcpu
->
kvm
->
stat
.
lpages
;
}
set_shadow_pte
(
sptep
,
shadow_trap_nonpresent_pte
);
return
1
;
break
;
}
if
(
!
is_shadow_present_pte
(
*
sptep
))
return
1
;
return
0
;
}
static
void
FNAME
(
invlpg
)(
struct
kvm_vcpu
*
vcpu
,
gva_t
gva
)
{
pt_element_t
gpte
;
struct
shadow_walker
walker
=
{
.
walker
=
{
.
entry
=
FNAME
(
shadow_invlpg_entry
),
},
.
pte_gpa
=
-
1
,
};
if
(
!
is_shadow_present_pte
(
*
sptep
))
break
;
}
spin_lock
(
&
vcpu
->
kvm
->
mmu_lock
);
walk_shadow
(
&
walker
.
walker
,
vcpu
,
gva
);
spin_unlock
(
&
vcpu
->
kvm
->
mmu_lock
);
if
(
walker
.
pte_gpa
==
-
1
)
if
(
pte_gpa
==
-
1
)
return
;
if
(
kvm_read_guest_atomic
(
vcpu
->
kvm
,
walker
.
pte_gpa
,
&
gpte
,
if
(
kvm_read_guest_atomic
(
vcpu
->
kvm
,
pte_gpa
,
&
gpte
,
sizeof
(
pt_element_t
)))
return
;
if
(
is_present_pte
(
gpte
)
&&
(
gpte
&
PT_ACCESSED_MASK
))
{
if
(
mmu_topup_memory_caches
(
vcpu
))
return
;
kvm_mmu_pte_write
(
vcpu
,
walker
.
pte_gpa
,
(
const
u8
*
)
&
gpte
,
kvm_mmu_pte_write
(
vcpu
,
pte_gpa
,
(
const
u8
*
)
&
gpte
,
sizeof
(
pt_element_t
),
0
);
}
}
...
...
@@ -607,7 +591,6 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
#undef pt_element_t
#undef guest_walker
#undef shadow_walker
#undef FNAME
#undef PT_BASE_ADDR_MASK
#undef PT_INDEX
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录