[ofw] [PATCH][RFC] winverbs/cq: CQ notification should be done in userspace
Sean Hefty
sean.hefty at intel.com
Thu May 1 20:13:55 PDT 2008
This changes CQ:Notify to call the userspace verbs provider for rearming
the CQ. The overlapped request is still passed to the kernel and signaled
directly when the CQ event is signaled.
A user may also request notification of CQ error events only without
rearming the CQ.
Signed-off-by: Sean Hefty <sean.hefty at intel.com>
---
This patch follows the previous patch, along with a patch to signal all
pending overlapped requests when an async event occurs.
Index: core/winverbs/kernel/wv_cq.c
===================================================================
--- core/winverbs/kernel/wv_cq.c (revision 1112)
+++ core/winverbs/kernel/wv_cq.c (working copy)
@@ -281,30 +281,23 @@
void WvCqNotify(WV_PROVIDER *pProvider, WDFREQUEST Request)
{
- WV_IO_ID *id;
+ UINT64 *id;
WV_COMPLETION_QUEUE *cq;
NTSTATUS status;
- ib_api_status_t ib_status;
- status = WdfRequestRetrieveInputBuffer(Request, sizeof(WV_IO_ID), &id, NULL);
+ status = WdfRequestRetrieveInputBuffer(Request, sizeof(UINT64), &id, NULL);
if (!NT_SUCCESS(status)) {
goto out;
}
- cq = WvCqAcquire(pProvider, id->Id);
+ cq = WvCqAcquire(pProvider, *id);
if (cq == NULL) {
status = STATUS_NOT_FOUND;
goto out;
}
WdfObjectAcquireLock(cq->Queue);
- ib_status = cq->pVerbs->enable_cq_notify(cq->hVerbsCq,
- id->Data ==
WV_IO_CQ_NOTIFY_SOLICITED);
- if (ib_status == IB_SUCCESS) {
- status = WdfRequestForwardToIoQueue(Request, cq->Queue);
- } else {
- status = STATUS_UNSUCCESSFUL;
- }
+ status = WdfRequestForwardToIoQueue(Request, cq->Queue);
WdfObjectReleaseLock(cq->Queue);
WvCqRelease(cq);
@@ -314,40 +307,6 @@
}
}
-void WvCqBatchNotify(WV_PROVIDER *pProvider, WDFREQUEST Request)
-{
- WV_IO_ID *id;
- WV_COMPLETION_QUEUE *cq;
- NTSTATUS status;
- ib_api_status_t ib_status;
-
- status = WdfRequestRetrieveInputBuffer(Request, sizeof(WV_IO_ID), &id, NULL);
- if (!NT_SUCCESS(status)) {
- goto out;
- }
-
- cq = WvCqAcquire(pProvider, id->Id);
- if (cq == NULL) {
- status = STATUS_NOT_FOUND;
- goto out;
- }
-
- WdfObjectAcquireLock(cq->Queue);
- ib_status = cq->pVerbs->enable_ncomp_cq_notify(cq->hVerbsCq, id->Data);
- if (ib_status == IB_SUCCESS) {
- status = WdfRequestForwardToIoQueue(Request, cq->Queue);
- } else {
- status = STATUS_UNSUCCESSFUL;
- }
- WdfObjectReleaseLock(cq->Queue);
- WvCqRelease(cq);
-
-out:
- if (!NT_SUCCESS(status)) {
- WdfRequestComplete(Request, status);
- }
-}
-
void WvCqCancel(WV_PROVIDER *pProvider, WDFREQUEST Request)
{
UINT64 *id;
Index: core/winverbs/kernel/wv_driver.c
===================================================================
--- core/winverbs/kernel/wv_driver.c (revision 1111)
+++ core/winverbs/kernel/wv_driver.c (working copy)
@@ -235,9 +235,6 @@
case WV_IOCTL_CQ_NOTIFY:
WvCqNotify(prov, Request);
break;
- case WV_IOCTL_CQ_BATCH_NOTIFY:
- WvCqBatchNotify(prov, Request);
- break;
case WV_IOCTL_CQ_CANCEL:
WvCqCancel(prov, Request);
break;
Index: core/winverbs/user/wv_cq.cpp
===================================================================
--- core/winverbs/user/wv_cq.cpp (revision 1007)
+++ core/winverbs/user/wv_cq.cpp (working copy)
@@ -222,14 +222,21 @@
STDMETHODIMP CWVCompletionQueue::
Notify(WV_CQ_NOTIFY_TYPE Type, OVERLAPPED* pOverlapped)
{
- WV_IO_ID id;
DWORD bytes;
HRESULT hr;
- id.Id = m_Id;
- id.Data = (UINT32) Type;
- if (DeviceIoControl(m_hFile, WV_IOCTL_CQ_NOTIFY, &id, sizeof id,
+ if (DeviceIoControl(m_hFile, WV_IOCTL_CQ_NOTIFY, &m_Id, sizeof m_Id,
NULL, 0, &bytes, pOverlapped)) {
+ switch (Type) {
+ case WvCqSolicited:
+ m_pVerbs->rearm_cq(m_hVerbsCq, 1);
+ break;
+ case WvCqNextCompletion:
+ m_pVerbs->rearm_cq(m_hVerbsCq, 0);
+ break;
+ default:
+ break;
+ }
hr = WV_SUCCESS;
} else {
hr = HRESULT_FROM_WIN32(GetLastError());
@@ -241,14 +248,12 @@
STDMETHODIMP CWVCompletionQueue::
BatchNotify(SIZE_T CompletedEntries, OVERLAPPED* pOverlapped)
{
- WV_IO_ID id;
DWORD bytes;
HRESULT hr;
- id.Id = m_Id;
- id.Data = (UINT32) CompletedEntries;
- if (DeviceIoControl(m_hFile, WV_IOCTL_CQ_BATCH_NOTIFY, &id, sizeof id,
+ if (DeviceIoControl(m_hFile, WV_IOCTL_CQ_NOTIFY, &m_Id, sizeof m_Id,
NULL, 0, &bytes, pOverlapped)) {
+ m_pVerbs->rearm_n_cq(m_hVerbsCq, (UINT32) CompletedEntries);
hr = WV_SUCCESS;
} else {
hr = HRESULT_FROM_WIN32(GetLastError());
Index: core/winverbs/wv_ioctl.h
===================================================================
--- core/winverbs/wv_ioctl.h (revision 1111)
+++ core/winverbs/wv_ioctl.h (working copy)
@@ -63,7 +63,6 @@
WV_IO_FUNCTION_CQ_DESTROY,
WV_IO_FUNCTION_CQ_RESIZE,
WV_IO_FUNCTION_CQ_NOTIFY,
- WV_IO_FUNCTION_CQ_BATCH_NOTIFY,
WV_IO_FUNCTION_CQ_CANCEL,
WV_IO_FUNCTION_SRQ_CREATE,
WV_IO_FUNCTION_SRQ_DESTROY,
@@ -183,14 +182,10 @@
#define WV_IOCTL_CQ_RESIZE WV_IOCTL(WV_IO_FUNCTION_BASE + \
WV_IO_FUNCTION_CQ_RESIZE)
-// WV_IO_ID / none
+// UINT64 Id / none
#define WV_IOCTL_CQ_NOTIFY WV_IOCTL(WV_IO_FUNCTION_BASE + \
WV_IO_FUNCTION_CQ_NOTIFY)
-// WV_IO_ID / none
-#define WV_IOCTL_CQ_BATCH_NOTIFY WV_IOCTL(WV_IO_FUNCTION_BASE + \
-
WV_IO_FUNCTION_CQ_BATCH_NOTIFY)
-
// UINT64 Id / none
#define WV_IOCTL_CQ_CANCEL WV_IOCTL(WV_IO_FUNCTION_BASE + \
WV_IO_FUNCTION_CQ_CANCEL)
@@ -493,9 +488,6 @@
} WV_IO_QP_CREATE;
-#define WV_IO_CQ_NOTIFY_SOLICITED 1
-#define WV_IO_CQ_NOTIFY_NEXT 2
-
#define WV_IO_QP_STATE_RESET 0
#define WV_IO_QP_STATE_INIT 1
#define WV_IO_QP_STATE_RTR 2
Index: inc/user/rdma/winverbs.h
===================================================================
--- inc/user/rdma/winverbs.h (revision 1111)
+++ inc/user/rdma/winverbs.h (working copy)
@@ -177,7 +177,8 @@
typedef enum _WV_CQ_NOTIFY_TYPE
{
- WvCqSolicited = 1,
+ WvCqError,
+ WvCqSolicited,
WvCqNextCompletion
} WV_CQ_NOTIFY_TYPE;
More information about the ofw
mailing list