DPC на SMP

Тема в разделе "WASM.NT.KERNEL", создана пользователем gilg, 16 апр 2007.

  1. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Есть _почти_ рабочий драйвер, в котором ставятся на обслуживание DPC на другие процессоры. Работает замечательно на машинах с гиперфредингом. Но на 4-процессорном серваке система наглухо виснет при обработке DPC (BSoDa нет, отладчик удается подключить один раз из десяти, и ничего полезного не видно). Система Windows 2000 Advanced Server, двухпроцессорная с гиперфредингом (итого 4). С отключенным гиперфредингом аналогично.

    Единственное упоминание об аналогичной проблеме нашел на багтраке:
    Есть ли зерно истины в этих словах? И с чем еще может быть связана проблема?
     
  2. @Asterisk@

    @Asterisk@ New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    7
    В IPI системах есть один ведущий процессор, все остальные ведомые. Т.е. при инициализации системы работает только 0-ой, потом через трамплин-код подымаются другие и через IPI канал получают дальнейшее руководство к действию.
    Я так понял, что у тебя DPC-шки должны положить все процессоры в ожидания глобального лока.
    Думаю, что тебе нельзя лочить нулевой процессор выполняясь на другом, попробуй поставить DPC на нулевой процессор, чтобы гарантированно выполнится на нём.
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Вчера нашел, в чем была проблема. Оказалось, что проявлялся крайне неочевидный deadlock между тремя разными функциями. Самым интересным во всем этом было поведение отладчиков: WinDbg не мог переключиться на "подвисший" процессор, потому что тот выполнялся на IRQL=DPC_LEVEL и с выключенными прерываниями. SoftIce же все время показывал одно и то же значение EIP на этом процессоре. Поэтому и возникло предположение об аппаратной природе ошибки
     
  4. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    gilg
    а можно поподробнее про этот неочевидный лок?
     
  5. @Asterisk@

    @Asterisk@ New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    7
    А что тут подробного? --- KeAcquireSpinLockAtDpcLevel, на MP смотрим ИДУ...
     
  6. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    я вот об этом
     
  7. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Nouzui
    В моей программулине естественно. На одном проце KeAcquireSpinLock, затем ставил в очередь DPC на остальные процы. В это время иногда срабатывало прерывание, часть обработки которого происходит также на DPC. В обработчике было ожидание на этом же спин-локе. Проблема в обнаружении была связана, как я уже написал, со странным (как поначалу казалось :)) поведением отладчиков и с тем, что deadlock происходил при солидной нагрузке в непредсказуемых местах кода. Ну а нашелся он в результате десятитысячного просмотра кода :)