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
19de40a8
Commit
19de40a8
authored
Dec 03, 2008
by
Joerg Roedel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
KVM: change KVM to use IOMMU API
Signed-off-by:
Joerg Roedel
<
joerg.roedel@amd.com
>
parent
1aaf1183
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
33 additions
and
34 deletions
+33
-34
arch/ia64/include/asm/kvm_host.h
arch/ia64/include/asm/kvm_host.h
+1
-1
arch/ia64/kvm/Makefile
arch/ia64/kvm/Makefile
+1
-1
arch/ia64/kvm/kvm-ia64.c
arch/ia64/kvm/kvm-ia64.c
+2
-1
arch/x86/include/asm/kvm_host.h
arch/x86/include/asm/kvm_host.h
+1
-1
arch/x86/kvm/Makefile
arch/x86/kvm/Makefile
+1
-1
arch/x86/kvm/x86.c
arch/x86/kvm/x86.c
+2
-1
include/linux/kvm_host.h
include/linux/kvm_host.h
+3
-3
virt/kvm/iommu.c
virt/kvm/iommu.c
+21
-24
virt/kvm/kvm_main.c
virt/kvm/kvm_main.c
+1
-1
No files found.
arch/ia64/include/asm/kvm_host.h
View file @
19de40a8
...
...
@@ -467,7 +467,7 @@ struct kvm_arch {
struct
kvm_sal_data
rdv_sal_data
;
struct
list_head
assigned_dev_head
;
struct
dmar_domain
*
intel_
iommu_domain
;
struct
iommu_domain
*
iommu_domain
;
struct
hlist_head
irq_ack_notifier_list
;
unsigned
long
irq_sources_bitmap
;
...
...
arch/ia64/kvm/Makefile
View file @
19de40a8
...
...
@@ -51,7 +51,7 @@ EXTRA_AFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/
common-objs
=
$(
addprefix
../../../virt/kvm/, kvm_main.o ioapic.o
\
coalesced_mmio.o irq_comm.o
)
ifeq
($(CONFIG_
DMAR
),y)
ifeq
($(CONFIG_
IOMMU_API
),y)
common-objs
+=
$(
addprefix
../../../virt/kvm/, iommu.o
)
endif
...
...
arch/ia64/kvm/kvm-ia64.c
View file @
19de40a8
...
...
@@ -31,6 +31,7 @@
#include <linux/bitops.h>
#include <linux/hrtimer.h>
#include <linux/uaccess.h>
#include <linux/iommu.h>
#include <linux/intel-iommu.h>
#include <asm/pgtable.h>
...
...
@@ -188,7 +189,7 @@ int kvm_dev_ioctl_check_extension(long ext)
r
=
KVM_COALESCED_MMIO_PAGE_OFFSET
;
break
;
case
KVM_CAP_IOMMU
:
r
=
i
ntel_i
ommu_found
();
r
=
iommu_found
();
break
;
default:
r
=
0
;
...
...
arch/x86/include/asm/kvm_host.h
View file @
19de40a8
...
...
@@ -360,7 +360,7 @@ struct kvm_arch{
struct
list_head
active_mmu_pages
;
struct
list_head
assigned_dev_head
;
struct
list_head
oos_global_pages
;
struct
dmar_domain
*
intel_
iommu_domain
;
struct
iommu_domain
*
iommu_domain
;
struct
kvm_pic
*
vpic
;
struct
kvm_ioapic
*
vioapic
;
struct
kvm_pit
*
vpit
;
...
...
arch/x86/kvm/Makefile
View file @
19de40a8
...
...
@@ -7,7 +7,7 @@ common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \
ifeq
($(CONFIG_KVM_TRACE),y)
common-objs
+=
$(
addprefix
../../../virt/kvm/, kvm_trace.o
)
endif
ifeq
($(CONFIG_
DMAR
),y)
ifeq
($(CONFIG_
IOMMU_API
),y)
common-objs
+=
$(
addprefix
../../../virt/kvm/, iommu.o
)
endif
...
...
arch/x86/kvm/x86.c
View file @
19de40a8
...
...
@@ -34,6 +34,7 @@
#include <linux/module.h>
#include <linux/mman.h>
#include <linux/highmem.h>
#include <linux/iommu.h>
#include <linux/intel-iommu.h>
#include <asm/uaccess.h>
...
...
@@ -989,7 +990,7 @@ int kvm_dev_ioctl_check_extension(long ext)
r
=
!
tdp_enabled
;
break
;
case
KVM_CAP_IOMMU
:
r
=
i
ntel_i
ommu_found
();
r
=
iommu_found
();
break
;
default:
r
=
0
;
...
...
include/linux/kvm_host.h
View file @
19de40a8
...
...
@@ -328,7 +328,7 @@ void kvm_unregister_irq_ack_notifier(struct kvm_irq_ack_notifier *kian);
int
kvm_request_irq_source_id
(
struct
kvm
*
kvm
);
void
kvm_free_irq_source_id
(
struct
kvm
*
kvm
,
int
irq_source_id
);
#ifdef CONFIG_
DMAR
#ifdef CONFIG_
IOMMU_API
int
kvm_iommu_map_pages
(
struct
kvm
*
kvm
,
gfn_t
base_gfn
,
unsigned
long
npages
);
int
kvm_iommu_map_guest
(
struct
kvm
*
kvm
);
...
...
@@ -337,7 +337,7 @@ int kvm_assign_device(struct kvm *kvm,
struct
kvm_assigned_dev_kernel
*
assigned_dev
);
int
kvm_deassign_device
(
struct
kvm
*
kvm
,
struct
kvm_assigned_dev_kernel
*
assigned_dev
);
#else
/* CONFIG_
DMAR
*/
#else
/* CONFIG_
IOMMU_API
*/
static
inline
int
kvm_iommu_map_pages
(
struct
kvm
*
kvm
,
gfn_t
base_gfn
,
unsigned
long
npages
)
...
...
@@ -366,7 +366,7 @@ static inline int kvm_deassign_device(struct kvm *kvm,
{
return
0
;
}
#endif
/* CONFIG_
DMAR
*/
#endif
/* CONFIG_
IOMMU_API
*/
static
inline
void
kvm_guest_enter
(
void
)
{
...
...
virt/kvm/iommu.c
View file @
19de40a8
...
...
@@ -25,6 +25,7 @@
#include <linux/kvm_host.h>
#include <linux/pci.h>
#include <linux/dmar.h>
#include <linux/iommu.h>
#include <linux/intel-iommu.h>
static
int
kvm_iommu_unmap_memslots
(
struct
kvm
*
kvm
);
...
...
@@ -37,7 +38,7 @@ int kvm_iommu_map_pages(struct kvm *kvm,
gfn_t
gfn
=
base_gfn
;
pfn_t
pfn
;
int
i
,
r
=
0
;
struct
dmar_domain
*
domain
=
kvm
->
arch
.
intel_
iommu_domain
;
struct
iommu_domain
*
domain
=
kvm
->
arch
.
iommu_domain
;
/* check if iommu exists and in use */
if
(
!
domain
)
...
...
@@ -45,16 +46,15 @@ int kvm_iommu_map_pages(struct kvm *kvm,
for
(
i
=
0
;
i
<
npages
;
i
++
)
{
/* check if already mapped */
if
(
intel_iommu_iova_to_phys
(
domain
,
gfn_to_gpa
(
gfn
)))
if
(
iommu_iova_to_phys
(
domain
,
gfn_to_gpa
(
gfn
)))
continue
;
pfn
=
gfn_to_pfn
(
kvm
,
gfn
);
r
=
i
ntel_iommu_map_address
(
domain
,
gfn_to_gpa
(
gfn
),
pfn_to_hpa
(
pfn
),
PAGE_SIZE
,
DMA_PTE_READ
|
DMA_PTE
_WRITE
);
r
=
i
ommu_map_range
(
domain
,
gfn_to_gpa
(
gfn
),
pfn_to_hpa
(
pfn
),
PAGE_SIZE
,
IOMMU_READ
|
IOMMU
_WRITE
);
if
(
r
)
{
printk
(
KERN_ERR
"kvm_iommu_map_address:"
"iommu failed to map pfn=%lx
\n
"
,
pfn
);
...
...
@@ -88,7 +88,7 @@ int kvm_assign_device(struct kvm *kvm,
struct
kvm_assigned_dev_kernel
*
assigned_dev
)
{
struct
pci_dev
*
pdev
=
NULL
;
struct
dmar_domain
*
domain
=
kvm
->
arch
.
intel_
iommu_domain
;
struct
iommu_domain
*
domain
=
kvm
->
arch
.
iommu_domain
;
int
r
;
/* check if iommu exists and in use */
...
...
@@ -99,7 +99,7 @@ int kvm_assign_device(struct kvm *kvm,
if
(
pdev
==
NULL
)
return
-
ENODEV
;
r
=
i
ntel_iommu_attach_device
(
domain
,
p
dev
);
r
=
i
ommu_attach_device
(
domain
,
&
pdev
->
dev
);
if
(
r
)
{
printk
(
KERN_ERR
"assign device %x:%x.%x failed"
,
pdev
->
bus
->
number
,
...
...
@@ -119,7 +119,7 @@ int kvm_assign_device(struct kvm *kvm,
int
kvm_deassign_device
(
struct
kvm
*
kvm
,
struct
kvm_assigned_dev_kernel
*
assigned_dev
)
{
struct
dmar_domain
*
domain
=
kvm
->
arch
.
intel_
iommu_domain
;
struct
iommu_domain
*
domain
=
kvm
->
arch
.
iommu_domain
;
struct
pci_dev
*
pdev
=
NULL
;
/* check if iommu exists and in use */
...
...
@@ -130,7 +130,7 @@ int kvm_deassign_device(struct kvm *kvm,
if
(
pdev
==
NULL
)
return
-
ENODEV
;
i
ntel_iommu_detach_device
(
domain
,
p
dev
);
i
ommu_detach_device
(
domain
,
&
pdev
->
dev
);
printk
(
KERN_DEBUG
"deassign device: host bdf = %x:%x:%x
\n
"
,
assigned_dev
->
host_busnr
,
...
...
@@ -144,13 +144,13 @@ int kvm_iommu_map_guest(struct kvm *kvm)
{
int
r
;
if
(
!
i
ntel_i
ommu_found
())
{
printk
(
KERN_ERR
"%s: i
ntel i
ommu not found
\n
"
,
__func__
);
if
(
!
iommu_found
())
{
printk
(
KERN_ERR
"%s: iommu not found
\n
"
,
__func__
);
return
-
ENODEV
;
}
kvm
->
arch
.
i
ntel_iommu_domain
=
intel_iommu_alloc_domain
();
if
(
!
kvm
->
arch
.
i
ntel_i
ommu_domain
)
kvm
->
arch
.
i
ommu_domain
=
iommu_domain_alloc
();
if
(
!
kvm
->
arch
.
iommu_domain
)
return
-
ENOMEM
;
r
=
kvm_iommu_map_memslots
(
kvm
);
...
...
@@ -169,7 +169,7 @@ static void kvm_iommu_put_pages(struct kvm *kvm,
{
gfn_t
gfn
=
base_gfn
;
pfn_t
pfn
;
struct
dmar_domain
*
domain
=
kvm
->
arch
.
intel_
iommu_domain
;
struct
iommu_domain
*
domain
=
kvm
->
arch
.
iommu_domain
;
unsigned
long
i
;
u64
phys
;
...
...
@@ -178,16 +178,13 @@ static void kvm_iommu_put_pages(struct kvm *kvm,
return
;
for
(
i
=
0
;
i
<
npages
;
i
++
)
{
phys
=
intel_iommu_iova_to_phys
(
domain
,
gfn_to_gpa
(
gfn
));
phys
=
iommu_iova_to_phys
(
domain
,
gfn_to_gpa
(
gfn
));
pfn
=
phys
>>
PAGE_SHIFT
;
kvm_release_pfn_clean
(
pfn
);
gfn
++
;
}
intel_iommu_unmap_address
(
domain
,
gfn_to_gpa
(
base_gfn
),
PAGE_SIZE
*
npages
);
iommu_unmap_range
(
domain
,
gfn_to_gpa
(
base_gfn
),
PAGE_SIZE
*
npages
);
}
static
int
kvm_iommu_unmap_memslots
(
struct
kvm
*
kvm
)
...
...
@@ -205,13 +202,13 @@ static int kvm_iommu_unmap_memslots(struct kvm *kvm)
int
kvm_iommu_unmap_guest
(
struct
kvm
*
kvm
)
{
struct
dmar_domain
*
domain
=
kvm
->
arch
.
intel_
iommu_domain
;
struct
iommu_domain
*
domain
=
kvm
->
arch
.
iommu_domain
;
/* check if iommu exists and in use */
if
(
!
domain
)
return
0
;
kvm_iommu_unmap_memslots
(
kvm
);
i
ntel_iommu_free_domain
(
domain
);
i
ommu_domain_free
(
domain
);
return
0
;
}
virt/kvm/kvm_main.c
View file @
19de40a8
...
...
@@ -504,7 +504,7 @@ static int kvm_vm_ioctl_assign_device(struct kvm *kvm,
list_add
(
&
match
->
list
,
&
kvm
->
arch
.
assigned_dev_head
);
if
(
assigned_dev
->
flags
&
KVM_DEV_ASSIGN_ENABLE_IOMMU
)
{
if
(
!
kvm
->
arch
.
i
ntel_i
ommu_domain
)
{
if
(
!
kvm
->
arch
.
iommu_domain
)
{
r
=
kvm_iommu_map_guest
(
kvm
);
if
(
r
)
goto
out_list_del
;
...
...
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