Поделиться через


IOCTL_VPCI_INVALIDATE_BLOCK IOCTL (vpci.h)

Драйвер виртуальной функции PCI Express (PCIe) выдает запрос IOCTL IOCTL_VPCI_INVALIDATE_BLOCK , чтобы получать уведомления об изменениях данных в одном или нескольких блоках конфигурации VF. После завершения IOCTL драйвер получает уведомление об этих изменениях. После уведомления драйвер должен предположить, что все данные, ранее считанные из указанных блоков конфигурации VF, стали недопустимыми. Поэтому драйвер должен обновить свой кэш, считывая данные блока конфигурации снова.

Драйвер выдает этот IOCTL следующему драйверу в стеке драйверов.

Примечание Этот запрос IOCTL отправляется драйвером PCIe VF на устройстве, поддерживающем интерфейс SR-IOV.
 
Когда драйвер выдает IOCTL_VPCI_INVALIDATE_BLOCK IOCTL, драйвер должен выполнить следующие действия:
Подготовка структуры пакета запроса ввода-вывода
Подготовка структуры расположения стека ввода-вывода
Выдача запроса IOCTL
Результаты завершения запроса IOCTL
Дополнительные сведения о выдаче ioCTL между драйверами в режиме ядра см. в разделе Создание запросов IOCTL в драйверах.

Основной код

IRP_MJ_DEVICE_CONTROL

Блок состояния

Irp-IoStatus.Status> имеет значение STATUS_SUCCESS, если запрос выполнен успешно.

В противном случае — состояние соответствующего условия ошибки в виде кода NTSTATUS.

Дополнительные сведения см. в разделе [значения XREF-LINK:NTSTATUS].

Комментарии

Подготовка структуры пакета запроса ввода-вывода

Драйвер должен сначала выделить или повторно использовать пакет запросов ввода-вывода (IRP). Для выделения IOCTL IRP можно использовать подпрограмму IoBuildDeviceIoControlRequest . Вы также можете использовать процедуры создания и инициализации IRP общего назначения, такие как IoAllocateIrp, IoReuseIrp или IoInitializeIrp. Дополнительные сведения о выделении IRP см. в разделе Создание irP для драйверов Lower-Level.

Затем драйвер должен задать элементы структуры IRP , как описано в следующей таблице.

Элемент IRP Значение
UserBuffer NULL
UserEvent Адрес объекта события, который был инициализирован в вызове подпрограммы KeInitializeEvent .
Примечание Если асинхронное завершение запроса IOCTL не требуется, этот элемент должен иметь значение NULL. Дополнительные сведения см. в разделе Создание запросов IOCTL в драйверах.
 
UserIosb Адрес структуры, выделенной вызывающей IO_STATUS_BLOCK . Эта структура обновляется нижним драйвером, чтобы указать окончательное состояние запроса ввода-вывода.
 

Подготовка структуры расположения стека ввода-вывода

Драйвер вызывает подпрограмму IoGetNextIrpStackLocation для доступа к расположению стека ввода-вывода нижнего драйвера. Эта функция возвращает указатель на структуру IO_STACK_LOCATION , содержащую параметры для расположения стека ввода-вывода.

Затем драйвер должен задать члены в структуре IO_STACK_LOCATION , как описано в следующей таблице.

элемент IO_STACK_LOCATION Значение
MajorFunction

IRP_MJ_INTERNAL_DEVICE_CONTROL

Параметры. DeviceIoControl. IoControlCode

IOCTL_VPCI_INVALIDATE_BLOCK

Параметры. DeviceIoControl. Type3InputBuffer Указатель на структуру VPCI_INVALIDATE_BLOCK_OUTPUT . Драйвер форматирует эту структуру с помощью параметров для запроса ввода-вывода IOCTL_VPCI_INVALIDATE_BLOCK .
Параметры I. DeviceIoControl. InputBufferLength Размер структуры VPCI_INVALIDATE_BLOCK_OUTPUT в байтах.
Параметры. DeviceIoControl. OutputBufferLength Размер буфера, выделенного вызывающим объектом, в байтах, который будет содержать считываемые данные конфигурации.
Примечание Это значение должно совпадать со значением элемента BytesRequestedструктуры VPCI_INVALIDATE_BLOCK_OUTPUT .
 
 

Выдача запроса IOCTL

Чтобы выполнить этот запрос IOCTL, драйвер вызывает подпрограмму IoCallDriver для передачи запроса следующему драйверу в стеке драйверов. Драйвер задает параметры IoCallDriver , как описано в следующей таблице.
Параметр IoCallDriver Значение
DeviceObject Объект устройства нижнего драйвера.
Irp Адрес IRP , который был ранее выделен и инициализирован. Дополнительные сведения см. в статье Подготовка структуры пакетов запроса ввода-вывода.
 

Результаты завершения запроса IOCTL

После завершения запроса IOCTL IOCTL_VPCI_INVALIDATE_BLOCK члены структуры, выделенной вызывающим объектом IO_STATUS_BLOCK , получают значения, приведенные в следующей таблице.

Значение состояния Значение
Состояние STATUS_SUCCESS
Информация Ноль
 

После выдачи и завершения IOCTL_VPCI_INVALIDATE_BLOCK IOCTL драйвер VF получает уведомление о том, что драйвер PF изменил (сделал недействительными) данные в одном или нескольких блоках конфигурации VF.

Примечание Операционная система резервирует и управляет ресурсами, необходимыми для успешного выполнения этого IOCTL.
 
Блок конфигурации VF используется для обмена данными между драйверами PCIe PF и VF на устройстве, поддерживающем интерфейс SR-IOV. Данными конфигурации VF можно обмениваться между следующими драйверами:
  • Драйвер VF, который выполняется в гостевой операционной системе. Эта операционная система работает в дочернем разделе Hyper-V.
  • Драйвер PF, который работает в операционной системе управления.

    Эта операционная система работает в родительском разделе Hyper-V.

Начиная с версии NDIS 6.30 драйвер VF miniport не должен выдавать запрос IOCTL_VPCI_INVALIDATE_BLOCK . Вместо этого для обработки уведомлений о недействительных данных блока конфигурации VF выполняются следующие действия.
  1. В гостевой ОС NDIS отправляет запрос IOCTL_VPCI_INVALIDATE_BLOCK .
  2. В ОС управления выполняются следующие действия.
    1. Драйвер минипорта PF вызывает функцию NdisMInvalidateConfigBlock , чтобы уведомить NDIS о том, что данные конфигурации VF изменились и больше не действительны. Драйвер задает для параметра BlockMask битовую маску ULONGLONG , которая указывает, какие блоки конфигурации VF были изменены. Каждый бит в битовой маске соответствует блоку конфигурации VF. Если бит имеет значение 1, данные в соответствующем блоке конфигурации VF изменились.
    2. NDIS сообщает стеку виртуализации, который работает в ОС управления, об изменении данных блока конфигурации VF. Стек виртуализации кэширует данные параметра BlockMask .
      Примечание Каждый раз, когда драйвер минипорта PF вызывает NdisMInvalidateConfigBlock, стек виртуализации ИЛИвозвращает данные параметра BlockMask с текущим значением в кэше.
       
    3. Стек виртуализации уведомляет драйвер виртуального PCI (VPCI), который работает в гостевой ОС, о том, что данные конфигурации VF недействительны. Стек виртуализации отправляет кэшированные данные параметров BlockMask драйверу VPCI.
  3. В гостевой ОС выполняются следующие действия.
    1. Драйвер VPCI сохраняет кэшированные данные параметров BlockMask в элементе BlockMaskструктуры VPCI_INVALIDATE_BLOCK_OUTPUT, связанной с запросом IOCTL_VPCI_INVALIDATE_BLOCK .
    2. Драйвер VPCI успешно завершает запрос IOCTL_VPCI_INVALIDATE_BLOCK . В этом случае NDIS отправляет запрос идентификатора объекта (OID) OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK драйверу мини-порта VF. В запросе OID передается указатель на структуру NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO . Эта структура содержит кэшированные данные параметров BlockMask .

      NDIS также отправляет другой запрос IOCTL_VPCI_INVALIDATE_BLOCK для обработки последовательных уведомлений об изменениях данных конфигурации VF.

    3. Когда драйвер VF обрабатывает запрос OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK , он считывает данные из указанных блоков конфигурации VF.
Примечание Использование блока конфигурации VF и формат его данных конфигурации определяются независимым поставщиком оборудования (IHV) устройства. Данные конфигурации используются только драйверами PF и VF.
 

Требования

Требование Значение
Минимальная версия клиента Поддерживается в Windows Server 2012 и более поздних версиях Windows.
Верхняя часть vpci.h (включая Wdm.h)
IRQL DISPATCH_LEVEL

См. также раздел

IO_STATUS_BLOCK

VPCI_INVALIDATE_BLOCK_OUTPUT

NdisMInvalidateConfigBlock

IRP_MJ_INTERNAL_DEVICE_CONTROL

Создание запросов IOCTL в драйверах

IRP

IO_STACK_LOCATION

IoCallDriver

OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK

NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO