Committed in revision 2502. On Thu, 26 May 2005, Tom Duffy wrote:
tduffy> Signed-off-by: Tom Duffy <[EMAIL PROTECTED]> tduffy> tduffy> diff -Nurp -X /home/tduffy/dontdiff linux-kernel-rsp/dat-provider/dapl_psp.c linux-kernel-psp/dat-provider/dapl_psp.c tduffy> --- linux-kernel-rsp/dat-provider/dapl_psp.c 1969-12-31 16:00:00.000000000 -0800 tduffy> +++ linux-kernel-psp/dat-provider/dapl_psp.c 2005-05-25 15:11:42.274000000 -0700 tduffy> @@ -0,0 +1,446 @@ tduffy> +/* tduffy> + * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. tduffy> + * tduffy> + * This Software is licensed under one of the following licenses: tduffy> + * tduffy> + * 1) under the terms of the "Common Public License 1.0" a copy of which is tduffy> + * available from the Open Source Initiative, see tduffy> + * http://www.opensource.org/licenses/cpl.php. tduffy> + * tduffy> + * 2) under the terms of the "The BSD License" a copy of which is tduffy> + * available from the Open Source Initiative, see tduffy> + * http://www.opensource.org/licenses/bsd-license.php. tduffy> + * tduffy> + * 3) under the terms of the "GNU General Public License (GPL) Version 2" a tduffy> + * copy of which is available from the Open Source Initiative, see tduffy> + * http://www.opensource.org/licenses/gpl-license.php. tduffy> + * tduffy> + * Licensee has the right to choose one of the above licenses. tduffy> + * tduffy> + * Redistributions of source code must retain the above copyright tduffy> + * notice and one of the license notices. tduffy> + * tduffy> + * Redistributions in binary form must reproduce both the above copyright tduffy> + * notice, one of the license notices in the documentation tduffy> + * and/or other materials provided with the distribution. tduffy> + */ tduffy> + tduffy> +/* tduffy> + * $Id: dapl_psp_create_any.c 2462 2005-05-24 02:28:24Z jlentini $ tduffy> + */ tduffy> + tduffy> +#include "dapl.h" tduffy> +#include "dapl_sp_util.h" tduffy> +#include "dapl_ia_util.h" tduffy> +#include "dapl_openib_util.h" tduffy> + tduffy> +/* tduffy> + * dapl_psp_create_any tduffy> + * tduffy> + * Create a persistent Public Service Point that can recieve multiple tduffy> + * requests for connections and generate multiple connection request tduffy> + * instances that wil be delivered to the specified Event Dispatcher tduffy> + * in a notification event. Differs from dapl_psp_create() in that tduffy> + * the conn_qual is selected by the implementation and returned to tduffy> + * the user. tduffy> + * tduffy> + * Input: tduffy> + * ia_handle tduffy> + * evd_handle tduffy> + * psp_flags tduffy> + * tduffy> + * Output: tduffy> + * conn_qual tduffy> + * psp_handle tduffy> + * tduffy> + * Returns: tduffy> + * DAT_SUCCESS tduffy> + * DAT_INSUFFICIENT_RESOURCES tduffy> + * DAT_INVALID_HANDLE tduffy> + * DAT_INVALID_PARAMETER tduffy> + * DAT_CONN_QUAL_IN_USE tduffy> + * DAT_MODEL_NOT_SUPPORTED tduffy> + */ tduffy> +u32 dapl_psp_create_any(DAT_IA_HANDLE ia_handle, DAT_CONN_QUAL *conn_qual, tduffy> + DAT_EVD_HANDLE evd_handle, enum dat_psp_flags psp_flags, tduffy> + DAT_PSP_HANDLE *psp_handle) tduffy> +{ tduffy> + static DAT_CONN_QUAL hint_conn_qual = 1000; /* seed value */ tduffy> + struct dapl_ia *ia_ptr; tduffy> + struct dapl_sp *sp_ptr; tduffy> + struct dapl_evd *evd_ptr; tduffy> + u32 status = DAT_SUCCESS; tduffy> + int i; tduffy> + tduffy> + ia_ptr = (struct dapl_ia *)ia_handle; tduffy> + tduffy> + if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { tduffy> + status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); tduffy> + goto bail; tduffy> + } tduffy> + if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { tduffy> + status = tduffy> + DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CR); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + if (psp_handle == NULL) { tduffy> + status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG5); tduffy> + goto bail; tduffy> + } tduffy> + if (conn_qual == NULL) { tduffy> + status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + evd_ptr = (struct dapl_evd *)evd_handle; tduffy> + if (!(evd_ptr->evd_flags & DAT_EVD_CR_FLAG)) { tduffy> + status = DAT_ERROR(DAT_INVALID_HANDLE, tduffy> + DAT_INVALID_HANDLE_EVD_CR); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + if (psp_flags != DAT_PSP_CONSUMER_FLAG && tduffy> + psp_flags != DAT_PSP_PROVIDER_FLAG) { tduffy> + status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + /* Allocate PSP */ tduffy> + sp_ptr = dapl_sp_alloc(ia_ptr, TRUE); tduffy> + if (sp_ptr == NULL) { tduffy> + status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, tduffy> + DAT_RESOURCE_MEMORY); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + /* tduffy> + * Fill out the args for a PSP tduffy> + */ tduffy> + sp_ptr->ia_handle = ia_handle; tduffy> + sp_ptr->evd_handle = evd_handle; tduffy> + sp_ptr->psp_flags = psp_flags; tduffy> + sp_ptr->ep_handle = NULL; tduffy> + tduffy> + /* tduffy> + * Take a reference on the EVD handle tduffy> + */ tduffy> + atomic_inc(&evd_ptr->evd_ref_count); tduffy> + tduffy> + /* Link it onto the IA */ tduffy> + dapl_ia_link_psp(ia_ptr, sp_ptr); tduffy> + tduffy> + /* tduffy> + * Set up a listener for a connection. Connections can arrive tduffy> + * even before this call returns! tduffy> + */ tduffy> + sp_ptr->state = DAPL_SP_STATE_PSP_LISTENING; tduffy> + sp_ptr->listening = TRUE; tduffy> + tduffy> + /* tduffy> + * If we have a big number of tries and we still haven't tduffy> + * found a service_ID we can use, bail out with an error, tduffy> + * something is wrong! tduffy> + */ tduffy> + for (i = 0, sp_ptr->conn_qual = hint_conn_qual; i < 100000; i++) { tduffy> + status = dapl_ib_setup_conn_listener(ia_ptr, sp_ptr); tduffy> + if (DAT_SUCCESS == status) tduffy> + break; tduffy> + else tduffy> + sp_ptr->conn_qual++; tduffy> + } tduffy> + hint_conn_qual = sp_ptr->conn_qual + 1; tduffy> + tduffy> + if (status != DAT_SUCCESS) { tduffy> + atomic_dec(&evd_ptr->evd_ref_count); tduffy> + sp_ptr->evd_handle = NULL; tduffy> + dapl_ia_unlink_sp(ia_ptr, sp_ptr); tduffy> + dapl_sp_dealloc(sp_ptr); tduffy> + tduffy> + dapl_dbg_log(DAPL_DBG_TYPE_ERR, tduffy> + "dapl_psp_create cannot set up conn listener: %x\n", tduffy> + status); tduffy> + tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + /* tduffy> + * Return handle to the user tduffy> + */ tduffy> + *conn_qual = sp_ptr->conn_qual; tduffy> + *psp_handle = (DAT_PSP_HANDLE) sp_ptr; tduffy> + tduffy> +bail: tduffy> + return status; tduffy> +} tduffy> + tduffy> +/* tduffy> + * dapl_psp_create tduffy> + * tduffy> + * Create a persistent Public Service Point that can recieve multiple tduffy> + * requests for connections and generate multiple connection request tduffy> + * instances that wil be delivered to the specified Event Dispatcher tduffy> + * in a notification event. tduffy> + * tduffy> + * Input: tduffy> + * ia_handle tduffy> + * conn_qual tduffy> + * evd_handle tduffy> + * psp_flags tduffy> + * tduffy> + * Output: tduffy> + * psp_handle tduffy> + * tduffy> + * Returns: tduffy> + * DAT_SUCCESS tduffy> + * DAT_INSUFFICIENT_RESOURCES tduffy> + * DAT_INVALID_PARAMETER tduffy> + * DAT_CONN_QUAL_IN_USE tduffy> + * DAT_MODEL_NOT_SUPPORTED tduffy> + */ tduffy> +u32 dapl_psp_create(DAT_IA_HANDLE ia_handle, DAT_CONN_QUAL conn_qual, tduffy> + DAT_EVD_HANDLE evd_handle, enum dat_psp_flags psp_flags, tduffy> + DAT_PSP_HANDLE *psp_handle) tduffy> +{ tduffy> + struct dapl_ia *ia_ptr; tduffy> + struct dapl_sp *sp_ptr; tduffy> + struct dapl_evd *evd_ptr; tduffy> + boolean_t sp_found; tduffy> + u32 status = DAT_SUCCESS; tduffy> + tduffy> + ia_ptr = (struct dapl_ia *)ia_handle; tduffy> + tduffy> + if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { tduffy> + status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); tduffy> + goto bail; tduffy> + } tduffy> + if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { tduffy> + status = DAT_ERROR(DAT_INVALID_HANDLE, tduffy> + DAT_INVALID_HANDLE_EVD_CR); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + if (psp_handle == NULL) { tduffy> + status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG5); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + evd_ptr = (struct dapl_evd *)evd_handle; tduffy> + if (!(evd_ptr->evd_flags & DAT_EVD_CR_FLAG)) { tduffy> + status = DAT_ERROR(DAT_INVALID_HANDLE, tduffy> + DAT_INVALID_HANDLE_EVD_CR); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + if (psp_flags != DAT_PSP_CONSUMER_FLAG && tduffy> + psp_flags != DAT_PSP_PROVIDER_FLAG) { tduffy> + status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + /* tduffy> + * See if we have a quiescent listener to use for this PSP, else tduffy> + * create one and set it listening tduffy> + */ tduffy> + sp_ptr = dapl_ia_sp_search(ia_ptr, conn_qual, TRUE); tduffy> + sp_found = TRUE; tduffy> + if (sp_ptr == NULL) { tduffy> + /* Allocate PSP */ tduffy> + sp_found = FALSE; tduffy> + sp_ptr = dapl_sp_alloc(ia_ptr, TRUE); tduffy> + if (sp_ptr == NULL) { tduffy> + status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, tduffy> + DAT_RESOURCE_MEMORY); tduffy> + goto bail; tduffy> + } tduffy> + } else if (sp_ptr->listening == TRUE) { tduffy> + status = DAT_ERROR(DAT_CONN_QUAL_IN_USE, 0); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + /* tduffy> + * Fill out the args for a PSP tduffy> + */ tduffy> + sp_ptr->ia_handle = ia_handle; tduffy> + sp_ptr->conn_qual = conn_qual; tduffy> + sp_ptr->evd_handle = evd_handle; tduffy> + sp_ptr->psp_flags = psp_flags; tduffy> + sp_ptr->ep_handle = NULL; tduffy> + tduffy> + /* tduffy> + * Take a reference on the EVD handle tduffy> + */ tduffy> + atomic_inc(&evd_ptr->evd_ref_count); tduffy> + tduffy> + /* tduffy> + * Set up a listener for a connection. Connections can arrive tduffy> + * even before this call returns! tduffy> + */ tduffy> + sp_ptr->state = DAPL_SP_STATE_PSP_LISTENING; tduffy> + sp_ptr->listening = TRUE; tduffy> + tduffy> + /* tduffy> + * If this is a new sp we need to add it to the IA queue, and set up tduffy> + * a conn_listener. tduffy> + */ tduffy> + if (sp_found == FALSE) { tduffy> + /* tduffy> + * Link it onto the IA before enabling it to receive conn tduffy> + * requests tduffy> + */ tduffy> + dapl_ia_link_psp(ia_ptr, sp_ptr); tduffy> + tduffy> + status = dapl_ib_setup_conn_listener(ia_ptr, sp_ptr); tduffy> + tduffy> + if (status != DAT_SUCCESS) { tduffy> + /* tduffy> + * Have a problem setting up the connection, something tduffy> + * wrong! Decrements the EVD refcount & release it. tduffy> + */ tduffy> + atomic_dec(&evd_ptr->evd_ref_count); tduffy> + sp_ptr->evd_handle = NULL; tduffy> + dapl_ia_unlink_sp(ia_ptr, sp_ptr); tduffy> + dapl_sp_dealloc(sp_ptr); tduffy> + tduffy> + dapl_dbg_log(DAPL_DBG_TYPE_CM, "dapl_psp_create " tduffy> + "setup_conn_listener failed: %x\n", tduffy> + status); tduffy> + tduffy> + goto bail; tduffy> + } tduffy> + } tduffy> + tduffy> + /* tduffy> + * Return handle to the user tduffy> + */ tduffy> + *psp_handle = (DAT_PSP_HANDLE) sp_ptr; tduffy> + tduffy> +bail: tduffy> + return status; tduffy> +} tduffy> + tduffy> +/* tduffy> + * dapl_psp_free tduffy> + * tduffy> + * Destroy a specific instance of a Service Point. tduffy> + * tduffy> + * Input: tduffy> + * psp_handle tduffy> + * tduffy> + * Output: tduffy> + * none tduffy> + * tduffy> + * Returns: tduffy> + * DAT_SUCCESS tduffy> + * DAT_INVALID_PARAMETER tduffy> + */ tduffy> +u32 dapl_psp_free(DAT_PSP_HANDLE psp_handle) tduffy> +{ tduffy> + struct dapl_ia *ia_ptr; tduffy> + struct dapl_sp *sp_ptr; tduffy> + DAPL_SP_STATE save_state; tduffy> + u32 status = DAT_SUCCESS; tduffy> + tduffy> + sp_ptr = (struct dapl_sp *)psp_handle; tduffy> + /* tduffy> + * Verify handle tduffy> + */ tduffy> + dapl_dbg_log(DAPL_DBG_TYPE_CM, ">>> dapl_psp_free %p\n", psp_handle); tduffy> + tduffy> + if (DAPL_BAD_HANDLE(sp_ptr, DAPL_MAGIC_PSP)) { tduffy> + status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PSP); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + /* ia_ptr = (struct dapl_ia *)sp_ptr->header.owner_ia; */ tduffy> + ia_ptr = sp_ptr->header.owner_ia; tduffy> + /* tduffy> + * Remove the connection listener if it has been established tduffy> + * and there are no current connections in progress. tduffy> + * If we defer removing the sp it becomes something of a zombie tduffy> + * container until the last connection is disconnected, after tduffy> + * which it will be cleaned up. tduffy> + */ tduffy> + spin_lock_irqsave(&sp_ptr->header.lock, sp_ptr->header.flags); tduffy> + tduffy> + sp_ptr->listening = FALSE; tduffy> + tduffy> + /* tduffy> + * Release reference on EVD. If an error was encountered in a previous tduffy> + * free the evd_handle will be NULL tduffy> + */ tduffy> + if (sp_ptr->evd_handle) { tduffy> + atomic_dec(&((struct dapl_evd *)sp_ptr->evd_handle)-> tduffy> + evd_ref_count); tduffy> + sp_ptr->evd_handle = NULL; tduffy> + } tduffy> + tduffy> + /* tduffy> + * Release the base resource if there are no outstanding tduffy> + * connections; else the last disconnect on this PSP will free it tduffy> + * up. The PSP is used to contain CR records for each connection, tduffy> + * which contain information necessary to disconnect. tduffy> + */ tduffy> + dapl_dbg_log(DAPL_DBG_TYPE_CM, tduffy> + ">>> dapl_psp_free: state %d cr_list_count %d\n", tduffy> + sp_ptr->state, sp_ptr->cr_list_count); tduffy> + if ((sp_ptr->state == DAPL_SP_STATE_PSP_LISTENING || tduffy> + sp_ptr->state == DAPL_SP_STATE_PSP_PENDING) && tduffy> + sp_ptr->cr_list_count == 0) { tduffy> + save_state = sp_ptr->state; tduffy> + sp_ptr->state = DAPL_SP_STATE_FREE; tduffy> + spin_unlock_irqrestore(&sp_ptr->header.lock, tduffy> + sp_ptr->header.flags); tduffy> + tduffy> + status = dapl_ib_remove_conn_listener(ia_ptr, sp_ptr); tduffy> + if (status != DAT_SUCCESS) { tduffy> + /* revert to entry state on error */ tduffy> + sp_ptr->state = save_state; tduffy> + goto bail; tduffy> + } tduffy> + dapl_ia_unlink_sp(ia_ptr, sp_ptr); tduffy> + dapl_sp_dealloc(sp_ptr); tduffy> + } else { tduffy> + /* tduffy> + * The PSP is now in the pending state, where it will sit until tduffy> + * the last connection terminates or the app uses the same tduffy> + * ServiceID again, which will reactivate it. tduffy> + */ tduffy> + sp_ptr->state = DAPL_SP_STATE_PSP_PENDING; tduffy> + spin_unlock_irqrestore(&sp_ptr->header.lock, sp_ptr->header.flags); tduffy> + dapl_dbg_log(DAPL_DBG_TYPE_CM, tduffy> + ">>> dapl_psp_free: PSP PENDING\n"); tduffy> + } tduffy> + tduffy> +bail: tduffy> + return status; tduffy> +} tduffy> + tduffy> +u32 dapl_psp_query(DAT_PSP_HANDLE psp_handle, struct dat_psp_param *psp_param) tduffy> +{ tduffy> + struct dapl_sp *sp_ptr; tduffy> + u32 status; tduffy> + tduffy> + if (DAPL_BAD_HANDLE(psp_handle, DAPL_MAGIC_PSP) || tduffy> + ((struct dapl_sp *)psp_handle)->listening != TRUE) { tduffy> + status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PSP); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + if (NULL == psp_param) { tduffy> + status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); tduffy> + goto bail; tduffy> + } tduffy> + tduffy> + sp_ptr = (struct dapl_sp *)psp_handle; tduffy> + tduffy> + psp_param->ia_handle = sp_ptr->ia_handle; tduffy> + psp_param->conn_qual = sp_ptr->conn_qual; tduffy> + psp_param->evd_handle = sp_ptr->evd_handle; tduffy> + psp_param->psp_flags = sp_ptr->psp_flags; tduffy> + tduffy> + status = DAT_SUCCESS; tduffy> + tduffy> +bail: tduffy> + return status; tduffy> +} tduffy> diff -Nurp -X /home/tduffy/dontdiff linux-kernel-rsp/dat-provider/dapl_psp_create_any.c linux-kernel-psp/dat-provider/dapl_psp_create_any.c tduffy> --- linux-kernel-rsp/dat-provider/dapl_psp_create_any.c 2005-05-23 22:21:46.111018000 -0700 tduffy> +++ linux-kernel-psp/dat-provider/dapl_psp_create_any.c 1969-12-31 16:00:00.000000000 -0800 tduffy> @@ -1,177 +0,0 @@ tduffy> -/* tduffy> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. tduffy> - * tduffy> - * This Software is licensed under one of the following licenses: tduffy> - * tduffy> - * 1) under the terms of the "Common Public License 1.0" a copy of which is tduffy> - * available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/cpl.php. tduffy> - * tduffy> - * 2) under the terms of the "The BSD License" a copy of which is tduffy> - * available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/bsd-license.php. tduffy> - * tduffy> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a tduffy> - * copy of which is available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/gpl-license.php. tduffy> - * tduffy> - * Licensee has the right to choose one of the above licenses. tduffy> - * tduffy> - * Redistributions of source code must retain the above copyright tduffy> - * notice and one of the license notices. tduffy> - * tduffy> - * Redistributions in binary form must reproduce both the above copyright tduffy> - * notice, one of the license notices in the documentation tduffy> - * and/or other materials provided with the distribution. tduffy> - */ tduffy> - tduffy> -/* tduffy> - * $Id: dapl_psp_create_any.c 2462 2005-05-24 02:28:24Z jlentini $ tduffy> - */ tduffy> - tduffy> -#include "dapl.h" tduffy> -#include "dapl_sp_util.h" tduffy> -#include "dapl_ia_util.h" tduffy> -#include "dapl_openib_util.h" tduffy> - tduffy> -/* tduffy> - * dapl_psp_create_any tduffy> - * tduffy> - * Create a persistent Public Service Point that can recieve multiple tduffy> - * requests for connections and generate multiple connection request tduffy> - * instances that wil be delivered to the specified Event Dispatcher tduffy> - * in a notification event. Differs from dapl_psp_create() in that tduffy> - * the conn_qual is selected by the implementation and returned to tduffy> - * the user. tduffy> - * tduffy> - * Input: tduffy> - * ia_handle tduffy> - * evd_handle tduffy> - * psp_flags tduffy> - * tduffy> - * Output: tduffy> - * conn_qual tduffy> - * psp_handle tduffy> - * tduffy> - * Returns: tduffy> - * DAT_SUCCESS tduffy> - * DAT_INSUFFICIENT_RESOURCES tduffy> - * DAT_INVALID_HANDLE tduffy> - * DAT_INVALID_PARAMETER tduffy> - * DAT_CONN_QUAL_IN_USE tduffy> - * DAT_MODEL_NOT_SUPPORTED tduffy> - */ tduffy> -u32 dapl_psp_create_any(DAT_IA_HANDLE ia_handle, DAT_CONN_QUAL *conn_qual, tduffy> - DAT_EVD_HANDLE evd_handle, enum dat_psp_flags psp_flags, tduffy> - DAT_PSP_HANDLE *psp_handle) tduffy> -{ tduffy> - static DAT_CONN_QUAL hint_conn_qual = 1000; /* seed value */ tduffy> - struct dapl_ia *ia_ptr; tduffy> - struct dapl_sp *sp_ptr; tduffy> - struct dapl_evd *evd_ptr; tduffy> - u32 status = DAT_SUCCESS; tduffy> - int i; tduffy> - tduffy> - ia_ptr = (struct dapl_ia *)ia_handle; tduffy> - tduffy> - if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { tduffy> - status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); tduffy> - goto bail; tduffy> - } tduffy> - if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { tduffy> - status = tduffy> - DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CR); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - if (psp_handle == NULL) { tduffy> - status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG5); tduffy> - goto bail; tduffy> - } tduffy> - if (conn_qual == NULL) { tduffy> - status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - evd_ptr = (struct dapl_evd *)evd_handle; tduffy> - if (!(evd_ptr->evd_flags & DAT_EVD_CR_FLAG)) { tduffy> - status = tduffy> - DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CR); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - if (psp_flags != DAT_PSP_CONSUMER_FLAG && tduffy> - psp_flags != DAT_PSP_PROVIDER_FLAG) { tduffy> - status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - /* Allocate PSP */ tduffy> - sp_ptr = dapl_sp_alloc(ia_ptr, TRUE); tduffy> - if (sp_ptr == NULL) { tduffy> - status = tduffy> - DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - /* tduffy> - * Fill out the args for a PSP tduffy> - */ tduffy> - sp_ptr->ia_handle = ia_handle; tduffy> - sp_ptr->evd_handle = evd_handle; tduffy> - sp_ptr->psp_flags = psp_flags; tduffy> - sp_ptr->ep_handle = NULL; tduffy> - tduffy> - /* tduffy> - * Take a reference on the EVD handle tduffy> - */ tduffy> - atomic_inc(&evd_ptr->evd_ref_count); tduffy> - tduffy> - /* Link it onto the IA */ tduffy> - dapl_ia_link_psp(ia_ptr, sp_ptr); tduffy> - tduffy> - /* tduffy> - * Set up a listener for a connection. Connections can arrive tduffy> - * even before this call returns! tduffy> - */ tduffy> - sp_ptr->state = DAPL_SP_STATE_PSP_LISTENING; tduffy> - sp_ptr->listening = TRUE; tduffy> - tduffy> - /* tduffy> - * If we have a big number of tries and we still haven't tduffy> - * found a service_ID we can use, bail out with an error, tduffy> - * something is wrong! tduffy> - */ tduffy> - for (i = 0, sp_ptr->conn_qual = hint_conn_qual; i < 100000; i++) { tduffy> - tduffy> - status = dapl_ib_setup_conn_listener(ia_ptr, sp_ptr); tduffy> - tduffy> - if (DAT_SUCCESS == status) tduffy> - break; tduffy> - else tduffy> - sp_ptr->conn_qual++; tduffy> - } tduffy> - hint_conn_qual = sp_ptr->conn_qual + 1; tduffy> - tduffy> - if (status != DAT_SUCCESS) { tduffy> - atomic_dec(&evd_ptr->evd_ref_count); tduffy> - sp_ptr->evd_handle = NULL; tduffy> - dapl_ia_unlink_sp(ia_ptr, sp_ptr); tduffy> - dapl_sp_dealloc(sp_ptr); tduffy> - tduffy> - dapl_dbg_log(DAPL_DBG_TYPE_ERR, tduffy> - "dapl_psp_create cannot set up conn listener: %x\n", tduffy> - status); tduffy> - tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - /* tduffy> - * Return handle to the user tduffy> - */ tduffy> - *conn_qual = sp_ptr->conn_qual; tduffy> - *psp_handle = (DAT_PSP_HANDLE) sp_ptr; tduffy> - tduffy> - bail: tduffy> - return status; tduffy> -} tduffy> diff -Nurp -X /home/tduffy/dontdiff linux-kernel-rsp/dat-provider/dapl_psp_create.c linux-kernel-psp/dat-provider/dapl_psp_create.c tduffy> --- linux-kernel-rsp/dat-provider/dapl_psp_create.c 2005-05-23 22:21:46.086003000 -0700 tduffy> +++ linux-kernel-psp/dat-provider/dapl_psp_create.c 1969-12-31 16:00:00.000000000 -0800 tduffy> @@ -1,181 +0,0 @@ tduffy> -/* tduffy> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. tduffy> - * tduffy> - * This Software is licensed under one of the following licenses: tduffy> - * tduffy> - * 1) under the terms of the "Common Public License 1.0" a copy of which is tduffy> - * available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/cpl.php. tduffy> - * tduffy> - * 2) under the terms of the "The BSD License" a copy of which is tduffy> - * available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/bsd-license.php. tduffy> - * tduffy> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a tduffy> - * copy of which is available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/gpl-license.php. tduffy> - * tduffy> - * Licensee has the right to choose one of the above licenses. tduffy> - * tduffy> - * Redistributions of source code must retain the above copyright tduffy> - * notice and one of the license notices. tduffy> - * tduffy> - * Redistributions in binary form must reproduce both the above copyright tduffy> - * notice, one of the license notices in the documentation tduffy> - * and/or other materials provided with the distribution. tduffy> - */ tduffy> - tduffy> -/* tduffy> - * $Id: dapl_psp_create.c 2462 2005-05-24 02:28:24Z jlentini $ tduffy> - */ tduffy> - tduffy> -#include "dapl.h" tduffy> -#include "dapl_sp_util.h" tduffy> -#include "dapl_ia_util.h" tduffy> -#include "dapl_openib_util.h" tduffy> - tduffy> -/* tduffy> - * dapl_psp_create tduffy> - * tduffy> - * Create a persistent Public Service Point that can recieve multiple tduffy> - * requests for connections and generate multiple connection request tduffy> - * instances that wil be delivered to the specified Event Dispatcher tduffy> - * in a notification event. tduffy> - * tduffy> - * Input: tduffy> - * ia_handle tduffy> - * conn_qual tduffy> - * evd_handle tduffy> - * psp_flags tduffy> - * tduffy> - * Output: tduffy> - * psp_handle tduffy> - * tduffy> - * Returns: tduffy> - * DAT_SUCCESS tduffy> - * DAT_INSUFFICIENT_RESOURCES tduffy> - * DAT_INVALID_PARAMETER tduffy> - * DAT_CONN_QUAL_IN_USE tduffy> - * DAT_MODEL_NOT_SUPPORTED tduffy> - */ tduffy> -u32 dapl_psp_create(DAT_IA_HANDLE ia_handle, DAT_CONN_QUAL conn_qual, tduffy> - DAT_EVD_HANDLE evd_handle, enum dat_psp_flags psp_flags, tduffy> - DAT_PSP_HANDLE *psp_handle) tduffy> -{ tduffy> - struct dapl_ia *ia_ptr; tduffy> - struct dapl_sp *sp_ptr; tduffy> - struct dapl_evd *evd_ptr; tduffy> - boolean_t sp_found; tduffy> - u32 dat_status = DAT_SUCCESS; tduffy> - tduffy> - ia_ptr = (struct dapl_ia *)ia_handle; tduffy> - tduffy> - if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) { tduffy> - dat_status = tduffy> - DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA); tduffy> - goto bail; tduffy> - } tduffy> - if (DAPL_BAD_HANDLE(evd_handle, DAPL_MAGIC_EVD)) { tduffy> - dat_status = tduffy> - DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CR); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - if (psp_handle == NULL) { tduffy> - dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG5); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - evd_ptr = (struct dapl_evd *)evd_handle; tduffy> - if (!(evd_ptr->evd_flags & DAT_EVD_CR_FLAG)) { tduffy> - dat_status = tduffy> - DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EVD_CR); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - if (psp_flags != DAT_PSP_CONSUMER_FLAG && tduffy> - psp_flags != DAT_PSP_PROVIDER_FLAG) { tduffy> - dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - /* tduffy> - * See if we have a quiescent listener to use for this PSP, else tduffy> - * create one and set it listening tduffy> - */ tduffy> - sp_ptr = dapl_ia_sp_search(ia_ptr, conn_qual, TRUE); tduffy> - sp_found = TRUE; tduffy> - if (sp_ptr == NULL) { tduffy> - /* Allocate PSP */ tduffy> - sp_found = FALSE; tduffy> - sp_ptr = dapl_sp_alloc(ia_ptr, TRUE); tduffy> - if (sp_ptr == NULL) { tduffy> - dat_status = tduffy> - DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, tduffy> - DAT_RESOURCE_MEMORY); tduffy> - goto bail; tduffy> - } tduffy> - } else if (sp_ptr->listening == TRUE) { tduffy> - dat_status = DAT_ERROR(DAT_CONN_QUAL_IN_USE, 0); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - /* tduffy> - * Fill out the args for a PSP tduffy> - */ tduffy> - sp_ptr->ia_handle = ia_handle; tduffy> - sp_ptr->conn_qual = conn_qual; tduffy> - sp_ptr->evd_handle = evd_handle; tduffy> - sp_ptr->psp_flags = psp_flags; tduffy> - sp_ptr->ep_handle = NULL; tduffy> - tduffy> - /* tduffy> - * Take a reference on the EVD handle tduffy> - */ tduffy> - atomic_inc(&evd_ptr->evd_ref_count); tduffy> - tduffy> - /* tduffy> - * Set up a listener for a connection. Connections can arrive tduffy> - * even before this call returns! tduffy> - */ tduffy> - sp_ptr->state = DAPL_SP_STATE_PSP_LISTENING; tduffy> - sp_ptr->listening = TRUE; tduffy> - tduffy> - /* tduffy> - * If this is a new sp we need to add it to the IA queue, and set up tduffy> - * a conn_listener. tduffy> - */ tduffy> - if (sp_found == FALSE) { tduffy> - /* Link it onto the IA before enabling it to receive conn tduffy> - * requests tduffy> - */ tduffy> - dapl_ia_link_psp(ia_ptr, sp_ptr); tduffy> - tduffy> - dat_status = dapl_ib_setup_conn_listener(ia_ptr, sp_ptr); tduffy> - tduffy> - if (dat_status != DAT_SUCCESS) { tduffy> - /* tduffy> - * Have a problem setting up the connection, something tduffy> - * wrong! Decrements the EVD refcount & release it. tduffy> - */ tduffy> - atomic_dec(&evd_ptr->evd_ref_count); tduffy> - sp_ptr->evd_handle = NULL; tduffy> - dapl_ia_unlink_sp(ia_ptr, sp_ptr); tduffy> - dapl_sp_dealloc(sp_ptr); tduffy> - tduffy> - dapl_dbg_log(DAPL_DBG_TYPE_CM, "dapl_psp_create " tduffy> - "setup_conn_listener failed: %x\n", tduffy> - dat_status); tduffy> - tduffy> - goto bail; tduffy> - } tduffy> - } tduffy> - tduffy> - /* tduffy> - * Return handle to the user tduffy> - */ tduffy> - *psp_handle = (DAT_PSP_HANDLE) sp_ptr; tduffy> - tduffy> - bail: tduffy> - return dat_status; tduffy> -} tduffy> diff -Nurp -X /home/tduffy/dontdiff linux-kernel-rsp/dat-provider/dapl_psp_free.c linux-kernel-psp/dat-provider/dapl_psp_free.c tduffy> --- linux-kernel-rsp/dat-provider/dapl_psp_free.c 2005-05-20 22:55:17.285001000 -0700 tduffy> +++ linux-kernel-psp/dat-provider/dapl_psp_free.c 1969-12-31 16:00:00.000000000 -0800 tduffy> @@ -1,131 +0,0 @@ tduffy> -/* tduffy> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. tduffy> - * tduffy> - * This Software is licensed under one of the following licenses: tduffy> - * tduffy> - * 1) under the terms of the "Common Public License 1.0" a copy of which is tduffy> - * available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/cpl.php. tduffy> - * tduffy> - * 2) under the terms of the "The BSD License" a copy of which is tduffy> - * available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/bsd-license.php. tduffy> - * tduffy> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a tduffy> - * copy of which is available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/gpl-license.php. tduffy> - * tduffy> - * Licensee has the right to choose one of the above licenses. tduffy> - * tduffy> - * Redistributions of source code must retain the above copyright tduffy> - * notice and one of the license notices. tduffy> - * tduffy> - * Redistributions in binary form must reproduce both the above copyright tduffy> - * notice, one of the license notices in the documentation tduffy> - * and/or other materials provided with the distribution. tduffy> - */ tduffy> - tduffy> -/* tduffy> - * $Id: dapl_psp_free.c 2433 2005-05-21 04:11:03Z jlentini $ tduffy> - */ tduffy> - tduffy> -#include "dapl.h" tduffy> -#include "dapl_sp_util.h" tduffy> -#include "dapl_ia_util.h" tduffy> -#include "dapl_openib_util.h" tduffy> - tduffy> -/* tduffy> - * dapl_psp_free tduffy> - * tduffy> - * Destroy a specific instance of a Service Point. tduffy> - * tduffy> - * Input: tduffy> - * psp_handle tduffy> - * tduffy> - * Output: tduffy> - * none tduffy> - * tduffy> - * Returns: tduffy> - * DAT_SUCCESS tduffy> - * DAT_INVALID_PARAMETER tduffy> - */ tduffy> -u32 dapl_psp_free(DAT_PSP_HANDLE psp_handle) tduffy> -{ tduffy> - struct dapl_ia *ia_ptr; tduffy> - struct dapl_sp *sp_ptr; tduffy> - DAPL_SP_STATE save_state; tduffy> - u32 dat_status = DAT_SUCCESS; tduffy> - tduffy> - sp_ptr = (struct dapl_sp *)psp_handle; tduffy> - /* tduffy> - * Verify handle tduffy> - */ tduffy> - dapl_dbg_log(DAPL_DBG_TYPE_CM, ">>> dapl_psp_free %p\n", psp_handle); tduffy> - tduffy> - if (DAPL_BAD_HANDLE(sp_ptr, DAPL_MAGIC_PSP)) { tduffy> - dat_status = tduffy> - DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PSP); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - /* ia_ptr = (struct dapl_ia *)sp_ptr->header.owner_ia; */ tduffy> - ia_ptr = sp_ptr->header.owner_ia; tduffy> - /* tduffy> - * Remove the connection listener if it has been established tduffy> - * and there are no current connections in progress. tduffy> - * If we defer removing the sp it becomes something of a zombie tduffy> - * container until the last connection is disconnected, after tduffy> - * which it will be cleaned up. tduffy> - */ tduffy> - spin_lock_irqsave(&sp_ptr->header.lock, sp_ptr->header.flags); tduffy> - tduffy> - sp_ptr->listening = FALSE; tduffy> - tduffy> - /* Release reference on EVD. If an error was encountered in a previous tduffy> - * free the evd_handle will be NULL tduffy> - */ tduffy> - if (sp_ptr->evd_handle) { tduffy> - atomic_dec(&((struct dapl_evd *)sp_ptr->evd_handle)-> tduffy> - evd_ref_count); tduffy> - sp_ptr->evd_handle = NULL; tduffy> - } tduffy> - tduffy> - /* tduffy> - * Release the base resource if there are no outstanding tduffy> - * connections; else the last disconnect on this PSP will free it tduffy> - * up. The PSP is used to contain CR records for each connection, tduffy> - * which contain information necessary to disconnect. tduffy> - */ tduffy> - dapl_dbg_log(DAPL_DBG_TYPE_CM, tduffy> - ">>> dapl_psp_free: state %d cr_list_count %d\n", tduffy> - sp_ptr->state, sp_ptr->cr_list_count); tduffy> - if ((sp_ptr->state == DAPL_SP_STATE_PSP_LISTENING || tduffy> - sp_ptr->state == DAPL_SP_STATE_PSP_PENDING) && tduffy> - sp_ptr->cr_list_count == 0) { tduffy> - save_state = sp_ptr->state; tduffy> - sp_ptr->state = DAPL_SP_STATE_FREE; tduffy> - spin_unlock_irqrestore(&sp_ptr->header.lock, tduffy> - sp_ptr->header.flags); tduffy> - tduffy> - dat_status = dapl_ib_remove_conn_listener(ia_ptr, sp_ptr); tduffy> - if (dat_status != DAT_SUCCESS) { tduffy> - /* revert to entry state on error */ tduffy> - sp_ptr->state = save_state; tduffy> - goto bail; tduffy> - } tduffy> - dapl_ia_unlink_sp(ia_ptr, sp_ptr); tduffy> - dapl_sp_dealloc(sp_ptr); tduffy> - } else { tduffy> - /* The PSP is now in the pending state, where it will sit until tduffy> - * the last connection terminates or the app uses the same tduffy> - * ServiceID again, which will reactivate it. tduffy> - */ tduffy> - sp_ptr->state = DAPL_SP_STATE_PSP_PENDING; tduffy> - spin_unlock_irqrestore(&sp_ptr->header.lock, sp_ptr->header.flags); tduffy> - dapl_dbg_log(DAPL_DBG_TYPE_CM, tduffy> - ">>> dapl_psp_free: PSP PENDING\n"); tduffy> - } tduffy> - tduffy> - bail: tduffy> - return dat_status; tduffy> -} tduffy> diff -Nurp -X /home/tduffy/dontdiff linux-kernel-rsp/dat-provider/dapl_psp_query.c linux-kernel-psp/dat-provider/dapl_psp_query.c tduffy> --- linux-kernel-rsp/dat-provider/dapl_psp_query.c 2005-05-20 22:55:18.853022000 -0700 tduffy> +++ linux-kernel-psp/dat-provider/dapl_psp_query.c 1969-12-31 16:00:00.000000000 -0800 tduffy> @@ -1,62 +0,0 @@ tduffy> -/* tduffy> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved. tduffy> - * tduffy> - * This Software is licensed under one of the following licenses: tduffy> - * tduffy> - * 1) under the terms of the "Common Public License 1.0" a copy of which is tduffy> - * available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/cpl.php. tduffy> - * tduffy> - * 2) under the terms of the "The BSD License" a copy of which is tduffy> - * available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/bsd-license.php. tduffy> - * tduffy> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a tduffy> - * copy of which is available from the Open Source Initiative, see tduffy> - * http://www.opensource.org/licenses/gpl-license.php. tduffy> - * tduffy> - * Licensee has the right to choose one of the above licenses. tduffy> - * tduffy> - * Redistributions of source code must retain the above copyright tduffy> - * notice and one of the license notices. tduffy> - * tduffy> - * Redistributions in binary form must reproduce both the above copyright tduffy> - * notice, one of the license notices in the documentation tduffy> - * and/or other materials provided with the distribution. tduffy> - */ tduffy> - tduffy> -/* tduffy> - * $Id: dapl_psp_query.c 2433 2005-05-21 04:11:03Z jlentini $ tduffy> - */ tduffy> - tduffy> -#include "dapl.h" tduffy> - tduffy> -u32 dapl_psp_query(DAT_PSP_HANDLE psp_handle, struct dat_psp_param *psp_param) tduffy> -{ tduffy> - struct dapl_sp *sp_ptr; tduffy> - u32 status; tduffy> - tduffy> - if (DAPL_BAD_HANDLE(psp_handle, DAPL_MAGIC_PSP) || tduffy> - ((struct dapl_sp *)psp_handle)->listening != TRUE) { tduffy> - status = tduffy> - DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PSP); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - if (NULL == psp_param) { tduffy> - status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3); tduffy> - goto bail; tduffy> - } tduffy> - tduffy> - sp_ptr = (struct dapl_sp *)psp_handle; tduffy> - tduffy> - psp_param->ia_handle = sp_ptr->ia_handle; tduffy> - psp_param->conn_qual = sp_ptr->conn_qual; tduffy> - psp_param->evd_handle = sp_ptr->evd_handle; tduffy> - psp_param->psp_flags = sp_ptr->psp_flags; tduffy> - tduffy> - status = DAT_SUCCESS; tduffy> - tduffy> -bail: tduffy> - return status; tduffy> -} tduffy> diff -Nurp -X /home/tduffy/dontdiff linux-kernel-rsp/dat-provider/Makefile linux-kernel-psp/dat-provider/Makefile tduffy> --- linux-kernel-rsp/dat-provider/Makefile 2005-05-25 15:01:00.683014000 -0700 tduffy> +++ linux-kernel-psp/dat-provider/Makefile 2005-05-25 15:12:34.054000000 -0700 tduffy> @@ -70,10 +70,7 @@ PROVIDER_MODULES := \ tduffy> dapl_mr_util \ tduffy> dapl_provider \ tduffy> dapl_sp_util \ tduffy> - dapl_psp_create \ tduffy> - dapl_psp_create_any \ tduffy> - dapl_psp_free \ tduffy> - dapl_psp_query \ tduffy> + dapl_psp \ tduffy> dapl_pz \ tduffy> dapl_ring_buffer_util \ tduffy> dapl_rmr \ tduffy> diff -Nurp -X /home/tduffy/dontdiff linux-kernel-rsp/patches/alt_dat_provider_makefile linux-kernel-psp/patches/alt_dat_provider_makefile tduffy> --- linux-kernel-rsp/patches/alt_dat_provider_makefile 2005-05-25 14:53:43.453015000 -0700 tduffy> +++ linux-kernel-psp/patches/alt_dat_provider_makefile 2005-05-25 15:05:08.065003000 -0700 tduffy> @@ -64,10 +64,7 @@ PROVIDER_MODULES := \ tduffy> dapl_mr_util \ tduffy> dapl_provider \ tduffy> dapl_sp_util \ tduffy> - dapl_psp_create \ tduffy> - dapl_psp_create_any \ tduffy> - dapl_psp_free \ tduffy> - dapl_psp_query \ tduffy> + dapl_psp \ tduffy> dapl_pz \ tduffy> dapl_ring_buffer_util \ tduffy> dapl_rmr \ tduffy> _______________________________________________ openib-general mailing list [email protected] http://openib.org/mailman/listinfo/openib-general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
