aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s_pr.c
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>2013-10-07 12:48:01 -0400
committerAlexander Graf <agraf@suse.de>2013-10-17 12:42:36 -0400
commitcbbc58d4fdfab1a39a6ac1b41fcb17885952157a (patch)
tree66315f4516c953a9c1f0699d985541d84fcb7df3 /arch/powerpc/kvm/book3s_pr.c
parent5587027ce9d59a57aecaa190be1c8e560aaff45d (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.c25
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
1528static struct kvmppc_ops kvmppc_pr_ops = { 1528static 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
1564static int kvmppc_book3s_init_pr(void) 1563
1564int 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
1578static void kvmppc_book3s_exit_pr(void) 1579void 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
1584module_init(kvmppc_book3s_init_pr); 1590module_init(kvmppc_book3s_init_pr);
1585module_exit(kvmppc_book3s_exit_pr); 1591module_exit(kvmppc_book3s_exit_pr);
1586 1592
1587MODULE_LICENSE("GPL"); 1593MODULE_LICENSE("GPL");
1594#endif