IOCTL_SRIOV_ATTACH IOCTL (pcivirt.h)
请求指示虚拟化堆栈希望注册 SR-IOV 设备收到的即插即用事件。
主要代码
状态块
Irp->IoStatus.Status 设置为STATUS_SUCCESS(如果请求成功)。 否则,状态 相应的错误条件作为 NTSTATUS 代码。
言论
此 IOCTL 请求由虚拟化堆栈发送到公开GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE的 PCI Express SR-IOV 物理功能(PF)驱动程序。
如果 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 请求。
若要取消注册即插即用事件,VSP 会发送 IOCTL_SRIOV_DETACH 请求。
这些事件(在 SRIOV_PF_EVENT中定义)会导致完成 IOCTL_SRIOV_NOTIFICATION 并等待 IOCTL_SRIOV_EVENT_COMPLETE:
- IRP_MN_QUERY_STOP_DEVICE 生成 SriovEventPfQueryStopDevice。
- IRP_MN_START_DEVICE 生成 SriovEventPfRestart,前提是设备已停止 进行重新均衡(请参阅上图)。
- IRP_MN_CANCEL_STOP_DEVICE 生成 SriovEventPfRestart,前提是 设备停止重新均衡。
- IRP_MN_QUERY_REMOVE_DEVICE 生成 SriovEventPfQueryRemoveDevice。
- IRP_MN_SURPRISE_REMOVAL 生成 SriovEventPfSurpriseRemoveDevice。
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 |
另请参阅
WdfIoTargetSendInternalIoctlSynchronously