Re: Event based scheduling and USB.

From: Alexander Motin <mav_at_FreeBSD.org>
Date: Wed, 27 Oct 2010 11:14:18 +0300
Nate Lawson wrote:
> On 10/26/2010 12:57 PM, Alexander Motin wrote:
>> Takanori Watanabe wrote:
>>> I updated my FreeBSD tree on laptop, to the current
>>> as of 18 Oct.2010, it works fine with CPU C3 state enabled,
>>>
>>> I think this is your achievement of event time scheduler,
>>> thanks!
> 
> Ah, so mav_at_ implemented a tickless-scheduler? That is nice.

Not exactly. I've only made system to delay empty ticks when idle and
execute them later on wakeup in a batch. Scheduler work is still wanted.

>>> But when USB driver is enabled, the load average is considerablly 
>>> high (0.6 to 1.0) if sysctl oid kern.eventtimer.periodic is set to 0.
>>>  Then kern.eventtimer.periodic is set to 1, the load average goes
>>> to 0 quickly as before, but almost never transit to C3.
>>>
>>> Is this behavior expected, or something wrong?
> 
> The USB controller often keeps the bus mastering bit set. This keeps the
> system out of C3. The way to fix this is to implement global suspend.
> Put a device in suspend mode and then turn off power to the USB port it
> is on. Then the USB controller will stop polling the bus.

As I understand, if respective USB port is not used, USB stack should
put it into power_save mode not poll so often to deny entering C3 state.

>>> I noticed one of usb host controller device shares HPET irq.
>>> When I implement interrupt filter in uhci driver, the load average
>>> goes to 0 as before.
>>>
>>>
>>> ====
>>> % vmstat -i
>>> interrupt                          total       rate
>>> irq1: atkbd0                         398          2
>>> irq9: acpi0                          408          2
>>> irq12: psm0                            3          0
>>> irq19: ehci1                          37          0
>>> irq20: hpet0 uhci0                 35970        230
>>> irq22: ehci0                           2          0
>>> irq256: em0                            4          0
>>> irq257: ahci0                       1692         10
>>> Total                              38514        246
>>> ===
>> I haven't noticed that issue and it is surely not expected for me. I
>> will try to reproduce it.
>>
>> Most likely you should be able to avoid interrupt sharing using some
>> additional HPET options, described at hpet(4).
> 
> This seems silly. The whole point of APIC is to avoid clustering on a
> single interrupt but the BIOS put the timer on the USB controller irq?

HPET timer is not a regular ISA or PCI device. It allows several
different interrupt configurations. In most cases I remember, BIOS
setups interrupts 0 and 8, like for legacy_route mode. But this mode is
not really suitable as default in our case ATM due to conflict with
atrtc and attimer drivers.

-- 
Alexander Motin
Received on Wed Oct 27 2010 - 06:14:27 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:08 UTC