Compartilhar via


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

IRP_MJ_DEVICE_CONTROL

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:

Neste exemplo de tratamento da solicitação de IOCTL_SRIOV_ATTACH, o driver PF mantém estados PnP em seu contexto de dispositivo. O PnpRebalancing deviceContext->é definido como TRUE, quando o driver recebe IRP_MN_QUERY_STOP_DEVICE e definido como FALSE quando recebe 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;

Requisitos

Requisito Valor
Cabeçalho pcivirt.h
IRQL PASSIVE_LEVEL

Confira também

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendInternalIoctlOthersSynchronously

Criando solicitações IOCTL em drivers

IOCTL_SRIOV_DETACH

WdfIoTargetSendIoctlSynchronously