[ofw] RE: [IPoIB CM] fix for large IP packets fragmentation failure.
Alex Estrin
alex.estrin at qlogic.com
Fri Jan 23 15:13:10 PST 2009
Applied to ipoib_cm branch rev 1873.
With change made on top of previous patch -
Add verification if pool was initialized before call destroy.
Thanks,
Alex.
> -----Original Message-----
> From: Alex Estrin
> Sent: Friday, January 23, 2009 5:28 PM
> To: Alex Estrin; Alex Naslednikov; Tzachi Dar
> Cc: ofw at lists.openfabrics.org
> Subject: RE: [IPoIB CM] fix for large IP packets
> fragmentation failure.
>
> Updated patch with some changes:
> - pool can grow.
> - if we run out of descriptors anyway - queue send packets, hoping
> some descriptors will be returned to the pool next time.
>
> Thanks,
> Alex.
>
> >
> > Hello,
> >
> > This patch introduces usage of send descriptors from
> > preallocated pool and
> > fix large (> 30k) IP packets failure to fragment.
> > Please review.
> >
> > Thanks,
> > Alex.
> >
> > ---
>
> Index: kernel/ipoib_cm.c
> ===================================================================
> --- kernel/ipoib_cm.c (revision 1856)
> +++ kernel/ipoib_cm.c (working copy)
> @@ -796,6 +796,7 @@
> uint32_t total_length = 0;
> ipoib_endpt_t *p_endpt;
> send_buf_t *p_send_buf;
> + ipoib_send_desc_t *p_desc;
>
> size_t i;
> BOOLEAN send_failed = FALSE;
> @@ -831,7 +832,9 @@
> CL_ASSERT( p_packet );
>
> CL_ASSERT( IPOIB_PORT_FROM_PACKET( p_packet )
> == p_port );
> - p_send_buf = IPOIB_SEND_FROM_PACKET( p_packet );
> + p_desc = IPOIB_SEND_FROM_PACKET( p_packet );
> + p_send_buf = p_desc->p_buf;
> + ipoib_send_desc_mgr_put( p_port, p_desc );
>
> switch( p_wc->status )
> {
> Index: kernel/ipoib_driver.h
> ===================================================================
> --- kernel/ipoib_driver.h (revision 1856)
> +++ kernel/ipoib_driver.h (working copy)
> @@ -58,7 +58,7 @@
> #define MAX_UD_PAYLOAD_MTU (MAX_IB_MTU -
> sizeof(ipoib_hdr_t))
> #define DEFAULT_PAYLOAD_MTU (DEFAULT_MTU -
> sizeof(ipoib_hdr_t))
> #define MAX_CM_PAYLOAD_MTU (65520)
> -#define MAX_WRS_PER_MSG
> (MAX_CM_PAYLOAD_MTU/MAX_UD_PAYLOAD_MTU)
> +#define MAX_WRS_PER_MSG
> ((MAX_CM_PAYLOAD_MTU/DEFAULT_PAYLOAD_MTU)+1)
> /*
> * Only the protocol type is sent as part of the UD payload
> * since the rest of the Ethernet header is encapsulated in the
> Index: kernel/ipoib_log.mc
> ===================================================================
> --- kernel/ipoib_log.mc (revision 1856)
> +++ kernel/ipoib_log.mc (working copy)
> @@ -332,3 +332,10 @@
> %2: Connected Mode initialized and operational.
> .
>
> +MessageId=0x005E
> +Facility=IPoIB
> +Severity=Error
> +SymbolicName=EVENT_IPOIB_SEND_DESC_POOL
> +Language=English
> +%2: Failed to create send descriptors pool.
> +.
> Index: kernel/ipoib_port.c
> ===================================================================
> --- kernel/ipoib_port.c (revision 1856)
> +++ kernel/ipoib_port.c (working copy)
> @@ -380,6 +380,24 @@
> IN uint8_t* p_options,
> IN uint32_t options_len,
> IN BOOLEAN copy_all );
> +
> +/************************************************************
> *****************
> + Send Descriptors management
> +*************************************************************
> ****************/
> +static ib_api_status_t
> +__send_desc_mgr_init(
> + IN ipoib_port_t* const
> p_port );
> +
> +static void
> +__send_desc_mgr_destroy(
> + IN ipoib_port_t* const
> p_port );
> +
> +static cl_status_t
> +__send_desc_ctor(
> + IN void* const
> p_object,
> + IN void*
> context,
> + OUT cl_pool_item_t** const pp_pool_item );
> +
>
> /*************************************************************
> *****************
> *
> * Endpoint manager operations
> @@ -671,6 +689,16 @@
> ("cl_spinlock_init returned %#x\n",
> cl_status) );
> return IB_ERROR;
> }
> +
> + /* initialize send descriptors manager. */
> + status = __send_desc_mgr_init( p_port );
> + if( status != IB_SUCCESS )
> + {
> + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
> + ("__send_desc_mgr_init returned %s\n",
> + p_adapter->p_ifc->get_err_str( status )) );
> + return status;
> + }
>
> /* Initialize the IB resource manager. */
> status = __ib_mgr_init( p_port );
> @@ -801,7 +829,8 @@
> /* Wait for all sends and receives to get flushed. */
> while( p_port->send_mgr.depth || p_port->recv_mgr.depth )
> cl_thread_suspend( 0 );
> -
> +
> + __send_desc_mgr_destroy( p_port );
> /* Destroy the send and receive managers before closing
> the CA. */
> __ib_mgr_destroy( p_port );
>
> @@ -4151,7 +4180,8 @@
> if( p_port->p_adapter->params.cm_enabled )
> {
> IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,
> - (" ARP SEND to ENDPT[%p] State: %d flag: %#x,
> QPN: %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
> + (" ARP %s SEND to ENDPT[%p] State: %d flag:
> %#x, QPN: %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
> + ( p_ib_arp->op == ARP_OP_REP ? "REP": "REQ"),
> p_desc->p_endpt,
> endpt_cm_get_state( p_desc->p_endpt ),
> p_desc->p_endpt->cm_flag,
> @@ -4391,7 +4421,7 @@
> /* Store context in our reserved area of the packet. */
> IPOIB_PORT_FROM_PACKET( p_desc->p_pkt ) = p_port;
> IPOIB_ENDPT_FROM_PACKET( p_desc->p_pkt ) = p_desc->p_endpt;
> - IPOIB_SEND_FROM_PACKET( p_desc->p_pkt ) = p_desc->p_buf;
> + IPOIB_SEND_FROM_PACKET( p_desc->p_pkt ) = p_desc;
>
> IPOIB_EXIT( IPOIB_DBG_SEND );
> return NDIS_STATUS_SUCCESS;
> @@ -4495,7 +4525,7 @@
> ExFreeToNPagedLookasideList(
> &p_port->buf_mgr.send_buf_list, p_desc->p_buf );
> }
> -
> + ipoib_send_desc_mgr_put( p_port, p_desc );
> IPOIB_EXIT( IPOIB_DBG_SEND );
> }
>
> @@ -4508,7 +4538,7 @@
> {
> NDIS_STATUS status;
> ib_api_status_t ib_status;
> - ipoib_send_desc_t desc;
> + ipoib_send_desc_t *p_desc;
> uint32_t i;
> eth_hdr_t *p_eth_hdr;
> NDIS_BUFFER *p_buf;
> @@ -4548,12 +4578,25 @@
> cl_spinlock_acquire( &p_port->send_lock );
> for( i = 0; i < num_packets; i++ )
> {
> - desc.p_pkt = p_packet_array[i];
> - desc.p_endpt = NULL;
> - desc.p_buf = NULL;
> - desc.send_qp = NULL;
> - desc.num_wrs = 1;
> + p_desc = ipoib_send_desc_mgr_get( p_port );
> + if( !p_desc )
> + {
> + IPOIB_PRINT( TRACE_LEVEL_WARNING,
> IPOIB_DBG_SEND,
> + ("No available Send Descriptors.\n") );
> + while( i < num_packets )
> + {
> + cl_qlist_insert_tail(
> &p_port->send_mgr.pending_list,
> +
> IPOIB_LIST_ITEM_FROM_PACKET( p_packet_array[i++] ) );
> + }
> + break;
> + }
>
> + p_desc->p_pkt = p_packet_array[i];
> + p_desc->p_endpt = NULL;
> + p_desc->p_buf = NULL;
> + p_desc->send_qp = NULL;
> + p_desc->num_wrs = 1;
> +
> /* Get the ethernet header so we can find the
> endpoint. */
> cl_perf_start( GetEthHdr );
> status = __send_mgr_get_eth_hdr(
> @@ -4562,7 +4605,7 @@
> if( status != NDIS_STATUS_SUCCESS )
> {
> cl_perf_start( ProcessFailedSends );
> - __process_failed_send( p_port, &desc, status );
> + __process_failed_send( p_port, p_desc, status );
> cl_perf_stop( &p_port->p_adapter->perf,
> ProcessFailedSends );
> continue;
> }
> @@ -4614,10 +4657,11 @@
> p_eth_hdr->dst.addr[3] = ((unsigned
> char*)&p_ip_hdr->dst_ip)[1];
> }
> h_end:
> - status = __send_mgr_queue( p_port, p_eth_hdr,
> &desc.p_endpt );
> + status = __send_mgr_queue( p_port, p_eth_hdr,
> &p_desc->p_endpt );
> cl_perf_stop( &p_port->p_adapter->perf, SendMgrQueue );
> if( status == NDIS_STATUS_PENDING )
> {
> + ipoib_send_desc_mgr_put( p_port, p_desc );
> /* Queue all remaining packets. */
> cl_perf_start( QueuePacket );
> while( i < num_packets )
> @@ -4636,30 +4680,31 @@
> * sends to fail.
> */
> cl_perf_start( ProcessFailedSends );
> - __process_failed_send( p_port, &desc,
> NDIS_STATUS_SUCCESS );
> + __process_failed_send( p_port, p_desc,
> NDIS_STATUS_SUCCESS );
> cl_perf_stop( &p_port->p_adapter->perf,
> ProcessFailedSends );
> continue;
> }
>
> cl_perf_start( BuildSendDesc );
> - status = __build_send_desc( p_port, p_eth_hdr,
> p_buf, buf_len, &desc );
> + status = __build_send_desc( p_port, p_eth_hdr,
> p_buf, buf_len, p_desc );
> cl_perf_stop( &p_port->p_adapter->perf, BuildSendDesc );
> if( status != NDIS_STATUS_SUCCESS )
> {
> if( status == NDIS_STATUS_PENDING )
> {
> - ipoib_endpt_deref( desc.p_endpt );
> + ipoib_endpt_deref( p_desc->p_endpt );
> + ipoib_send_desc_mgr_put(
> p_port, p_desc );
> break;
> }
> cl_perf_start( ProcessFailedSends );
> - __process_failed_send( p_port, &desc, status );
> + __process_failed_send( p_port, p_desc, status );
> cl_perf_stop( &p_port->p_adapter->perf,
> ProcessFailedSends );
> continue;
> }
>
> /* Post the WR. */
> cl_perf_start( PostSend );
> - ib_status =
> p_port->p_adapter->p_ifc->post_send( desc.send_qp,
> &desc.send_wr[0].wr, &p_wr_failed );
> + ib_status =
> p_port->p_adapter->p_ifc->post_send( p_desc->send_qp,
> &p_desc->send_wr[0].wr, &p_wr_failed );
> cl_perf_stop( &p_port->p_adapter->perf, PostSend );
> if( ib_status != IB_SUCCESS )
> {
> @@ -4667,7 +4712,7 @@
> ("ib_post_send returned %s\n",
>
> p_port->p_adapter->p_ifc->get_err_str( ib_status )) );
> cl_perf_start( ProcessFailedSends );
> - __process_failed_send( p_port, &desc,
> NDIS_STATUS_FAILURE );
> + __process_failed_send( p_port, p_desc,
> NDIS_STATUS_FAILURE );
> cl_perf_stop( &p_port->p_adapter->perf,
> ProcessFailedSends );
> /* Flag the adapter as hung since
> posting is busted. */
> p_port->p_adapter->hung = TRUE;
> @@ -4689,7 +4734,7 @@
> NDIS_STATUS status;
> ib_api_status_t ib_status;
> cl_list_item_t *p_item;
> - ipoib_send_desc_t desc;
> + ipoib_send_desc_t *p_desc;
> eth_hdr_t *p_eth_hdr;
> NDIS_BUFFER *p_buf;
> UINT buf_len;
> @@ -4726,39 +4771,46 @@
> ("No available WQEs.\n") );
> break;
> }
> -
> - desc.p_pkt = IPOIB_PACKET_FROM_LIST_ITEM(
> + p_desc = ipoib_send_desc_mgr_get( p_port );
> + if( !p_desc )
> + {
> + IPOIB_PRINT( TRACE_LEVEL_WARNING,
> IPOIB_DBG_SEND,
> + ("No available Send Descriptors.\n") );
> + break;
> + }
> + p_desc->p_pkt = IPOIB_PACKET_FROM_LIST_ITEM(
> cl_qlist_remove_head(
> &p_port->send_mgr.pending_list ) );
> - desc.p_endpt = NULL;
> - desc.p_buf = NULL;
> - desc.send_qp = NULL;
> - desc.num_wrs = 1;
> + p_desc->p_endpt = NULL;
> + p_desc->p_buf = NULL;
> + p_desc->send_qp = NULL;
> + p_desc->num_wrs = 1;
>
> /* Get the ethernet header so we can find the
> endpoint. */
> status = __send_mgr_get_eth_hdr(
> - desc.p_pkt, &p_buf, &p_eth_hdr, &buf_len );
> + p_desc->p_pkt, &p_buf, &p_eth_hdr, &buf_len );
> if( status != NDIS_STATUS_SUCCESS )
> {
> cl_perf_start( ProcessFailedSends );
> - __process_failed_send( p_port, &desc, status );
> + __process_failed_send( p_port, p_desc, status );
> cl_perf_stop( &p_port->p_adapter->perf,
> ProcessFailedSends );
> continue;
> }
>
> cl_perf_start( GetEndpt );
> - status = __endpt_mgr_ref( p_port,
> p_eth_hdr->dst, &desc.p_endpt );
> + status = __endpt_mgr_ref( p_port,
> p_eth_hdr->dst, &p_desc->p_endpt );
> cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );
> if( status == NDIS_STATUS_PENDING )
> {
> - CL_ASSERT(desc.p_endpt == NULL);
> + CL_ASSERT( p_desc->p_endpt == NULL );
> cl_qlist_insert_head(
> &p_port->send_mgr.pending_list,
> - IPOIB_LIST_ITEM_FROM_PACKET(
> desc.p_pkt ) );
> + IPOIB_LIST_ITEM_FROM_PACKET(
> p_desc->p_pkt ) );
> + ipoib_send_desc_mgr_put( p_port, p_desc );
> break;
> }
> else if( status != NDIS_STATUS_SUCCESS )
> {
> ASSERT( status ==
> NDIS_STATUS_NO_ROUTE_TO_DESTINATION );
> - CL_ASSERT(desc.p_endpt == NULL);
> + CL_ASSERT( p_desc->p_endpt == NULL );
>
> if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )
> {
> @@ -4768,7 +4820,8 @@
> IPOIB_PRINT_EXIT(
> TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,
> ("Multicast Mac
> - trying to join.\n") );
> cl_qlist_insert_head(
> &p_port->send_mgr.pending_list,
> -
> IPOIB_LIST_ITEM_FROM_PACKET( desc.p_pkt ) );
> +
> IPOIB_LIST_ITEM_FROM_PACKET( p_desc->p_pkt ) );
> +
> ipoib_send_desc_mgr_put( p_port, p_desc );
> break;
> }
> }
> @@ -4778,31 +4831,32 @@
> * sends to fail.
> */
> cl_perf_start( ProcessFailedSends );
> - __process_failed_send( p_port, &desc,
> NDIS_STATUS_SUCCESS );
> + __process_failed_send( p_port, p_desc,
> NDIS_STATUS_SUCCESS );
> cl_perf_stop( &p_port->p_adapter->perf,
> ProcessFailedSends );
> continue;
> }
>
> cl_perf_start( BuildSendDesc );
> - status = __build_send_desc( p_port, p_eth_hdr,
> p_buf, buf_len, &desc );
> + status = __build_send_desc( p_port, p_eth_hdr,
> p_buf, buf_len, p_desc );
> cl_perf_stop( &p_port->p_adapter->perf, BuildSendDesc );
> if( status != NDIS_STATUS_SUCCESS )
> {
> if( status == NDIS_STATUS_PENDING )
> {
> /* ARP REPLY packet queued */
> - ipoib_endpt_deref( desc.p_endpt );
> + ipoib_endpt_deref( p_desc->p_endpt );
> + ipoib_send_desc_mgr_put(
> p_port, p_desc );
> break;
> }
> cl_perf_start( ProcessFailedSends );
> - __process_failed_send( p_port, &desc, status );
> + __process_failed_send( p_port, p_desc, status );
> cl_perf_stop( &p_port->p_adapter->perf,
> ProcessFailedSends );
> continue;
> }
>
> /* Post the WR. */
> cl_perf_start( PostSend );
> - ib_status =
> p_port->p_adapter->p_ifc->post_send( desc.send_qp,
> &desc.send_wr[0].wr, &p_wr_failed );
> + ib_status =
> p_port->p_adapter->p_ifc->post_send( p_desc->send_qp,
> &p_desc->send_wr[0].wr, &p_wr_failed );
> cl_perf_stop( &p_port->p_adapter->perf, PostSend );
> if( ib_status != IB_SUCCESS )
> {
> @@ -4810,7 +4864,7 @@
> ("ib_post_send returned %s\n",
>
> p_port->p_adapter->p_ifc->get_err_str( ib_status )) );
> cl_perf_start( ProcessFailedSends );
> - __process_failed_send( p_port, &desc,
> NDIS_STATUS_FAILURE );
> + __process_failed_send( p_port, p_desc,
> NDIS_STATUS_FAILURE );
> cl_perf_stop( &p_port->p_adapter->perf,
> ProcessFailedSends );
> /* Flag the adapter as hung since
> posting is busted. */
> p_port->p_adapter->hung = TRUE;
> @@ -4837,6 +4891,7 @@
> uint32_t length;
> ipoib_endpt_t *p_endpt;
> send_buf_t *p_send_buf = NULL;
> + ipoib_send_desc_t *p_desc;
> ip_stat_sel_t type;
> size_t i;
> PERF_DECLARE( SendCompBundle );
> @@ -4886,8 +4941,9 @@
> CL_ASSERT( p_packet );
> CL_ASSERT(
> IPOIB_PORT_FROM_PACKET( p_packet ) == p_port );
> p_endpt =
> IPOIB_ENDPT_FROM_PACKET( p_packet );
> - p_send_buf =
> IPOIB_SEND_FROM_PACKET( p_packet );
> -
> + p_desc =
> IPOIB_SEND_FROM_PACKET( p_packet );
> + p_send_buf = p_desc->p_buf;
> + ipoib_send_desc_mgr_put(
> p_port, p_desc );
> if( p_endpt->h_mcast )
> {
> if(
> p_endpt->dgid.multicast.raw_group_id[11] == 0xFF &&
> @@ -4921,7 +4977,9 @@
> if( p_packet )
> {
> p_endpt =
> IPOIB_ENDPT_FROM_PACKET( p_packet );
> - p_send_buf =
> IPOIB_SEND_FROM_PACKET( p_packet );
> + p_desc =
> IPOIB_SEND_FROM_PACKET( p_packet );
> + p_send_buf = p_desc->p_buf;
> +
> ipoib_send_desc_mgr_put( p_port, p_desc );
> ipoib_inc_send_stat(
> p_port->p_adapter, IP_STAT_DROPPED, 0 );
> NdisMSendCompleteX(
> p_port->p_adapter->h_adapter,
> p_packet,
> NDIS_STATUS_RESET_IN_PROGRESS );
> @@ -4938,7 +4996,9 @@
> if( p_packet )
> {
> p_endpt =
> IPOIB_ENDPT_FROM_PACKET( p_packet );
> - p_send_buf =
> IPOIB_SEND_FROM_PACKET( p_packet );
> + p_desc =
> IPOIB_SEND_FROM_PACKET( p_packet );
> + p_send_buf = p_desc->p_buf;
> +
> ipoib_send_desc_mgr_put( p_port, p_desc );
> ipoib_inc_send_stat(
> p_port->p_adapter, IP_STAT_ERROR, 0 );
> NdisMSendCompleteX(
> p_port->p_adapter->h_adapter,
> p_packet,
> NDIS_STATUS_FAILURE );
> @@ -7510,3 +7570,115 @@
> }
> return;
> }
> +
> +
> +/***************************************************
> + Send desriptors pool management
> +**************************************************/
> +
> +static ib_api_status_t
> +__send_desc_mgr_init(
> + IN ipoib_port_t* const p_port )
> +{
> + cl_status_t cl_status;
> +
> + IPOIB_ENTER( IPOIB_DBG_INIT );
> +
> + cl_qpool_construct( &p_port->send_mgr.desc_pool );
> + cl_spinlock_init( &p_port->send_mgr.desc_lock );
> +
> + /* Allocate send descriptors pool */
> + cl_status = cl_qpool_init( &p_port->send_mgr.desc_pool,
> + p_port->p_adapter->params.sq_depth,
> + 0,
> + 10,
> + sizeof( ipoib_send_desc_t ),
> + __send_desc_ctor,
> + NULL,
> + p_port );
> +
> + if( cl_status != CL_SUCCESS )
> + {
> + NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,
> + EVENT_IPOIB_SEND_DESC_POOL, 1, cl_status );
> +
> + IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,
> + ("cl_qpool_init for send descriptors
> pool returned %#x\n", cl_status) );
> +
> + return IB_INSUFFICIENT_MEMORY;
> + }
> +
> + IPOIB_EXIT( IPOIB_DBG_INIT );
> + return IB_SUCCESS;
> +}
> +
> +static void
> +__send_desc_mgr_destroy(
> + IN ipoib_port_t* const p_port )
> +{
> +
> + IPOIB_ENTER(IPOIB_DBG_INIT );
> +
> + CL_ASSERT( p_port );
> + cl_spinlock_destroy( &p_port->send_mgr.desc_lock );
> + cl_qpool_destroy( &p_port->send_mgr.desc_pool );
> +
> + IPOIB_EXIT( IPOIB_DBG_INIT );
> +}
> +
> +static cl_status_t
> +__send_desc_ctor(
> + IN void* const
> p_object,
> + IN void*
> context,
> + OUT cl_pool_item_t** const
> pp_pool_item )
> +{
> + ipoib_send_desc_t* p_desc;
> + ipoib_port_t* p_port;
> +
> + CL_ASSERT( p_object );
> + CL_ASSERT( context );
> +
> + p_desc = (ipoib_send_desc_t*)p_object;
> + p_port = (ipoib_port_t*)context;
> + p_desc->p_endpt = NULL;
> + p_desc->p_buf = NULL;
> + p_desc->send_qp = NULL;
> + p_desc->num_wrs = 1;
> +
> + *pp_pool_item = &p_desc->pool_item;
> + return CL_SUCCESS;
> +}
> +
> +inline ipoib_send_desc_t*
> +ipoib_send_desc_mgr_get(
> + IN ipoib_port_t* const p_port )
> +{
> + ipoib_send_desc_t *p_desc;
> + cl_spinlock_acquire( &p_port->send_mgr.desc_lock );
> + p_desc = (ipoib_send_desc_t*)cl_qpool_get(
> &p_port->send_mgr.desc_pool );
> + cl_spinlock_release( &p_port->send_mgr.desc_lock );
> +
> + return p_desc;
> +}
> +
> +void
> +ipoib_send_desc_mgr_put(
> + IN ipoib_port_t* const p_port,
> + IN ipoib_send_desc_t* const p_desc )
> +{
> + /* Return the descriptor to it's pool. */
> + cl_spinlock_acquire( &p_port->send_mgr.desc_lock );
> + cl_qpool_put( &p_port->send_mgr.desc_pool, &p_desc->pool_item );
> + cl_spinlock_release( &p_port->send_mgr.desc_lock );
> +
> +}
> +
> +void
> +ipoib_send_desc_mgr_put_list(
> + IN ipoib_port_t* const p_port,
> + IN cl_qlist_t* const p_list )
> +{
> + cl_spinlock_acquire( &p_port->send_mgr.desc_lock );
> + cl_qpool_put_list( &p_port->send_mgr.desc_pool, p_list );
> + cl_spinlock_release( &p_port->send_mgr.desc_lock );
> +}
More information about the ofw
mailing list