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


IOCTL_SRIOV_ATTACH IOCTL (pcivirt.h)

Запрос указывает, что стек виртуализации хочет зарегистрировать события Plug and Play, полученные устройством SR-IOV.

Основной код

IRP_MJ_DEVICE_CONTROL

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

Irp->IoStatus.Status STATUS_SUCCESS, если запрос выполнен успешно. В противном случае состояние соответствующего условия ошибки в качестве кода NTSTATUS.

Замечания

Этот запрос IOCTL отправляется стеком виртуализации в драйвер SR-IOV физической функции (PF) PCI Express, который предоставляет GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE.

Этот запрос небезопасн, если устройство PF в настоящее время остановлено или остановлено для повторного балансировки ресурсов. Устройство считается остановленным после получения IRP_MN_QUERY_STOP_DEVICE и перезапуска при получении IRP_MN_CANCEL_STOP_DEVICE или при завершении IRP_MN_START_DEVICE более низкими устройствами в стеке. В этом случае драйвер должен отложить завершение этого запроса до перезапуска устройства.

Не обязательно хранить этот IRP в ожидании, так как запрос всегда отправляется в виде синхронного режима ядра IRP, вызывающего вызывающий поток в любом случае.

По завершении этого запроса VSP может впоследствии отправлять IOCTL_SRIOV_NOTIFICATION и IOCTL_SRIOV_EVENT_COMPLETE запросы.

Чтобы отменить регистрацию событий Plug and Play, VSP отправляет запрос IOCTL_SRIOV_DETACH.

Эти события (определенные в SRIOV_PF_EVENT) вызывают завершение IOCTL_SRIOV_NOTIFICATION и ожидание IOCTL_SRIOV_EVENT_COMPLETE:

  • IRP_MN_QUERY_STOP_DEVICE создает ШриовЕвентPfQueryStopDevice.
  • IRP_MN_START_DEVICE создает ШриовEventPfRestart, если и только если устройство было остановлено для повторной балансировки (см. выше).
  • IRP_MN_CANCEL_STOP_DEVICE создает ШриовEventPfRestart, только если устройство было остановлено для повторной балансировки.
  • IRP_MN_QUERY_REMOVE_DEVICE создает ШриовЕвентPfQueryRemoveDevice.
  • IRP_MN_SURPRISE_REMOVAL создает ШриовЕвентPfSurpriseRemoveDevice.
В этом примере обработка запроса IOCTL_SRIOV_ATTACH драйвер PF сохраняет состояния PnP в контексте устройства. УстройствоContext->PnpRebalancing имеет значение TRUE, когда драйвер получает IRP_MN_QUERY_STOP_DEVICE и задает значение FALSE при получении IRP_MN_START_DEVICE.
    case IOCTL_SRIOV_ATTACH:
        TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL, "IOCTL_SRIOV_ATTACH:\n");

        WdfWaitLockAcquire(fdoContext->PnpStateLock, NULL);

        //
        // Block until it is safe for the VSP to attach.  Don't
        // bother with pending this IRP since this is always a sent as
        // a synchronous kernel-mode IRP and the caller would block
        // the thread anyway.  May need to repeat the wait since
        // waiting for the safe-to-attach event must not be done while
        // holding the state lock.
        //
        while (fdoContext->PnpSafeToAttach == FALSE)
        {
            WdfWaitLockRelease(fdoContext->PnpStateLock);

            KeWaitForSingleObject(&fdoContext->PnpSafeEvent,
                                  Executive,
                                  KernelMode,
                                  FALSE,
                                  NULL);

            WdfWaitLockAcquire(fdoContext->PnpStateLock, NULL);
        }

        //
        // Allow only a single attach at any time.
        //
        if (fdoContext->PnpVspAttached == FALSE)
        {
            fdoContext->PnpVspAttached = TRUE;
            status = STATUS_SUCCESS;
        }
        else
        {
            status = STATUS_SHARING_VIOLATION;
        }
        WdfWaitLockRelease(fdoContext->PnpStateLock);

        break;

Требования

Требование Ценность
заголовка pcivirt.h
IRQL PASSIVE_LEVEL

См. также

WdfIoTargetSendInternalIoctlSynchronous

WdfIoTargetSendInternalIoctlOthersSynchronously

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

IOCTL_SRIOV_DETACH

WdfIoTargetSendIoctlSynchronously