Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[NT] Управление питанием 22.01.03 12:12 Число просмотров: 1305
Автор: Sandy <Alexander Stepanov> Статус: Elderman
|
> На днях отлаживал драйвер, нашел свою ошибку, исправил. Но > по-пути пришел к выводу что в системе управления питанием > W2K/XP и т.д. возможен "корректный" deadlock. > Возможно что я ошибаюсь, вот собственно поэтому и хочу > обсудить... > > 1) Имеем два устройства "bus enumerator" - BusFDO и его > "child device" - ChildPDO. Оба устройства без > DO_POWER_INRUSH; > 2) Предположим что в некоторый момент времени BusFDO был в > PowerDeviceD1, а ChildPDO в PowerDeviceD2; > 3) Далее юзер начинает использовать ChildPDO, и > function-драйвер над ChildPDO запускает запрос на > PowerDeviceD0 для стека ChildPDO; > 4) Предположим, что одновременно с этим истекает интервал > IdleDetection для BusFDO, и "Power Manager" запускает > запрос на PowerDeviceD3 для BusFDO (или еще как-нибудь > возникает запрос на PowerDeviceD3); > 5) Далее bus-драйвер для ChildPDO запускает запрос на > PowerDeviceD0 для BusFDO и ждет результата, при этом > power-стек ChildPDO остается занятым; > 6) Но и стек BusFDO уже занят запросом PowerDeviceD3, > причем драйвер BusFDO сначала выключит все > child-устройства, и только потом продолжит обработку > запроса на PowerDeviceD3; > 7) В итоге получается deadlock между запросами, и его > нельзя просто "развязать" в bus-драйвере, потому что > обработка power-запросов должна быть последовательной хотя > и асинхронной, и всегда начинаться с верхушки стека; > > Ну хоть кто-нибуть что-нибудь понял ?
А разве повер манагер по таймауту от повердевайса0 не отвалится?
|
|
|