Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
a461930b
Commit
a461930b
authored
Dec 25, 2008
by
Avi Kivity
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
KVM: MMU: Replace walk_shadow() by for_each_shadow_entry() in invlpg()
Signed-off-by:
Avi Kivity
<
avi@redhat.com
>
parent
e7a04c99
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
32 additions
and
49 deletions
+32
-49
arch/x86/kvm/paging_tmpl.h
arch/x86/kvm/paging_tmpl.h
+32
-49
No files found.
arch/x86/kvm/paging_tmpl.h
View file @
a461930b
...
@@ -25,7 +25,6 @@
...
@@ -25,7 +25,6 @@
#if PTTYPE == 64
#if PTTYPE == 64
#define pt_element_t u64
#define pt_element_t u64
#define guest_walker guest_walker64
#define guest_walker guest_walker64
#define shadow_walker shadow_walker64
#define FNAME(name) paging##64_##name
#define FNAME(name) paging##64_##name
#define PT_BASE_ADDR_MASK PT64_BASE_ADDR_MASK
#define PT_BASE_ADDR_MASK PT64_BASE_ADDR_MASK
#define PT_DIR_BASE_ADDR_MASK PT64_DIR_BASE_ADDR_MASK
#define PT_DIR_BASE_ADDR_MASK PT64_DIR_BASE_ADDR_MASK
...
@@ -42,7 +41,6 @@
...
@@ -42,7 +41,6 @@
#elif PTTYPE == 32
#elif PTTYPE == 32
#define pt_element_t u32
#define pt_element_t u32
#define guest_walker guest_walker32
#define guest_walker guest_walker32
#define shadow_walker shadow_walker32
#define FNAME(name) paging##32_##name
#define FNAME(name) paging##32_##name
#define PT_BASE_ADDR_MASK PT32_BASE_ADDR_MASK
#define PT_BASE_ADDR_MASK PT32_BASE_ADDR_MASK
#define PT_DIR_BASE_ADDR_MASK PT32_DIR_BASE_ADDR_MASK
#define PT_DIR_BASE_ADDR_MASK PT32_DIR_BASE_ADDR_MASK
...
@@ -73,18 +71,6 @@ struct guest_walker {
...
@@ -73,18 +71,6 @@ struct guest_walker {
u32
error_code
;
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
)
static
gfn_t
gpte_to_gfn
(
pt_element_t
gpte
)
{
{
return
(
gpte
&
PT_BASE_ADDR_MASK
)
>>
PAGE_SHIFT
;
return
(
gpte
&
PT_BASE_ADDR_MASK
)
>>
PAGE_SHIFT
;
...
@@ -453,54 +439,52 @@ out_unlock:
...
@@ -453,54 +439,52 @@ out_unlock:
return
0
;
return
0
;
}
}
static
int
FNAME
(
shadow_invlpg_entry
)(
struct
kvm_shadow_walk
*
_sw
,
static
void
FNAME
(
invlpg
)(
struct
kvm_vcpu
*
vcpu
,
gva_t
gva
)
struct
kvm_vcpu
*
vcpu
,
u64
addr
,
u64
*
sptep
,
int
level
)
{
{
struct
shadow_walker
*
sw
=
struct
kvm_shadow_walk_iterator
iterator
;
container_of
(
_sw
,
struct
shadow_walker
,
walker
);
pt_element_t
gpte
;
gpa_t
pte_gpa
=
-
1
;
int
level
;
u64
*
sptep
;
spin_lock
(
&
vcpu
->
kvm
->
mmu_lock
);
/* FIXME: properly handle invlpg on large guest pages */
for_each_shadow_entry
(
vcpu
,
gva
,
iterator
)
{
if
(
level
==
PT_PAGE_TABLE_LEVEL
||
level
=
iterator
.
level
;
((
level
==
PT_DIRECTORY_LEVEL
)
&&
is_large_pte
(
*
sptep
)))
{
sptep
=
iterator
.
sptep
;
struct
kvm_mmu_page
*
sp
=
page_header
(
__pa
(
sptep
));
sw
->
pte_gpa
=
(
sp
->
gfn
<<
PAGE_SHIFT
);
/* FIXME: properly handle invlpg on large guest pages */
sw
->
pte_gpa
+=
(
sptep
-
sp
->
spt
)
*
sizeof
(
pt_element_t
);
if
(
level
==
PT_PAGE_TABLE_LEVEL
||
((
level
==
PT_DIRECTORY_LEVEL
)
&&
is_large_pte
(
*
sptep
)))
{
struct
kvm_mmu_page
*
sp
=
page_header
(
__pa
(
sptep
));
if
(
is_shadow_present_pte
(
*
sptep
))
{
pte_gpa
=
(
sp
->
gfn
<<
PAGE_SHIFT
);
rmap_remove
(
vcpu
->
kvm
,
sptep
);
pte_gpa
+=
(
sptep
-
sp
->
spt
)
*
sizeof
(
pt_element_t
);
if
(
is_large_pte
(
*
sptep
))
--
vcpu
->
kvm
->
stat
.
lpages
;
if
(
is_shadow_present_pte
(
*
sptep
))
{
rmap_remove
(
vcpu
->
kvm
,
sptep
);
if
(
is_large_pte
(
*
sptep
))
--
vcpu
->
kvm
->
stat
.
lpages
;
}
set_shadow_pte
(
sptep
,
shadow_trap_nonpresent_pte
);
break
;
}
}
set_shadow_pte
(
sptep
,
shadow_trap_nonpresent_pte
);
return
1
;
}
if
(
!
is_shadow_present_pte
(
*
sptep
))
return
1
;
return
0
;
}
static
void
FNAME
(
invlpg
)(
struct
kvm_vcpu
*
vcpu
,
gva_t
gva
)
if
(
!
is_shadow_present_pte
(
*
sptep
))
{
break
;
pt_element_t
gpte
;
}
struct
shadow_walker
walker
=
{
.
walker
=
{
.
entry
=
FNAME
(
shadow_invlpg_entry
),
},
.
pte_gpa
=
-
1
,
};
spin_lock
(
&
vcpu
->
kvm
->
mmu_lock
);
walk_shadow
(
&
walker
.
walker
,
vcpu
,
gva
);
spin_unlock
(
&
vcpu
->
kvm
->
mmu_lock
);
spin_unlock
(
&
vcpu
->
kvm
->
mmu_lock
);
if
(
walker
.
pte_gpa
==
-
1
)
if
(
pte_gpa
==
-
1
)
return
;
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
)))
sizeof
(
pt_element_t
)))
return
;
return
;
if
(
is_present_pte
(
gpte
)
&&
(
gpte
&
PT_ACCESSED_MASK
))
{
if
(
is_present_pte
(
gpte
)
&&
(
gpte
&
PT_ACCESSED_MASK
))
{
if
(
mmu_topup_memory_caches
(
vcpu
))
if
(
mmu_topup_memory_caches
(
vcpu
))
return
;
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
);
sizeof
(
pt_element_t
),
0
);
}
}
}
}
...
@@ -607,7 +591,6 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
...
@@ -607,7 +591,6 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
#undef pt_element_t
#undef pt_element_t
#undef guest_walker
#undef guest_walker
#undef shadow_walker
#undef FNAME
#undef FNAME
#undef PT_BASE_ADDR_MASK
#undef PT_BASE_ADDR_MASK
#undef PT_INDEX
#undef PT_INDEX
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment