[ofw] [PATCH] ipoib-CM 4 of 13
Smith, Stan
stan.smith at intel.com
Tue Jan 11 18:30:57 PST 2011
signed-off-by: stan smith <stan.smith at intel.com>
--- A/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h Tue Jan 11 17:54:42 2011
+++ B/ulp/ipoib_NDIS6_CM/kernel/ipoib_port.h Tue Jan 11 16:54:23 2011
@@ -72,6 +72,10 @@
#define IPOIB_RECV_FROM_NBL( P ) \
(((ipoib_recv_desc_t**)NET_BUFFER_LIST_MINIPORT_RESERVED(P))[0])
+//Used in CM RECV flow
+#define IPOIB_CM_RECV_FROM_NBL( P ) \
+ (((ipoib_cm_recv_desc_t**)NET_BUFFER_LIST_MINIPORT_RESERVED(P))[0])
+
//Used in CM SEND flow - to update
#define IPOIB_LIST_ITEM_FROM_NBL( P ) \
((cl_list_item_t*)NET_BUFFER_LIST_MINIPORT_RESERVED(P))
@@ -102,6 +106,7 @@
ib_qp_handle_t h_qp;
ib_query_handle_t h_query;
ib_srq_handle_t h_srq;
+ atomic32_t srq_qp_cnt;
net32_t qpn;
ib_mr_handle_t h_mr;
@@ -126,11 +131,20 @@
* Send CQ handle.
*
* h_qp
-* QP handle for data transfers.
+* QP handle for UD data transfers.
*
* h_query
* Query handle for cancelling SA queries.
*
+* h_srq
+* SRQ (Shared Receive Queue) handle
+*
+* srq_qp_cnt
+* number of QPs bound to the SRQ
+*
+* qpn
+* local QP number in net byte-order.
+*
* h_mr
* Registration handle for all of physical memory. Used for
* send/receive buffers to simplify growing the receive pool.
@@ -138,6 +152,9 @@
* lkey
* LKey for the memory region.
*
+* rate
+* port rate
+*
* bcast_rec
* Cached information about the broadcast group, used to specify
* parameters used to join other multicast groups.
@@ -337,8 +354,8 @@
*
* send_buf_list
* Lookaside list for dynamically allocating send buffers for send
-* that require copies (ARP, DHCP, and any with more physical pages
-* than can fit in the local data segments).
+* operations which require copies (ARP, DHCP, IP fragmentation and any with more
+* physical pages than can fit in the local data segments).
*********/
typedef enum _ipoib_pkt_type
@@ -350,31 +367,101 @@
} ipoib_pkt_type_t;
-typedef struct _ipoib_cm_desc
+
+typedef enum __ib_recv_mode
{
- cl_pool_item_t item; /* Must be first. */
- uint32_t len;
- ipoib_pkt_type_t type;
- ib_recv_wr_t wr;
- ib_local_ds_t local_ds[2];
- cl_list_item_t list_item;
- uint8_t* p_alloc_buf;
- uint8_t* p_buf;
- uint32_t alloc_buf_size;
- uint32_t buf_size;
- net32_t lkey;
- ib_mr_handle_t h_mr;
- NDIS_TCP_IP_CHECKSUM_PACKET_INFO ndis_csum;
+ RECV_UD = 1,
+ RECV_RC = 2
+
+} ib_recv_mode_t;
-} ipoib_cm_desc_t;
+
+
+typedef struct _ipoib_cm_recv_desc
+{
+ cl_pool_item_t item; /* Must be first. */
+ uint32_t len;
+ ipoib_pkt_type_t type;
+ ib_recv_mode_t recv_mode;/* matches ipoib_recv_desc_t to this offset */
+ ib_recv_wr_t wr;
+ ib_local_ds_t local_ds[MAX_CM_RECV_SGE]; /* 1 ds_local / phys page */
+ cl_list_item_t list_item;
+ ipoib_endpt_t* p_endpt;
+ uint8_t* p_alloc_buf;
+ uint8_t* p_buf;
+ uint32_t alloc_buf_size;
+ uint32_t buf_size;
+ NET_BUFFER_LIST* p_NBL;
+ MDL* p_mdl;
+ NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csum;
+
+} ipoib_cm_recv_desc_t;
+/*
+* FIELDS
+* item
+* Pool item for storing descriptors in a pool.
+*
+* len
+* Length to indicate to NDIS. This is different than the length of the
+* received data as some data is IPoIB specific and filtered out.
+*
+* type
+* Type of packet, used in filtering received packets against the packet
+* filter. Also used to update stats.
+*
+* recv_mode
+* IB connection mode RC(reliable connection) or UD(datagram)
+*
+* wr
+* Receive work request.
+*
+* local_ds
+* Local data segments. The second segment is only used if a buffer
+* spans physical pages.
+*
+* list_item
+* used when this recv desc is on the recv list (valid data)
+*
+* p_endpt
+* remote endpoint struct
+*
+* p_alloc_buf
+* allocated receive buffer start address; also start of Ethernet header.
+*
+* p_buf
+* Buffer for the CM receive as p_aloc_buf+OFFSET == p_buf, due to adding Enet
+* header in front of received ipoib CM data. ipoib_hdeader_t is overlayed
+* by the synthesized ethernet header prior to passing buffer to NDIS receive
+* routine.
+*
+* p_alloc_buf_size
+* actual byte size of allocated buffer.
+*
+* buf_size
+* byte size from p_buf to end of allocated buffer.
+*
+* p_NBL
+* allocated NBL (NetworkBufferList)
+*
+* p_MDL
+* allocated MDL (Memory Descriptor List) for p_buf - sizeof(eth_hdr)
+*
+* csum
+* hardware utilized checksum status block.
+*/
typedef struct _ipoib_recv_desc
{
cl_pool_item_t item; /* Must be first. */
uint32_t len;
ipoib_pkt_type_t type;
+ ib_recv_mode_t recv_mode; /* matches ipoib_cm_recv_desc_t to this offset */
ib_recv_wr_t wr;
ib_local_ds_t local_ds[2];
+#if UD_NBL_IN_DESC
+ NET_BUFFER_LIST *p_NBL;
+ MDL *p_mdl;
+#endif
NDIS_TCP_IP_CHECKSUM_PACKET_INFO ndis_csum;
#if IPOIB_INLINE_RECV
recv_buf_t buf;
@@ -396,6 +483,9 @@
* Type of packet, used in filtering received packets against the packet
* filter. Also used to update stats.
*
+* recv_mode
+* IB recv mode: RC(reliable connection) or UD(datagram)
+*
* wr
* Receive work request.
*
@@ -403,6 +493,9 @@
* Local data segments. The second segment is only used if a buffer
* spans physical pages.
*
+* ndis_csum
+* hardware utilized checksum status block.
+*
* buf
* Buffer for the receive.
*
@@ -418,42 +511,28 @@
ib_local_ds_t local_ds[MAX_SEND_SGE]; /* Must be last. */
} ipoib_send_wr_t;
-typedef enum __send_dir
-{
- SEND_UD_QP = 1,
- SEND_RC_QP = 2
-} send_dir_t;
typedef struct _ipoib_send_desc
{
PNET_BUFFER_LIST p_netbuf_list;
- ipoib_endpt_t *p_endpt;
ib_qp_handle_t send_qp;
- send_dir_t send_dir;
uint32_t num_wrs;
ipoib_send_wr_t send_wr[MAX_WRS_PER_MSG];
} ipoib_send_desc_t;
/*
* FIELDS
-* p_pkt
-* Pointer to the NDIS_PACKET associated with the send operation.
-*
-* p_endpt
-* Endpoint for this send.
+* p_netbuf_list
+* Pointer to the NET_BUFFER_LIST associated with the send operation.
*
-* p_buf
-* Buffer for the send, if allocated.
-*
-* wr
-* Send work request.
+* send_qp
+* QP on which to Send work request.
*
-* pkt_hdr
-* IPoIB packet header, pointed to by the first local datasegment.
+* num_wrs
+* count of work-requests (in send_wr) linked together.
*
-* local_ds
-* Local data segment array. Placed last to allow allocating beyond the
-* end of the descriptor for additional datasegments.
+* send_wr
+* Vector of IB work requests
*
* NOTES
* The pool item is always first to allow casting form a cl_pool_item_t or
@@ -478,7 +557,7 @@
*
* done_list
* List of receive descriptors (ipoib_desc_t) polled from the RX CQ which
-* are used to construct the recv_NBL_array, which is then used to indicated
+* are used to construct the recv_NBL_array; array is then used to indicate
* received packets to NDIS 6.
*********/
@@ -616,8 +695,7 @@
ipoib_send_desc_t * p_desc;
ipoib_endpt_mgr_t endpt_mgr;
- endpt_buf_mgr_t cm_buf_mgr;
- endpt_recv_mgr_t cm_recv_mgr;
+ cm_buf_mgr_t cm_buf_mgr;
ipoib_endpt_t *p_local_endpt;
ib_ca_attr_t *p_ca_attrs;
@@ -635,6 +713,7 @@
ib_net16_t base_lid;
LONG n_no_progress;
PIO_WORKITEM pPoWorkItem;
+ PIO_WORKITEM pPoWorkItemCM;
ipoib_hdr_t hdr[1]; /* Must be last! */
} ipoib_port_t;
@@ -653,10 +732,10 @@
* State of the port object. Tracks QP state fairly closely.
*
* recv_lock
-* Spinlock to protect receive operations.
+* Spinlock to protect UD receive operations.
*
* send_lock
-* Spinlock to protect send operations.
+* Spinlock to protect UD/RC send operations from NDIS callback.
*
* p_adapter
* Parent adapter. Used to get AL handle.
@@ -667,17 +746,73 @@
* max_sq_sge_supported
* The actual number of SGEs that will be used for UD QP
*
+* sa_event
+* Event signalled on SA query completion.
+*
+* mcast_cnt
+* count of mcast group members
+*
+* leave_mcast_event
+* event signalled upon leaving mcast group
+*
* ib_mgr
* IB resource manager.
*
-* recv_mgr
-* Receive manager.
+* ipoib_buf_mgr
+* send/recv buffer pools
*
* send_mgr
* Send manager.
*
+* recv_mgr
+* Recv manager.
+*
+* p_desc
+* send descriptor used by all send operations (serialization point).
+*
* endpt_mgr
-* Endpoint manager.
+* Endpoint manager
+*
+* cm_buf_mgr
+* Connected Mode SRQ recv buffer mgr.
+*
+* p_local_endpoint
+* our local endpoint description
+* p_ca_attrs
+* HCA attributes for this port
+*
+* ref
+* object reference count tracking
+* endpt_rdr
+* endpoint reader semaphore
+*
+* hdr_idx
+* ipoib header array hdr[] index.
+*
+* pkey_index
+*
+* gc_dpc
+* garbage collector DPC thread.
+*
+* gc_timer
+* timer which starts periodic running of gc thread.
+*
+* bc_join_retry
+* broadcast join_retry_cnt
+*
+* base_lid
+* port's base LID
+*
+* n_no_progress
+*
+* pPoWorkItem
+* DPC recv offload to worker thread
+*
+* pPoWorkItemCM
+* DPC recv offload to worker thread for Connected Mode
+*
+* hdr
+* ipoib header array - 1 entry per outstanding send: UD or RC; see hdr_idx.
*********/
typedef struct _sgl_context
{
@@ -702,11 +837,44 @@
PNET_BUFFER_LIST p_nbl;
PNET_BUFFER p_curr_nb;
ipoib_endpt_t *p_endpt;
+ ipoib_send_desc_t *p_send_desc;
send_buf_t *p_send_buf;
PSCATTER_GATHER_LIST p_sgl;
UINT tcp_payload;
PVOID p_sg_buf;
} ipoib_send_NB_SG;
+/*
+* FIELDS
+*
+* pool_item
+* for storing descriptors in the send_mgr.send_pool.
+*
+* p_port
+* HCA port which send is going out on.
+*
+* p_nbl
+* Net buffer list - data passed down from NDIS to xmit
+*
+* p_cur_nb
+* current list item in p_nbl list.
+*
+* p_endpt
+* sending (aka local) endpoint & link to sending HCA port.
+*
+* *p_desc
+* points to port->p_desc
+* p_desc->p_endpt == destination EP.
+*
+* p_sgl
+* pointer to a scatter-gather list
+*
+* tcp_payload
+* used in LSO processing
+*
+* p_sg_buf
+* scatter-gather buffer, used by p_sgl.
+*
+*********/
ib_api_status_t
ipoib_create_port(
@@ -730,14 +898,12 @@
ib_api_status_t
ipoib_port_join_mcast(
IN ipoib_port_t* const p_port,
- IN const mac_addr_t mac,
- IN const uint8_t state );
-
+ IN const mac_addr_t mac,
+ IN const uint8_t state );
void
ipoib_leave_mcast_cb(
- IN void *context );
-
+ IN void *context );
void
ipoib_port_remove_endpt(
@@ -823,19 +989,23 @@
ipoib_port_srq_destroy(
IN ipoib_port_t* const p_port );
-#if 0 //CM
+#if IPOIB_CM
+
ib_api_status_t
ipoib_port_listen(
IN ipoib_port_t* const p_port );
ib_api_status_t
ipoib_port_cancel_listen(
- IN ipoib_port_t* const p_port,
- IN ipoib_endpt_t* const p_endpt ) {
- UNUSED_PARAM(p_port);
- UNUSED_PARAM(p_endpt);
- return IB_SUCCESS;
-}
+ IN ipoib_endpt_t* const p_endpt );
+
+void
+ipoib_send_complete_net_buffer(
+ IN ipoib_send_NB_SG *s_buf,
+ IN NDIS_STATUS status,
+ IN ULONG compl_flags,
+ IN boolean_t bLock );
+
#endif
ib_api_status_t
@@ -846,20 +1016,6 @@
endpt_cm_buf_mgr_destroy(
IN ipoib_port_t* const p_port );
-void
-endpt_cm_buf_mgr_reset(
- IN ipoib_port_t* const p_port );
-
-void
-endpt_cm_buf_mgr_put_recv(
- IN endpt_buf_mgr_t * const p_buf_mgr,
- IN ipoib_cm_desc_t* const p_desc );
-
-void
-endpt_cm_buf_mgr_put_recv_list(
- IN endpt_buf_mgr_t * const p_buf_mgr,
- IN cl_qlist_t* const p_list );
-
uint32_t
endpt_cm_recv_mgr_build_pkt_array(
IN ipoib_port_t* const p_port,
@@ -867,24 +1023,39 @@
IN cl_qlist_t* const p_done_list,
IN OUT uint32_t* p_bytes_recv );
-ib_api_status_t
-endpt_cm_post_recv(
- IN ipoib_port_t* const p_port );
-/*void
-endpt_cm_destroy_conn(
+#if IPOIB_CM
+
+void
+ipoib_cm_buf_mgr_put_recv(
+ IN ipoib_port_t* const p_port,
+ IN ipoib_cm_recv_desc_t* const p_desc,
+ IN NET_BUFFER_LIST* const p_NBL OPTIONAL );
+
+ULONG ipoib_free_received_NBL(
+ IN ipoib_port_t *p_port,
+ IN NET_BUFFER_LIST *p_net_buffer_lists );
+
+BOOLEAN
+cm_destroy_conn(
IN ipoib_port_t* const p_port,
IN ipoib_endpt_t* const p_endpt );
-*/
+
void
endpt_cm_disconnect(
- IN ipoib_port_t* const p_port,
IN ipoib_endpt_t* const p_endpt );
+
void
-endpt_cm_flush_recv(
+endpt_cm_release_resources(
IN ipoib_port_t* const p_port,
IN ipoib_endpt_t* const p_endpt );
+char *
+get_ipoib_pkt_type_str(
+ IN ipoib_pkt_type_t t );
+
+#endif // IPOIB_CM
+
ib_api_status_t
ipoib_recv_dhcp(
IN ipoib_port_t* const p_port,
@@ -918,23 +1089,19 @@
}
-
-
-
// This function is only used to monitor send failures
extern ULONG g_NBL_complete;
extern ULONG g_NBL;
static inline VOID NdisMSendNetBufferListsCompleteX(
- IN ipoib_adapter_t* p_adapter,
- IN PNET_BUFFER_LIST NetBufferLists,
- IN ULONG SendCompleteFlags
- )
+ IN ipoib_adapter_t* p_adapter,
+ IN PNET_BUFFER_LIST NetBufferLists,
+ IN ULONG SendCompleteFlags )
{
++g_NBL_complete;
ipoib_cnt_inc( &p_adapter->n_send_NBL_done );
-#ifdef DBG
+#if DBG
ASSERT(NET_BUFFER_LIST_NEXT_NBL(NetBufferLists) == NULL);
if (NET_BUFFER_LIST_STATUS(NetBufferLists) != NDIS_STATUS_SUCCESS) {
@@ -943,10 +1110,17 @@
NET_BUFFER_LIST_STATUS(NetBufferLists)));
}
IPOIB_PRINT( TRACE_LEVEL_VERBOSE, IPOIB_DBG_SEND,
- ("Completing NBL=%x, g_NBL=%d, g_NBL_completed=%d \n", NetBufferLists, g_NBL, g_NBL_complete) );
+ ("Completing NBL=%x, g_NBL=%d, g_NBL_completed=%d \n",
+ NetBufferLists, g_NBL, g_NBL_complete) );
#endif
- NdisMSendNetBufferListsComplete(p_adapter->h_adapter,NetBufferLists,SendCompleteFlags);
+ NdisMSendNetBufferListsComplete( p_adapter->h_adapter,
+ NetBufferLists,
+ SendCompleteFlags );
}
+
+#if DBG
+char *get_ib_recv_mode_str(ib_recv_mode_t m);
+#endif
#endif /* _IPOIB_PORT_H_ */
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ipoib_port.h.patch
Type: application/octet-stream
Size: 14179 bytes
Desc: ipoib_port.h.patch
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20110111/dae5c8c3/attachment.obj>
More information about the ofw
mailing list