[ofw] [PATCH 8/12] nd2: add SRQ support for 32-bit library
Fab Tillier
ftillier at microsoft.com
Tue Jul 27 09:41:41 PDT 2010
Hefty, Sean wrote on Tue, 27 Jul 2010 at 00:57:52
>
>The SRQ receive code assumes that ND_SGE can map
>to a WV_SGE. This is only true for 64-bit platforms.
>A 32-bit library must convert ND_SGE to WV_SGE. The
>ND_SGE size varies based on the build; WV_SGE is a fixed
>size for all platforms.
>
>Signed-off-by: Sean Hefty <sean.hefty at intel.com>
>---
> trunk/ulp/netdirect2/user/nd_srq.cpp | 44 ++++++++++++++++++++++++++++++++++
> 1 files changed, 44 insertions(+), 0 deletions(-)
>
>diff --git a/trunk/ulp/netdirect2/user/nd_srq.cpp b/trunk/ulp/netdirect2/user/nd_srq.cpp
>index 7499617..0703aa9 100644
>--- a/trunk/ulp/netdirect2/user/nd_srq.cpp
>+++ b/trunk/ulp/netdirect2/user/nd_srq.cpp
>@@ -123,6 +123,16 @@ Notify(OVERLAPPED* pOverlapped)
> return NDConvertWVStatus(hr);
> }
>
>+#ifdef _WIN64
>+
>+C_ASSERT(sizeof(WV_SGE) == sizeof(ND_SGE));
>+C_ASSERT(FIELD_OFFSET(WV_SGE, pAddress) == FIELD_OFFSET(ND_SGE, Buffer));
>+C_ASSERT(RTL_FIELD_SIZE(WV_SGE, pAddress) == RTL_FIELD_SIZE(ND_SGE, Buffer));
>+C_ASSERT(FIELD_OFFSET(WV_SGE, Length) == FIELD_OFFSET(ND_SGE, BufferLength));
>+C_ASSERT(RTL_FIELD_SIZE(WV_SGE, Length) == RTL_FIELD_SIZE(ND_SGE, BufferLength));
>+C_ASSERT(FIELD_OFFSET(WV_SGE, Lkey) == FIELD_OFFSET(ND_SGE, MemoryRegionToken));
>+C_ASSERT(RTL_FIELD_SIZE(WV_SGE, Lkey) == RTL_FIELD_SIZE(ND_SGE, MemoryRegionToken));
>+
If you're going to copy-paste code that I contributed, please also copy-paste the copyright update at the top of the file.
> STDMETHODIMP CNDSharedReceiveQueue::
> Receive(VOID* requestContext, const ND_SGE* pSge, DWORD nSge)
> {
>@@ -131,3 +141,37 @@ Receive(VOID* requestContext, const ND_SGE* pSge, DWORD nSge)
> hr = m_pWvSrq->PostReceive((UINT64) (ULONG_PTR) requestContext, (WV_SGE *) pSge, nSge);
> return NDConvertWVStatus(hr);
> }
>+
>+#else
>+
>+STDMETHODIMP CNDSharedReceiveQueue::
>+Receive(VOID* requestContext, const ND_SGE* pSge, DWORD nSge)
>+{
>+ WV_SGE sge_array[4];
>+ WV_SGE *sge;
>+ DWORD i;
>+ HRESULT hr;
>+
>+ if (nSge > _countof(sge_array)) {
>+ sge = new WV_SGE[nSge];
>+ if (pShadowSge == NULL) {
pShadowSge doesn't exist in this context.
>+ return ND_NO_MEMORY;
>+ }
>+ } else {
>+ sge = sge_array;
>+ }
>+
>+ for (i = 0; i < nSge; i++) {
>+ sge->pAddress = pSge[i].Buffer;
>+ sge->Length = pSge[i].BufferLength;
>+ sge->Lkey = pSge[i].MemoryRegionToken;
>+ }
>+
>+ hr = m_pWvSrq->PostReceive((UINT64) (ULONG_PTR) requestContext, sge, nSge);
>+ if (nSge > _countof(sge_array)) {
>+ delete[] sge;
>+ }
>+ return NDConvertWVStatus(hr);
>+}
>+
>+#endif
>\ No newline at end of file
>
>
>_______________________________________________
>ofw mailing list
>ofw at lists.openfabrics.org
>http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
>
>
More information about the ofw
mailing list