[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <BLU436-SMTP48C469210EC2FC5B0AB64F80570@phx.gbl>
Date: Fri, 4 Sep 2015 09:42:10 +0800
From: Wanpeng Li <wanpeng.li@...mail.com>
To: David Matlack <dmatlack@...gle.com>
CC: Paolo Bonzini <pbonzini@...hat.com>,
kvm list <kvm@...r.kernel.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH v6 2/3] KVM: dynamic halt_poll_ns adjustment
On 9/4/15 9:16 AM, Wanpeng Li wrote:
> [...]
>>> +
>>> static int kvm_vcpu_check_block(struct kvm_vcpu *vcpu)
>>> {
>>> if (kvm_arch_vcpu_runnable(vcpu)) {
>>> @@ -1929,6 +1963,7 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
>>> ktime_t start, cur;
>>> DEFINE_WAIT(wait);
>>> bool waited = false;
>>> + u64 poll_ns = 0, wait_ns = 0, block_ns = 0;
>>>
>>> start = cur = ktime_get();
>>> if (vcpu->halt_poll_ns) {
>>> @@ -1941,10 +1976,15 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
>>> */
>>> if (kvm_vcpu_check_block(vcpu) < 0) {
>>> ++vcpu->stat.halt_successful_poll;
>>> - goto out;
>>> + break;
>>> }
>>> cur = ktime_get();
>>> } while (single_task_running() && ktime_before(cur,
>>> stop));
>>> +
>>> + if (ktime_before(cur, stop)) {
>> You can't use 'cur' to tell if the interrupt arrived.
>> single_task_running()
>> can break us out of the loop before 'stop'.
>>
>>> + poll_ns = ktime_to_ns(cur) -
>>> ktime_to_ns(start);
>> Put this line before the if(). block_ns should always include the time
>> spent polling; even if polling does not succeed.
>
> Ah, I remember why I keep poll_ns calculation in if(). Actually
> poll_ns has already been accumulated into wait_ns(see how wait_ns is
> calculated) if polling does not succeed. If put poll_ns calculation
> before if() I need to reset variable 'start' to ktime_get().
So how about something like:
@@ -1928,7 +1962,8 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
{
ktime_t start, cur;
DEFINE_WAIT(wait);
- bool waited = false;
+ bool polled = false, waited = false;
+ u64 poll_ns = 0, wait_ns = 0, block_ns = 0;
start = cur = ktime_get();
if (vcpu->halt_poll_ns) {
@@ -1940,11 +1975,17 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
* arrives.
*/
if (kvm_vcpu_check_block(vcpu) < 0) {
+ polled = true;
++vcpu->stat.halt_successful_poll;
- goto out;
+ break;
}
cur = ktime_get();
} while (single_task_running() && ktime_before(cur, stop));
+
+ if (polled) {
+ poll_ns = ktime_to_ns(cur) - ktime_to_ns(start);
+ goto out;
+ }
}
Regards,
Wanpeng Li
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists