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


IOCTL_VPCI_INVALIDATE_BLOCK IOCTL (vpci.h)

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

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

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

Основной код

IRP_MJ_DEVICE_CONTROL

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

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

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

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

Замечания

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

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

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

член IRP Ценность
UserBuffer NULL
UserEvent Адрес объекта события, который был инициализирован в вызове подпрограммы KeInitializeE vent.
Примечание Если асинхронное завершение запроса 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.
параметров.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 не должен выдавать запрос IOCTL_VPCI_INVALIDATE_BLOCK. Вместо этого для обработки уведомлений о недопустимых данных блока конфигурации VF выполняются следующие действия.
  1. В гостевой ОС NDIS выдает запрос IOCTL_VPCI_INVALIDATE_BLOCK.
  2. В операционной системе управления выполняются следующие действия:
    1. Драйвер мини-порта PF вызывает функцию NdisMInvalidateConfigBlock, чтобы уведомить NDIS о том, что изменены данные конфигурации VF и больше не являются допустимыми. Драйвер задает параметр BlockMaskбитовую маску ULONGLONG, указывающую, какие блоки конфигурации VF изменились. Каждый бит в битовой маске соответствует блоку конфигурации VF. Если для бита задано одно значение, данные в соответствующем блоке конфигурации VF изменились.
    2. NDIS сигнализирует стек виртуализации, который выполняется в операционной системе управления, об изменении данных блока конфигурации VF. Стек виртуализации кэширует данные параметров BlockMask.
      Примечание Каждый раз, когда драйвер мини-порта PF вызывает NdisMInvalidateConfigBlock, стек виртуализации ORпараметров BlockMask с текущим значением в кэше.
       
    3. Стек виртуализации уведомляет драйвер виртуальной PCI (VPCI), который выполняется в гостевой ОС, о недопустимости данных конфигурации VF. Стек виртуализации отправляет кэшированные данные параметров BlockMask драйверу VPCI.
  3. В гостевой ОС выполняются следующие действия.
    1. Драйвер VPCI сохраняет кэшированные данные параметра BlockMask 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. Указатель на структуру NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO передается в запросе OID. Эта структура содержит кэшированные данные параметров 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 (include 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