提交 3dc410ae 编写于 作者: A Alexey Kardashevskiy 提交者: David Gibson

target-ppc/kvm: Enable in-kernel TCE acceleration for multi-tce

This enables in-kernel handling of H_PUT_TCE_INDIRECT and
H_STUFF_TCE hypercalls. The host kernel support is there since v4.6,
in particular d3695aa4f452
("KVM: PPC: Add support for multiple-TCE hcalls").

H_PUT_TCE is already accelerated and does not need any special enablement.
Signed-off-by: NAlexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: NDavid Gibson <david@gibson.dropbear.id.au>
上级 e957f6a9
...@@ -2361,10 +2361,12 @@ static void ppc_spapr_init(MachineState *machine) ...@@ -2361,10 +2361,12 @@ static void ppc_spapr_init(MachineState *machine)
qemu_register_boot_set(spapr_boot_set, spapr); qemu_register_boot_set(spapr_boot_set, spapr);
/* to stop and start vmclock */
if (kvm_enabled()) { if (kvm_enabled()) {
/* to stop and start vmclock */
qemu_add_vm_change_state_handler(cpu_ppc_clock_vm_state_change, qemu_add_vm_change_state_handler(cpu_ppc_clock_vm_state_change,
&spapr->tb); &spapr->tb);
kvmppc_spapr_enable_inkernel_multitce();
} }
} }
......
...@@ -2198,6 +2198,20 @@ bool kvmppc_spapr_use_multitce(void) ...@@ -2198,6 +2198,20 @@ bool kvmppc_spapr_use_multitce(void)
return cap_spapr_multitce; return cap_spapr_multitce;
} }
int kvmppc_spapr_enable_inkernel_multitce(void)
{
int ret;
ret = kvm_vm_enable_cap(kvm_state, KVM_CAP_PPC_ENABLE_HCALL, 0,
H_PUT_TCE_INDIRECT, 1);
if (!ret) {
ret = kvm_vm_enable_cap(kvm_state, KVM_CAP_PPC_ENABLE_HCALL, 0,
H_STUFF_TCE, 1);
}
return ret;
}
void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift, void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift,
uint64_t bus_offset, uint32_t nb_table, uint64_t bus_offset, uint32_t nb_table,
int *pfd, bool need_vfio) int *pfd, bool need_vfio)
......
...@@ -39,6 +39,7 @@ target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu, ...@@ -39,6 +39,7 @@ target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu,
#ifndef CONFIG_USER_ONLY #ifndef CONFIG_USER_ONLY
off_t kvmppc_alloc_rma(void **rma); off_t kvmppc_alloc_rma(void **rma);
bool kvmppc_spapr_use_multitce(void); bool kvmppc_spapr_use_multitce(void);
int kvmppc_spapr_enable_inkernel_multitce(void);
void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift, void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift,
uint64_t bus_offset, uint32_t nb_table, uint64_t bus_offset, uint32_t nb_table,
int *pfd, bool need_vfio); int *pfd, bool need_vfio);
...@@ -180,6 +181,11 @@ static inline bool kvmppc_spapr_use_multitce(void) ...@@ -180,6 +181,11 @@ static inline bool kvmppc_spapr_use_multitce(void)
return false; return false;
} }
static inline int kvmppc_spapr_enable_inkernel_multitce(void)
{
return -1;
}
static inline void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift, static inline void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift,
uint64_t bus_offset, uint64_t bus_offset,
uint32_t nb_table, uint32_t nb_table,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册