Partager via


IOCTL_SRIOV_ATTACH IOCTL (pcivirt.h)

La demande indique que la pile de virtualisation souhaite s’inscrire aux événements Plug-and-Play reçus par l’appareil SR-IOV.

Code principal

IRP_MJ_DEVICE_CONTROL

Bloc d’état

Irp->IoStatus.Status est défini sur STATUS_SUCCESS si la demande réussit. Sinon, indiquez la condition d’erreur appropriée en tant que code NTSTATUS .

Remarques

Cette demande IOCTL est envoyée par la pile de virtualisation au pilote DE fonction physique (PF) PCI Express Express SR-IOV qui expose GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE.

Cette demande n’est pas sécurisée si l’appareil PF est actuellement arrêté ou arrêté pour rééquilibrage des ressources. Un appareil est considéré comme arrêté après avoir reçu IRP_MN_QUERY_STOP_DEVICE et redémarré lorsqu’il reçoit IRP_MN_CANCEL_STOP_DEVICE ou lorsqu’IRP_MN_START_DEVICE est terminé par les appareils inférieurs de la pile. Dans ce cas, le pilote doit retarder l’exécution de cette demande jusqu’à ce que l’appareil soit redémarré.

Il n’est pas nécessaire de garder cette IRP en attente, car la requête est toujours envoyée en tant qu’IRP synchrone en mode noyau, ce qui entraîne le blocage du thread par l’appelant.

Une fois cette demande terminée, le fournisseur de services virtuel peut ensuite envoyer IOCTL_SRIOV_NOTIFICATION et IOCTL_SRIOV_EVENT_COMPLETE requêtes.

Pour annuler l’inscription d’événements Plug-and-Play, le fournisseur de services virtuel envoie la requête IOCTL_SRIOV_DETACH.

Ces événements (définis dans SRIOV_PF_EVENT) entraînent l’achèvement de IOCTL_SRIOV_NOTIFICATION et une attente de IOCTL_SRIOV_EVENT_COMPLETE :

Dans cet exemple de gestion de la demande de IOCTL_SRIOV_ATTACH, le pilote PF conserve les états PnP dans son contexte d’appareil. DeviceContext->PnpRebalancing est défini sur TRUE, lorsque le pilote reçoit IRP_MN_QUERY_STOP_DEVICE et défini sur FALSE lorsqu’il reçoit 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;

Configuration requise

Condition requise Valeur
En-tête pcivirt.h
IRQL PASSIVE_LEVEL

Voir aussi

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendInternalIoctlOthersSynchronously

Création de requêtes IOCTL dans les pilotes

IOCTL_SRIOV_DETACH

WdfIoTargetSendIoctlSynchronously