diff options
author | Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> | 2013-10-07 12:48:01 -0400 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2013-10-17 12:42:36 -0400 |
commit | cbbc58d4fdfab1a39a6ac1b41fcb17885952157a (patch) | |
tree | 66315f4516c953a9c1f0699d985541d84fcb7df3 /arch/powerpc/kvm/book3s_pr.c | |
parent | 5587027ce9d59a57aecaa190be1c8e560aaff45d (diff) |
kvm: powerpc: book3s: Allow the HV and PR selection per virtual machine
This moves the kvmppc_ops callbacks to be a per VM entity. This
enables us to select HV and PR mode when creating a VM. We also
allow both kvm-hv and kvm-pr kernel module to be loaded. To
achieve this we move /dev/kvm ownership to kvm.ko module. Depending on
which KVM mode we select during VM creation we take a reference
count on respective module
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
[agraf: fix coding style]
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'arch/powerpc/kvm/book3s_pr.c')
-rw-r--r-- | arch/powerpc/kvm/book3s_pr.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c index 7f583a482161..fbd985f0cb02 100644 --- a/arch/powerpc/kvm/book3s_pr.c +++ b/arch/powerpc/kvm/book3s_pr.c | |||
@@ -1525,7 +1525,7 @@ static long kvm_arch_vm_ioctl_pr(struct file *filp, | |||
1525 | return -ENOTTY; | 1525 | return -ENOTTY; |
1526 | } | 1526 | } |
1527 | 1527 | ||
1528 | static struct kvmppc_ops kvmppc_pr_ops = { | 1528 | static struct kvmppc_ops kvm_ops_pr = { |
1529 | .is_hv_enabled = false, | 1529 | .is_hv_enabled = false, |
1530 | .get_sregs = kvm_arch_vcpu_ioctl_get_sregs_pr, | 1530 | .get_sregs = kvm_arch_vcpu_ioctl_get_sregs_pr, |
1531 | .set_sregs = kvm_arch_vcpu_ioctl_set_sregs_pr, | 1531 | .set_sregs = kvm_arch_vcpu_ioctl_set_sregs_pr, |
@@ -1552,7 +1552,6 @@ static struct kvmppc_ops kvmppc_pr_ops = { | |||
1552 | .create_memslot = kvmppc_core_create_memslot_pr, | 1552 | .create_memslot = kvmppc_core_create_memslot_pr, |
1553 | .init_vm = kvmppc_core_init_vm_pr, | 1553 | .init_vm = kvmppc_core_init_vm_pr, |
1554 | .destroy_vm = kvmppc_core_destroy_vm_pr, | 1554 | .destroy_vm = kvmppc_core_destroy_vm_pr, |
1555 | .check_processor_compat = kvmppc_core_check_processor_compat_pr, | ||
1556 | .get_smmu_info = kvm_vm_ioctl_get_smmu_info_pr, | 1555 | .get_smmu_info = kvm_vm_ioctl_get_smmu_info_pr, |
1557 | .emulate_op = kvmppc_core_emulate_op_pr, | 1556 | .emulate_op = kvmppc_core_emulate_op_pr, |
1558 | .emulate_mtspr = kvmppc_core_emulate_mtspr_pr, | 1557 | .emulate_mtspr = kvmppc_core_emulate_mtspr_pr, |
@@ -1561,27 +1560,35 @@ static struct kvmppc_ops kvmppc_pr_ops = { | |||
1561 | .arch_vm_ioctl = kvm_arch_vm_ioctl_pr, | 1560 | .arch_vm_ioctl = kvm_arch_vm_ioctl_pr, |
1562 | }; | 1561 | }; |
1563 | 1562 | ||
1564 | static int kvmppc_book3s_init_pr(void) | 1563 | |
1564 | int kvmppc_book3s_init_pr(void) | ||
1565 | { | 1565 | { |
1566 | int r; | 1566 | int r; |
1567 | 1567 | ||
1568 | r = kvm_init(&kvmppc_pr_ops, sizeof(struct kvm_vcpu), 0, THIS_MODULE); | 1568 | r = kvmppc_core_check_processor_compat_pr(); |
1569 | 1569 | if (r < 0) | |
1570 | if (r) | ||
1571 | return r; | 1570 | return r; |
1572 | 1571 | ||
1573 | r = kvmppc_mmu_hpte_sysinit(); | 1572 | kvm_ops_pr.owner = THIS_MODULE; |
1573 | kvmppc_pr_ops = &kvm_ops_pr; | ||
1574 | 1574 | ||
1575 | r = kvmppc_mmu_hpte_sysinit(); | ||
1575 | return r; | 1576 | return r; |
1576 | } | 1577 | } |
1577 | 1578 | ||
1578 | static void kvmppc_book3s_exit_pr(void) | 1579 | void kvmppc_book3s_exit_pr(void) |
1579 | { | 1580 | { |
1581 | kvmppc_pr_ops = NULL; | ||
1580 | kvmppc_mmu_hpte_sysexit(); | 1582 | kvmppc_mmu_hpte_sysexit(); |
1581 | kvm_exit(); | ||
1582 | } | 1583 | } |
1583 | 1584 | ||
1585 | /* | ||
1586 | * We only support separate modules for book3s 64 | ||
1587 | */ | ||
1588 | #ifdef CONFIG_PPC_BOOK3S_64 | ||
1589 | |||
1584 | module_init(kvmppc_book3s_init_pr); | 1590 | module_init(kvmppc_book3s_init_pr); |
1585 | module_exit(kvmppc_book3s_exit_pr); | 1591 | module_exit(kvmppc_book3s_exit_pr); |
1586 | 1592 | ||
1587 | MODULE_LICENSE("GPL"); | 1593 | MODULE_LICENSE("GPL"); |
1594 | #endif | ||