[ofw] [PATCH] winverbs: fixes to support OFED compatibility libraries and ND

Sean Hefty sean.hefty at intel.com
Fri Apr 17 11:30:52 PDT 2009


Winverbs fixes based on testing the DAPL openib_scm provider, which uses the
libibverbs compatibility library.

Simplify endpoint connect locking and code structure so it's clear when the
user's request is completed.

Add const to TranslateAddress to avoid a compiler warning when building the
ND provider.

Renumber CQ notification types to align with underlying code.

Take the RemoteAddress in a send work request in host order, to align with
the UVP.  (This will be revisited, but is required for RDMA over winverbs to
work for now.)

Signed-off-by: Sean Hefty <sean.hefty at intel.com>
---
diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\core\winverbs/kernel/wv_ep.c
branches\winverbs\core\winverbs/kernel/wv_ep.c
--- trunk\core\winverbs/kernel/wv_ep.c	2009-03-10 14:59:38.662275100 -0700
+++ branches\winverbs\core\winverbs/kernel/wv_ep.c	2009-04-01 15:51:01.289540300 -0700
@@ -501,25 +501,26 @@ void WvEpConnect(WV_PROVIDER *pProvider,
 	WdfObjectAcquireLock(ep->Queue);
 	if (ep->State != WvEpRouteResolved) {
 		status = STATUS_NOT_SUPPORTED;
-		goto release;
+		goto unlock;
 	}
 
 	status = IbCmInterface.CM.create_id(WvEpIbCmHandler, ep, &ep->pIbCmId);
 	if (!NT_SUCCESS(status)) {
-		goto release;
+		goto unlock;
 	}
 
 	ep->State = WvEpActiveConnect;
-	status = WdfRequestForwardToIoQueue(Request, ep->Queue);
+	status = IbCmInterface.CM.send_req(ep->pIbCmId, &req);
 	if (NT_SUCCESS(status)) {
-		status = IbCmInterface.CM.send_req(ep->pIbCmId, &req);
+		status = WdfRequestForwardToIoQueue(Request, ep->Queue);
 	}
 
 	if (!NT_SUCCESS(status)) {
 		ep->State = WvEpDisconnected;
 	}
-release:
+unlock:
 	WdfObjectReleaseLock(ep->Queue);
+release:
 	WvEpRelease(ep);
 complete:
 	if (!NT_SUCCESS(status)) {
@@ -618,9 +619,7 @@ static NTSTATUS WvEpAcceptActive(WDFREQU
 	pEndpoint->State = WvEpConnected;
 	status = IbCmInterface.CM.send_rtu(pEndpoint->pIbCmId, pAttr->Param.Data,
 									   pAttr->Param.DataLength);
-	if (NT_SUCCESS(status)) {
-		WdfRequestComplete(Request, STATUS_SUCCESS);
-	} else {
+	if (!NT_SUCCESS(status)) {
 		pEndpoint->State = WvEpDisconnected;
 	}
 
@@ -722,6 +721,10 @@ void WvEpAccept(WV_PROVIDER *pProvider, 
 		break;
 	case WvEpPassiveConnect:
 		status = WvEpAcceptPassive(Request, out, outlen, ep, pattr);
+		if (NT_SUCCESS(status)) {
+			WvEpRelease(ep);
+			return;
+		}
 		break;
 	default:
 		status = STATUS_NOT_SUPPORTED;
@@ -730,9 +733,7 @@ void WvEpAccept(WV_PROVIDER *pProvider, 
 
 	WvEpRelease(ep);
 complete:
-	if (!NT_SUCCESS(status)) {
-		WdfRequestComplete(Request, status);
-	}
+	WdfRequestComplete(Request, status);
 }
 
 void WvEpReject(WV_PROVIDER *pProvider, WDFREQUEST Request)
@@ -831,6 +832,11 @@ void WvEpDisconnectNotify(WV_PROVIDER *p
 	case WvEpConnected:
 	case WvEpActiveDisconnect:
 		status = WdfRequestForwardToIoQueue(Request, ep->Queue);
+		if (NT_SUCCESS(status)) {
+			WdfObjectReleaseLock(ep->Queue);
+			WvEpRelease(ep);
+			return;
+		}
 		break;
 	case WvEpPassiveDisconnect:
 	case WvEpDisconnected:
@@ -844,9 +850,7 @@ void WvEpDisconnectNotify(WV_PROVIDER *p
 
 	WvEpRelease(ep);
 complete:
-	if (!NT_SUCCESS(status)) {
-		WdfRequestComplete(Request, status);
-	}
+	WdfRequestComplete(Request, status);
 }
 
 static NTSTATUS WvEpIbListenHandler(iba_cm_id *pId, iba_cm_event *pEvent)
@@ -864,6 +868,7 @@ static NTSTATUS WvEpIbListenHandler(iba_
 		goto release;
 	}
 
+	ASSERT(!IsListEmpty(&listen->Entry));
 	ep = CONTAINING_RECORD(RemoveHeadList(&listen->Entry), WV_ENDPOINT, Entry);
 	ep->pIbCmId = pId;
 	pId->callback = WvEpIbCmHandler;
diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\core\winverbs/user/wv_provider.cpp
branches\winverbs\core\winverbs/user/wv_provider.cpp
--- trunk\core\winverbs/user/wv_provider.cpp	2008-12-01 13:05:16.214438800 -0800
+++ branches\winverbs\core\winverbs/user/wv_provider.cpp	2009-03-26 23:56:20.950000000 -0700
@@ -134,7 +134,7 @@ out:
 }
 
 STDMETHODIMP CWVProvider::
-TranslateAddress(SOCKADDR* pAddress, WV_DEVICE_ADDRESS* pDeviceAddress)
+TranslateAddress(const SOCKADDR* pAddress, WV_DEVICE_ADDRESS* pDeviceAddress)
 {
 	HANDLE hIbat;
 	IOCTL_IBAT_IP_TO_PORT_IN addr;
diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\core\winverbs/user/wv_provider.h
branches\winverbs\core\winverbs/user/wv_provider.h
--- trunk\core\winverbs/user/wv_provider.h	2008-12-01 13:04:01.212232800 -0800
+++ branches\winverbs\core\winverbs/user/wv_provider.h	2009-03-26 23:56:20.309375000 -0700
@@ -49,7 +49,7 @@ public:
 	STDMETHODIMP_(HANDLE) GetFileHandle();
 	STDMETHODIMP QueryDeviceList(NET64* pGuidList, SIZE_T* pBufferSize);
 	STDMETHODIMP QueryDevice(NET64 Guid, WV_DEVICE_ATTRIBUTES* pAttributes);
-	STDMETHODIMP TranslateAddress(SOCKADDR* pAddress,
+	STDMETHODIMP TranslateAddress(const SOCKADDR* pAddress,
 								  WV_DEVICE_ADDRESS* pDeviceAddress);
 
 	STDMETHODIMP OpenDevice(NET64 Guid, IWVDevice** ppDevice);
diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\core\winverbs/wv_ioctl.h
branches\winverbs\core\winverbs/wv_ioctl.h
--- trunk\core\winverbs/wv_ioctl.h	2009-01-07 14:32:56.497700600 -0800
+++ branches\winverbs\core\winverbs/wv_ioctl.h	2009-03-27 03:04:48.793750000 -0700
@@ -502,8 +502,8 @@ typedef struct _WV_IO_AH_CREATE
 }	WV_IO_AH_CREATE;
 
 #define WV_CQ_ERROR				0
-#define	WV_CQ_SOLICITED			1
-#define	WV_CQ_NEXT_COMPLETION	2
+#define	WV_CQ_NEXT_COMPLETION	1
+#define	WV_CQ_SOLICITED			2
 
 typedef struct _WV_IO_SRQ_ATTRIBUTES
 {
Only in branches\winverbs\inc\kernel\rdma: _ntstatus_.h
diff -up -r -X \mshefty\scm\winof\trunk\docs\dontdiff.txt -I '\$Id:' trunk\inc\user\rdma/winverbs.h
branches\winverbs\inc\user\rdma/winverbs.h
--- trunk\inc\user\rdma/winverbs.h	2009-02-11 20:04:22.551035000 -0800
+++ branches\winverbs\inc\user\rdma/winverbs.h	2009-03-27 03:05:27.028125000 -0700
@@ -176,8 +176,8 @@ typedef struct _WV_DEVICE_ADDRESS
 typedef enum _WV_CQ_NOTIFY_TYPE
 {
 	WvCqError,
-	WvCqSolicited,
-	WvCqNextCompletion
+	WvCqNextCompletion,
+	WvCqSolicited
 
 }	WV_CQ_NOTIFY_TYPE;
 
@@ -291,14 +291,14 @@ typedef struct _WV_SEND_REQUEST
 	{
 		struct
 		{
-			NET64			RemoteAddress;
+			UINT64			RemoteAddress;
 			NET32			Rkey;
 
 		}	Rdma;
 
 		struct
 		{
-			NET64			RemoteAddress;
+			UINT64			RemoteAddress;
 			NET32			Rkey;
 			NET64			Compare;
 			NET64			Exchange;
@@ -307,7 +307,7 @@ typedef struct _WV_SEND_REQUEST
 
 		struct
 		{
-			NET64			RemoteAddress;
+			UINT64			RemoteAddress;
 			NET32			Rkey;
 			NET64			Add;
 			UINT64			Reserved;
@@ -1487,7 +1487,7 @@ DECLARE_INTERFACE_(IWVProvider, IUnknown
 
 	STDMETHOD(TranslateAddress)(
 		THIS_
-		__in SOCKADDR* pAddress,
+		__in const SOCKADDR* pAddress,
 		__out WV_DEVICE_ADDRESS* pDeviceAddress
 		) PURE;





More information about the ofw mailing list