lkml.org 
[lkml]   [2015]   [Sep]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
SubjectRe: [PATCH v6 2/3] KVM: dynamic halt_poll_ns adjustment
From
Date
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


\
 
 \ /
  Last update: 2015-09-04 04:01    [W:0.113 / U:0.268 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site