IOCTL_SRIOV_ATTACH IOCTL (pcivirt.h)
Запрос указывает, что стек виртуализации хочет зарегистрировать события Plug and Play, полученные устройством SR-IOV.
Основной код
Блок состояния
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.
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