NDKPI-Schema für verzögerte Verarbeitung
Es gibt viele Fälle, in denen ein NDK-Consumer eine Kette von Initiatoranforderungen an das Warteschlangenpaar (Queue Pair, QP) sendet. Ein Consumer könnte beispielsweise eine Reihe von Schnellregistrierungsanforderungen auf eine Sendeanforderung stellen. Die Leistung für solche Anforderungsmuster kann verbessert werden, wenn die Anforderungskette im QP in die Warteschlange gestellt und dann für die Hardware als Batch angegeben wird, anstatt jede Anforderung in der Kette einzeln an die Hardware anzugeben.
Der NDK_OP_FLAG_DEFER-Flagwert kann für diesen Zweck mit den folgenden Anforderungstypen verwendet werden:
- NdkBind (NDK_FN_BIND)
- NdkFastRegister (NDK_FN_FAST_REGISTER)
- NdkInvalidate (NDK_FN_INVALIDATE)
- NdkRead (NDK_FN_READ)
- NdkSend (NDK_FN_SEND)
- NdkSendAndInvalidate (NDK_FN_SEND_AND_INVALIDATE)
- NdkWrite (NDK_FN_WRITE)
Das Vorhandensein des Flags ist ein Hinweis für den NDK-Anbieter, dass es möglicherweise die Anforderung an Hardware für die Verarbeitung zurückstellen kann, aber der Anbieter kann die neue Anforderung jederzeit verarbeiten.
Das Vorhandensein des NDK_OP_FLAG_DEFER-Flags in einer Initiatoranforderung ändert nicht die bestehenden Verantwortlichkeiten des NDK-Anbieters in Bezug auf das Generieren von Vervollständigungen. Ein Aufruf der Initiatoranforderung, der einen Fehler status zurückgibt, darf nicht dazu führen, dass eine Vervollständigung für die fehlerhafte Anforderung an den CQ in die Warteschlange gestellt wird. Umgekehrt muss ein Aufruf, der einen erfolgreichen status zurückgibt, letztendlich dazu führen, dass eine Vervollständigung in die CQ-Warteschlange eingereiht wird, solange der Consumer die unten aufgeführten zusätzlichen Anforderungen erfüllt.
Zusätzlich zu allen bestehenden NDK-Anforderungen müssen zwei zusätzliche Anforderungen (eine für den Anbieter und eine für den Consumer) beachtet werden, um eine Situation zu verhindern, in der Anforderungen erfolgreich mit dem NDK_OP_FLAG_DEFER-Flag an den QP gesendet werden, aber nie für die Hardware zur Verarbeitung angegeben werden:
- Beim Zurückgeben eines Fehlers status von einem Aufruf an eine Initiatoranforderung muss der Anbieter sicherstellen, dass alle Anforderungen, die zuvor mit dem NDK_OP_FLAG_DEFER-Flag übermittelt wurden, für die Verarbeitung an die Hardware angezeigt werden.
- Der Consumer garantiert, dass in Ermangelung eines Inlinefehlers alle Initiatoranforderungsketten durch eine Initiatoranforderung beendet werden, die das NDK_OP_FLAG_DEFER-Flag nicht setzt.
Betrachten Sie beispielsweise einen Fall, in dem ein Consumer über eine Kette von zwei Schnellregistrierungsanforderungen und einen Sendevorgang verfügt, den er an den QP senden muss:
- Der Consumer postet die erste schnelle Registrierung mit dem flag NDK_OP_FLAG_DEFER und NdkFastRegister gibt STATUS_SUCCESS zurück.
- Auch das zweite schnelle Register wird mit dem NDK_OP_FLAG_DEFER-Flag veröffentlicht, aber jetzt gibt NdkFastRegister einen Fehler status zurück. In diesem Fall wird der Verbraucher die Sendeanforderung nicht posten.
- Beim Zurückgeben des Inlinefehlers für den zweiten Aufruf von NdkFastRegister stellt der NDK-Anbieter sicher, dass alle zuvor nicht angegebenen Anforderungen (in diesem Fall die erste schnelle Registrierung) für die Hardware zur Verarbeitung angegeben werden.
- Da der erste Aufruf von NdkFastRegister erfolgreich war, muss eine Vervollständigung für das CQ generiert werden.
- Da beim zweiten Aufruf von NdkFastRegister inline ein Fehler aufgetreten ist, darf keine Vervollständigung für das CQ generiert werden.