KVM: PPC: Book3S HV P9: Tidy kvmppc_create_dtl_entry
This goes further to removing vcores from the P9 path. Also avoid the memset in favour of explicitly initialising all fields. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20211123095231.1036501-52-npiggin@gmail.com
This commit is contained in:
parent
ecb6a7207f
commit
617326ff01
@ -698,41 +698,30 @@ static u64 vcore_stolen_time(struct kvmppc_vcore *vc, u64 now)
|
||||
return p;
|
||||
}
|
||||
|
||||
static void kvmppc_create_dtl_entry(struct kvm_vcpu *vcpu,
|
||||
struct kvmppc_vcore *vc, u64 tb)
|
||||
static void __kvmppc_create_dtl_entry(struct kvm_vcpu *vcpu,
|
||||
unsigned int pcpu, u64 now,
|
||||
unsigned long stolen)
|
||||
{
|
||||
struct dtl_entry *dt;
|
||||
struct lppaca *vpa;
|
||||
unsigned long stolen;
|
||||
unsigned long core_stolen;
|
||||
u64 now;
|
||||
unsigned long flags;
|
||||
|
||||
dt = vcpu->arch.dtl_ptr;
|
||||
vpa = vcpu->arch.vpa.pinned_addr;
|
||||
now = tb;
|
||||
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_300)) {
|
||||
stolen = 0;
|
||||
} else {
|
||||
core_stolen = vcore_stolen_time(vc, now);
|
||||
stolen = core_stolen - vcpu->arch.stolen_logged;
|
||||
vcpu->arch.stolen_logged = core_stolen;
|
||||
spin_lock_irqsave(&vcpu->arch.tbacct_lock, flags);
|
||||
stolen += vcpu->arch.busy_stolen;
|
||||
vcpu->arch.busy_stolen = 0;
|
||||
spin_unlock_irqrestore(&vcpu->arch.tbacct_lock, flags);
|
||||
}
|
||||
|
||||
if (!dt || !vpa)
|
||||
return;
|
||||
memset(dt, 0, sizeof(struct dtl_entry));
|
||||
|
||||
dt->dispatch_reason = 7;
|
||||
dt->processor_id = cpu_to_be16(vc->pcpu + vcpu->arch.ptid);
|
||||
dt->timebase = cpu_to_be64(now + vc->tb_offset);
|
||||
dt->preempt_reason = 0;
|
||||
dt->processor_id = cpu_to_be16(pcpu + vcpu->arch.ptid);
|
||||
dt->enqueue_to_dispatch_time = cpu_to_be32(stolen);
|
||||
dt->ready_to_enqueue_time = 0;
|
||||
dt->waiting_to_ready_time = 0;
|
||||
dt->timebase = cpu_to_be64(now);
|
||||
dt->fault_addr = 0;
|
||||
dt->srr0 = cpu_to_be64(kvmppc_get_pc(vcpu));
|
||||
dt->srr1 = cpu_to_be64(vcpu->arch.shregs.msr);
|
||||
|
||||
++dt;
|
||||
if (dt == vcpu->arch.dtl.pinned_end)
|
||||
dt = vcpu->arch.dtl.pinned_addr;
|
||||
@ -743,6 +732,27 @@ static void kvmppc_create_dtl_entry(struct kvm_vcpu *vcpu,
|
||||
vcpu->arch.dtl.dirty = true;
|
||||
}
|
||||
|
||||
static void kvmppc_create_dtl_entry(struct kvm_vcpu *vcpu,
|
||||
struct kvmppc_vcore *vc)
|
||||
{
|
||||
unsigned long stolen;
|
||||
unsigned long core_stolen;
|
||||
u64 now;
|
||||
unsigned long flags;
|
||||
|
||||
now = mftb();
|
||||
|
||||
core_stolen = vcore_stolen_time(vc, now);
|
||||
stolen = core_stolen - vcpu->arch.stolen_logged;
|
||||
vcpu->arch.stolen_logged = core_stolen;
|
||||
spin_lock_irqsave(&vcpu->arch.tbacct_lock, flags);
|
||||
stolen += vcpu->arch.busy_stolen;
|
||||
vcpu->arch.busy_stolen = 0;
|
||||
spin_unlock_irqrestore(&vcpu->arch.tbacct_lock, flags);
|
||||
|
||||
__kvmppc_create_dtl_entry(vcpu, vc->pcpu, now + vc->tb_offset, stolen);
|
||||
}
|
||||
|
||||
/* See if there is a doorbell interrupt pending for a vcpu */
|
||||
static bool kvmppc_doorbell_pending(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
@ -3756,7 +3766,7 @@ static noinline void kvmppc_run_core(struct kvmppc_vcore *vc)
|
||||
pvc->pcpu = pcpu + thr;
|
||||
for_each_runnable_thread(i, vcpu, pvc) {
|
||||
kvmppc_start_thread(vcpu, pvc);
|
||||
kvmppc_create_dtl_entry(vcpu, pvc, mftb());
|
||||
kvmppc_create_dtl_entry(vcpu, pvc);
|
||||
trace_kvm_guest_enter(vcpu);
|
||||
if (!vcpu->arch.ptid)
|
||||
thr0_done = true;
|
||||
@ -4332,7 +4342,7 @@ static int kvmppc_run_vcpu(struct kvm_vcpu *vcpu)
|
||||
if ((vc->vcore_state == VCORE_PIGGYBACK ||
|
||||
vc->vcore_state == VCORE_RUNNING) &&
|
||||
!VCORE_IS_EXITING(vc)) {
|
||||
kvmppc_create_dtl_entry(vcpu, vc, mftb());
|
||||
kvmppc_create_dtl_entry(vcpu, vc);
|
||||
kvmppc_start_thread(vcpu, vc);
|
||||
trace_kvm_guest_enter(vcpu);
|
||||
} else if (vc->vcore_state == VCORE_SLEEPING) {
|
||||
@ -4510,7 +4520,7 @@ int kvmhv_run_single_vcpu(struct kvm_vcpu *vcpu, u64 time_limit,
|
||||
local_paca->kvm_hstate.ptid = 0;
|
||||
local_paca->kvm_hstate.fake_suspend = 0;
|
||||
|
||||
kvmppc_create_dtl_entry(vcpu, vc, tb);
|
||||
__kvmppc_create_dtl_entry(vcpu, pcpu, tb + vc->tb_offset, 0);
|
||||
|
||||
trace_kvm_guest_enter(vcpu);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user