[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 2/2] x86/mwait-idle: squash stats update when not actually entering C-state


  • To: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • From: Jan Beulich <jbeulich@xxxxxxxx>
  • Date: Tue, 1 Feb 2022 13:45:40 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=lzWQu8Yey2mGbU6hFumi3h2Cej8BlfX6CCzHEdk10pA=; b=LiNtpV8JMoeoVeBXZL5cDTGQHuEtfGRW0gAWlwlYeFPKqEm9HyZEyH6t0+CegA6OsIIdUWTZal33j3elt0uIOf/d/ZOzrtPtUcjs3bWkYPKN1RAm+TCpnn+7uSlPOVDatfb/XrAAGc8CsodlFLYdafDWB+yFdBZuCFTXmDyfWkS6FvFXx+PoQiDbGVkX6a3Emkw9KL6XuJQj3wgpZawokqlkLPFITv9kaY+BC65yTA9OS+UFY/kov6Jeba9uHBIgtHi4LXTDMhDXY2eTTVAQKTD2o5K5WH0llPRTndsIUROgw1wHDq2WyGcBYl6pd86hW1NpRKIeYJvBAKXr9VpDzA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=n8IIROI257uPdoo9B39Zot2v3If09AZSKZILx2PTOAKpwS7mvXh7ZYd/OTW0dB6iVYjWvuu4RcBsjFVXaPTUkgLHslTYaCgtWKU43OrdxIYj63pZa2j98dIDwdAOp4BoaCsbbi/KKH4vu7bMs4s1kiLcMTBWp0Aq4dsiSRBz3/Mst0e2Gf8awm93Eh9/6MOwr8uJldIKYtfAoaWBt2pWmk4v7LY8YYRd5qVAVNALtW+XZH3bPRhXj0ro+TsUvTaGeZazfLMKmu7FWDqk64BMfUmE3uOEYUc53hiGNWLG9xd0ArZhAYNmY2prlvoHwNMuBekOU7xl8TQMUQQOKPpXCg==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com;
  • Cc: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>
  • Delivery-date: Tue, 01 Feb 2022 12:45:54 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 01.02.2022 13:42, Roger Pau Monné wrote:
> On Tue, Feb 01, 2022 at 12:37:27PM +0100, Jan Beulich wrote:
>> On 01.02.2022 12:04, Roger Pau Monné wrote:
>>> On Thu, Jan 27, 2022 at 04:13:47PM +0100, Jan Beulich wrote:
>>>> While we don't want to skip calling update_idle_stats(), arrange for it
>>>> to not increment the overall time spent in the state we didn't really
>>>> enter.
>>>>
>>>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>>>> ---
>>>> RFC: If we wanted to also move the tracing, then I think the part ahead
>>>>      of the if() also would need moving. At that point we could as well
>>>>      move update_last_cx_stat(), too, which afaict would allow skipping
>>>>      update_idle_stats() on the "else" path (which therefore would go
>>>>      away). Yet then, with the setting of power->safe_state moved up a
>>>>      little (which imo it should have been anyway) the two
>>>>      cpu_is_haltable() invocations would only have the lapic_timer_off()
>>>>      invocation left in between. This would then seem to call for simply
>>>>      ditching the 2nd one - acpi-idle also doesn't have a 2nd instance.
>>>
>>> It's possible for lapic_timer_off to take a non-trivial amount of time
>>> when virtualized, but it's likely we won't be using mwait in that
>>> case, so not sure it matter much to have the two cpu_is_haltable calls
>>> if there's just a lapic_timer_off between them.
>>>
>>>> TBD: For the tracing I wonder if that really needs to come ahead of the
>>>>      local_irq_enable(). Maybe trace_exit_reason() needs to, but quite
>>>>      certainly TRACE_6D() doesn't.
>>>
>>> Would be good if it could be moved after the local_irq_enable call, as
>>> it's not as trivial as I've expected, and will just add latency to any
>>> pending interrupt waiting to be serviced. FWIW, I haven't spotted a
>>> need to call it with interrupt disabled.
>>
>> Okay, I guess I'll to the larger rework then.
>>
>>>> --- a/xen/arch/x86/cpu/mwait-idle.c
>>>> +++ b/xen/arch/x86/cpu/mwait-idle.c
>>>> @@ -854,17 +854,23 @@ static void mwait_idle(void)
>>>>            mwait_idle_with_hints(cx->address, MWAIT_ECX_INTERRUPT_BREAK);
>>>>  
>>>>            local_irq_disable();
>>>> -  }
>>>>  
>>>> -  after = alternative_call(cpuidle_get_tick);
>>>> +          after = alternative_call(cpuidle_get_tick);
>>>> +
>>>> +          cstate_restore_tsc();
>>>> +
>>>> +          /* Now back in C0. */
>>>> +          update_idle_stats(power, cx, before, after);
>>>> +  } else {
>>>> +          /* Never left C0. */
>>>> +          after = alternative_call(cpuidle_get_tick);
>>>> +          update_idle_stats(power, cx, after, after);
>>>
>>> While adjusting this, could you also modify update_idle_stats to avoid
>>> increasing cx->usage if before == after (or !sleep_ticks). I don't
>>> think it's fine to increase the state counter if we never actually
>>> entered it.
>>
>> I did consider it but then decided against. Even leaving this aspect
>> aside the counter only counts _attempts_ to enter a certain state;
>> the CPU may find reasons to never actually enter it. And what we have
>> when before == after is still an attempt, albeit an unsuccessful one.
> 
> Right, in which case:
> 
> Acked-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>

Thanks, but ...

> Not sure whether you would like to commit this now and do the lager
> rework as a followup patch. That would be fine by me.

... no, I'd rather do this in a single step. In its current shape the
patch is actually moving us in the opposite direction.

Jan




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.