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;
要求
要求 | 值 |
---|---|
Header | pcivirt.h |
IRQL | PASSIVE_LEVEL |
另请参阅
WdfIoTargetSendInternalIoctlSynchronously