IOCTL_SRIOV_ATTACH IOCTL (pcivirt.h)
A solicitação indica que a pilha de virtualização deseja se registrar para Plug and Play eventos recebidos pelo dispositivo SR-IOV.
Código principal
Bloco de status
Irp->IoStatus.Status será definido como STATUS_SUCCESS se a solicitação for bem-sucedida. Caso contrário, Status para a condição de erro apropriada como um código NTSTATUS .
Comentários
Essa solicitação IOCTL é enviada pela pilha de virtualização para o driver PF (PCI Express SR-IOV Physical Function) que expõe GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE.
Essa solicitação não será segura se o dispositivo PF estiver parado no momento ou parando para balancear novamente o recurso. Um dispositivo é considerado interrompido depois de receber IRP_MN_QUERY_STOP_DEVICE e reiniciado quando recebe IRP_MN_CANCEL_STOP_DEVICE ou quando IRP_MN_START_DEVICE é concluído pelos dispositivos inferiores na pilha. Nesse caso, o driver deve atrasar a conclusão dessa solicitação até que o dispositivo seja reiniciado.
Não é necessário manter esse IRP pendente porque a solicitação sempre é enviada como um IRP de modo kernel síncrono, fazendo com que o chamador bloqueie o thread em qualquer caso.
Após a conclusão dessa solicitação, o VSP poderá enviar solicitações de IOCTL_SRIOV_NOTIFICATION e IOCTL_SRIOV_EVENT_COMPLETE posteriormente.
Para cancelar o registro de eventos Plug and Play, o VSP envia a solicitação de IOCTL_SRIOV_DETACH.
Esses eventos (definidos em SRIOV_PF_EVENT) causam a conclusão de IOCTL_SRIOV_NOTIFICATION e uma espera por IOCTL_SRIOV_EVENT_COMPLETE:
- IRP_MN_QUERY_STOP_DEVICE gera SriovEventPfQueryStopDevice.
- IRP_MN_START_DEVICE gerará SriovEventPfRestart se e somente se o dispositivo tiver sido interrompido para rebalanceamento (veja acima).
- IRP_MN_CANCEL_STOP_DEVICE gerará SriovEventPfRestart se e somente se o dispositivo tiver sido interrompido para rebalanceamento.
- IRP_MN_QUERY_REMOVE_DEVICE gera SriovEventPfQueryRemoveDevice.
- IRP_MN_SURPRISE_REMOVAL gera 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;
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | pcivirt.h |
IRQL | PASSIVE_LEVEL |
Confira também
WdfIoTargetSendInternalIoctlSynchronously
WdfIoTargetSendInternalIoctlOthersSynchronously