На днях отлаживал драйвер, нашел свою ошибку, исправил. Но по-пути пришел к выводу что в системе управления питанием 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-запросов должна быть последовательной хотя и асинхронной, и всегда начинаться с верхушки стека;
Ну хоть кто-нибуть что-нибудь понял ?
[NT] Управление питанием22.01.03 12:12 Автор: 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 не отвалится?
[NT] Re: А разве22.01.03 13:02 Автор: leo <Леонид Юрьев> Статус: Elderman