When we have "block_ns > halt_poll_ns" and "block_ns < max_halt_poll_ns", then "halt_poll_ns < max_halt_poll_ns" is true, so we can drop this extra condition. We want to make sure halt_poll_ns is not zero before shrinking it. Put the condition in shrinking primitive can make code clearer. None functional change. Signed-off-by: Keqian Zhu <zhukeqian1@xxxxxxxxxx> --- Documentation/virt/kvm/halt-polling.rst | 21 ++++++++++----------- virt/kvm/kvm_main.c | 11 ++++++----- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Documentation/virt/kvm/halt-polling.rst b/Documentation/virt/kvm/halt-polling.rst index 4922e4a15f18..d9f699395a7f 100644 --- a/Documentation/virt/kvm/halt-polling.rst +++ b/Documentation/virt/kvm/halt-polling.rst @@ -47,17 +47,16 @@ Thus this is a per vcpu (or vcore) value. During polling if a wakeup source is received within the halt polling interval, the interval is left unchanged. In the event that a wakeup source isn't received during the polling interval (and thus schedule is invoked) there are -two options, either the polling interval and total block time[0] were less than -the global max polling interval (see module params below), or the total block -time was greater than the global max polling interval. - -In the event that both the polling interval and total block time were less than -the global max polling interval then the polling interval can be increased in -the hope that next time during the longer polling interval the wake up source -will be received while the host is polling and the latency benefits will be -received. The polling interval is grown in the function grow_halt_poll_ns() and -is multiplied by the module parameters halt_poll_ns_grow and -halt_poll_ns_grow_start. +two options, either the total block time[0] were less than the global max +polling interval (see module params below), or the total block time was greater +than the global max polling interval. + +In the event that the total block time were less than the global max polling +interval then the polling interval can be increased in the hope that next time +during the longer polling interval the wake up source will be received while the +host is polling and the latency benefits will be received. The polling interval +is grown in the function grow_halt_poll_ns() and is multiplied by the module +parameters halt_poll_ns_grow and halt_poll_ns_grow_start. In the event that the total block time was greater than the global max polling interval then the host will never poll for long enough (limited by the global diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 6b4feb92dc79..13a9996c4ccb 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2906,6 +2906,9 @@ static void shrink_halt_poll_ns(struct kvm_vcpu *vcpu) unsigned int old, val, shrink; old = val = vcpu->halt_poll_ns; + if (!old) + return; + shrink = READ_ONCE(halt_poll_ns_shrink); if (shrink == 0) val = 0; @@ -3003,12 +3006,10 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu) if (block_ns <= vcpu->halt_poll_ns) ; /* we had a long block, shrink polling */ - else if (vcpu->halt_poll_ns && - block_ns > vcpu->kvm->max_halt_poll_ns) + else if (block_ns > vcpu->kvm->max_halt_poll_ns) shrink_halt_poll_ns(vcpu); - /* we had a short halt and our poll time is too small */ - else if (vcpu->halt_poll_ns < vcpu->kvm->max_halt_poll_ns && - block_ns < vcpu->kvm->max_halt_poll_ns) + /* we had a short block, grow polling */ + else if (block_ns < vcpu->kvm->max_halt_poll_ns) grow_halt_poll_ns(vcpu); } else { vcpu->halt_poll_ns = 0; -- 2.19.1