"Легальный" deadlock при управлении питанием в W2K/XP
- From
- Leo Yuriev ()
- To
- Gennady Mayko ()
- Date
- 2003-01-22T17:46:25Z
- Area
- SU.WINDOWS.NT.PROG
From: "Leo Yuriev" <ly@elcat.kg>
Wed Jan 22 2003 16:22, Gennady Mayko wrote to Leo Yuriev:
GM> From: "Gennady Mayko" <gennady.mayko@broadcom.com>
GM> Добрый день!
LY>> From: "Leo Yuriev" <ly@elcat.kg>
LY>> BusFDO является "power policy owner" для своего стека, но над каждым
LY>> ChildPDO есть "ChildFDO", соответственно каждый из этих ChildFDO
LY>> является "power policy owner" на своем стеке.
LY>> Но даже если будут два "power policy owner" то ситуация будет не хуже
LY>> чем с одним "power policy owner". Просто на каждый SystemPower-запрос
LY>> будет посылаться не один, а два (или больше) DevicePower-запроса. При
LY>> этом при PowerDown "главным" будет самый нижний "power policy owner", а
LY>> при PowerUp - самый верхний. Я экспериментировал, все работает если нет
LY>> описаной deadlock-ситуации.
GM> --
GM> Я стараюсь так не делать и иметь только один "power policy owner" драйвер
GM> в стеке драйверов, который отвечает за все "манипуляции" с "power" для
GM> устройства (PCI платы), которым он управляет.
Конечно больше одного "power policy owner" это ненормально, но я все же
убежден что в этом нет ничего фатального. Точнее говоря два "power policy
owner" не создают каких-либо ситуаций, которые невозможно получить другим
способом, просто лишние IRP.
И стека драйверов тут получается как минимум два, один от BusPDO (который под
BusFDO), и второй от каждого ChildPDO и выше. Поэтому и "power policy owner"
должно быть два. Другое дело что BusFDO и все ChildPDO обслуживаются одним
драйвером.
GM> Насколько я понял, в описанном тобой случае эти 2 драйвера каким-то
GM> образом должны знать о состоянии друг друга и "договориться" о совместных
GM> действиях в той или иной ситуации (например, после п.3 BusFDO уже не
GM> должен пытаться посылать запрос на PowerDeviceD3 или по крайней мере
GM> должен его отложить до обработки уже запущенного).
Как я уже говорил для BusFDO и ChildPDO драйвер один, еще один драйвер будет
для ChildFDO. Причем этому драйвер будет (и должно быть) все равно как
работает его "шина".
Никакой синхронизации и/или взаимодействия не получается, потому что над
BusFDO и над ChildPDO может быть сколь угодно толстый "пирог" драйверов. Иначе
говоря ни BusFDO, ни ChildPDO не могут знать ли power-стек "корреспондента"
каким-либо IRP-запросом. Мне кажется это именно изян в архитектуре управления
питанием W2K/XP.
GM> Нельзя ли IdleDetection перенести выше, в ChildPDO, так чтобы полностью
GM> избавить BusFDO от этого? Я понимаю, что это своеобразное "дублирование"
GM> и "размазывание" ответственности (потому что может быть несколько
GM> ChildPDO), но все же...
IdleDetection есть и в BusFDO, и в Child (но не в PDO, а в FDO). Никакого
дублирования нет, BusFDO отключается по таймауту неиспользования всех его
ChildPDOs, а в Child-стеках IdleDetection делает (или не делает) FDO-драйвер.
GM> А какой шиной (bus) управляет BusFDO и чем управляют ChildPDO, если не
GM> секрет?
Я делаю драйвера с использованием своей библиотеки С++, в которой частности
реализован "образцовый" bus-драйвер. Поэтому это относится к "универсальному"
случаю. Последние "эксперименты" делаются на плате Omega2-PCI, ChildPDO это
memory-mapped COM-порты (http://leo.yuriev.ru/SerialXP).
GM> --
GM> С уважением,
GM> Геннадий Майко.
Взаимно.
Леонид.
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)