"Легальный" deadlock при управлении питанием в W2K/XP

From
Gennady Mayko ()
To
Leo Yuriev ()
Date
2003-01-22T19:27:05Z
Area
SU.WINDOWS.NT.PROG
From: "Gennady Mayko" <gennady.mayko@broadcom.com>

Добрый день!

 LY> From: "Leo Yuriev" <ly@elcat.kg>

 GM>> From: "Gennady Mayko" <gennady.mayko@broadcom.com>

 GM>> --
 GM>> Я стараюсь так не делать и иметь только один "power policy owner"
 GM>> драйвер  в стеке драйверов, который отвечает за все "манипуляции" с
 GM>> "power" для  устройства (PCI платы), которым он управляет.

 LY> Конечно больше одного "power policy owner" это ненормально, но я все же
 LY> убежден что в этом нет ничего фатального. Точнее говоря два "power policy
 LY> owner" не создают каких-либо ситуаций, которые невозможно получить другим
 LY> способом, просто лишние IRP.

 LY> И стека драйверов тут получается как минимум два, один от BusPDO (который
 LY> под BusFDO), и второй от каждого ChildPDO и выше. Поэтому и "power policy
 LY> owner" должно быть два. Другое дело что BusFDO и все ChildPDO
 LY> обслуживаются одним драйвером.
--
Я немного порылся по Интернету и теперь (примерно) представляю конфигурацию
твоей платы и стек драйверов для нее. К сожалению, в моем случае конфигурация
была другой и, в некотором смысле, проще; несмотря на то, что мои платы
"физически" поддерживали DeviceState D2, они попадали в класс устройств,
которые должны поддерживать только DeviceState D0 и D3; это мое устройство не
могло "wake-up" систему.

Если бы я разрабатывал драйверы в твоей конфигурации, я бы сосредоточил все
управление device power management'ом или в ChildFDO (если я его разрабатываю
сам), или (если ChildFDO есть стандартный системный драйвер типа serial.sys),
то в драйвере-фильтре над (или под) этим стандартным ChildFDO. Я думаю, что
регистры PCI контроллера на плате, которые управляют power management'ом,
доступны только из BusFDO (или из ChildPDO), нет? Если да, то тогда всю
аппаратную поддержку "power management'a" я бы сделал в этом (этих) последнем
драйвере и сделал бы в них какой-нибудь приватный интерфейс, чтобы ChildFDO
(или драйвер-фильтр) смог асинхронно пользоваться соответствующим "power
management" сервисом. Но этот последний драйвер не являлся бы "power policy
owner'ом"!

Но, боюсь, я не владею всей информацией и такой подход может не работать.




 GM>> Насколько я понял, в описанном тобой случае эти 2 драйвера каким-то
 GM>> образом должны знать о состоянии друг друга и "договориться" о
 GM>> совместных  действиях в той или иной ситуации (например, после п.3
 GM>> BusFDO уже не  должен пытаться посылать запрос на PowerDeviceD3 или по
 GM>> крайней мере  должен его отложить до обработки уже запущенного).

 LY> Как я уже говорил для BusFDO и ChildPDO драйвер один, еще один драйвер
 LY> будет для ChildFDO. Причем этому драйвер будет (и должно быть) все равно
 LY> как работает его "шина".

 LY> Никакой синхронизации и/или взаимодействия не получается, потому что над
 LY> BusFDO и над ChildPDO может быть сколь угодно толстый "пирог" драйверов.
 LY> Иначе говоря ни BusFDO, ни ChildPDO не могут знать ли power-стек
 LY> "корреспондента" каким-либо IRP-запросом. Мне кажется это именно изян в
 LY> архитектуре управления питанием W2K/XP.
--
Почему не могут знать? По моему могут - ведь power management IRP всегда идут
"сверху вниз", т.е. первыми попадают к ChildPDO, а затем уже к BusFDO. Так что
теоретически можно сообщить BusFDO (еще до посылки ChildPDO драйвером IRP
"вниз"), что таки да обрабытываются power management IRP. Тем более, что, как
я понял, ChildPDO и BusFDO вообще "находятся" в одном драйвере.



 GM>> Нельзя ли IdleDetection перенести выше, в ChildPDO, так чтобы полностью
 GM>> избавить BusFDO от этого? Я понимаю, что это своеобразное "дублирование"
 GM>> и "размазывание" ответственности (потому что может быть несколько
 GM>> ChildPDO), но все же...

 LY> IdleDetection есть и в BusFDO, и в Child (но не в PDO, а в FDO). Никакого
 LY> дублирования нет, BusFDO отключается по таймауту неиспользования всех его
 LY> ChildPDOs, а в Child-стеках IdleDetection делает (или не делает)
 LY> FDO-драйвер.

 GM>> А какой шиной (bus) управляет BusFDO и чем управляют ChildPDO, если не
 GM>> секрет?

 LY> Я делаю драйвера с использованием своей библиотеки С++, в которой
 LY> частности реализован "образцовый" bus-драйвер. Поэтому это относится к
 LY> "универсальному" случаю. Последние "эксперименты" делаются на плате
 LY> Omega2-PCI, ChildPDO это memory-mapped COM-порты
 LY> (http://leo.yuriev.ru/SerialXP).

 LY> Взаимно.
 LY> Леонид.

С уважением,
Геннадий Майко.

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)