[openib-general] Re: [PATCH][kdapl]update dat_rmr_bind API & delete dapl_hash

James Lentini jlentini at netapp.com
Thu Jun 16 08:48:19 PDT 2005


Itamar,

Can you seperate the RMR api change and hash table removal into a 
seperate patch?

Merging the HCA and IA code into the dapl_ia.[ch] files doesn't feel 
right to me. I think of the HCA as a DAT object just like IAs, EPs, 
LMRs, etc, and hence it should have its own file.

james

On Wed, 15 Jun 2005, Rabenstein Itamar wrote:

> Updated dat_rmr_bind API (added lmr_handle as input param)
> delete dapl_hash.[h|c] files (not needed any more)
> Integrate dapl_hca_util functions in ia/provider code
> delete dapl_hca_util.[h|c] files
>
> Signed-off-by: Itamar Rabenstein <itamar at mellanox.co.il>
>
> Index: test/dapltest/test/dapl_bpool.c
> ===================================================================
> --- test/dapltest/test/dapl_bpool.c	(revision 2608)
> +++ test/dapltest/test/dapl_bpool.c	(working copy)
> @@ -236,6 +236,7 @@
>     			bpool_ptr->reg_addr, bpool_ptr->reg_size));
>
>     	ret = dat_rmr_bind ( bpool_ptr->rmr_handle,
> +			    bpool_ptr->lmr,
>     			    &iov,
>     			    mflags,
>     			    bpool_ptr->ep,
> Index: test/dapltest/kdapl/kdapl_tdep_user.c
> ===================================================================
> --- test/dapltest/kdapl/kdapl_tdep_user.c	(revision 2608)
> +++ test/dapltest/kdapl/kdapl_tdep_user.c	(working copy)
> @@ -76,7 +76,7 @@
>     }
>     if (params_ptr->test_type == TRANSACTION_TEST) {
>         print_ioctl.cookie = ioctl (fd, KDAPL_IOCTL_GET_STAT_T, &Client_Stats_T);
> -        DT_print_transaction_stats(&Client_Stats_T,params_ptr->u.Transaction_Cmd.num_iterations,
> +        DT_print_transaction_stats(&Client_Stats_T,params_ptr->u.Transaction_Cmd.num_threads,
>                                    params_ptr->u.Transaction_Cmd.eps_per_thread);
>     }
>
> Index: dat-provider/dapl_hca_util.c
> ===================================================================
> --- dat-provider/dapl_hca_util.c	(revision 2608)
> +++ dat-provider/dapl_hca_util.c	(working copy)
> @@ -1,150 +0,0 @@
> -/*
> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
> - *
> - * This Software is licensed under one of the following licenses:
> - *
> - * 1) under the terms of the "Common Public License 1.0" a copy of which is
> - *    available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/cpl.php.
> - *
> - * 2) under the terms of the "The BSD License" a copy of which is
> - *    available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/bsd-license.php.
> - *
> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
> - *    copy of which is available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/gpl-license.php.
> - *
> - * Licensee has the right to choose one of the above licenses.
> - *
> - * Redistributions of source code must retain the above copyright
> - * notice and one of the license notices.
> - *
> - * Redistributions in binary form must reproduce both the above copyright
> - * notice, one of the license notices in the documentation
> - * and/or other materials provided with the distribution.
> - */
> -
> -/*
> - * $Id$
> - */
> -
> -#include "dapl.h"
> -#include "dapl_openib_util.h"
> -#include "dapl_provider.h"
> -#include "dapl_hca_util.h"
> -#include "dapl_hash.h"
> -
> -/*
> - * dapl_hca_alloc
> - *
> - * alloc and initialize an HCA struct
> - *
> - * Input:
> - * 	name
> - *      port
> - *
> - * Output:
> - * 	hca
> - *
> - * Returns:
> - * 	none
> - *
> - */
> -struct dapl_hca *dapl_hca_alloc(char *name, struct ib_device *device, u8 port)
> -{
> -	struct dapl_hca *hca;
> -
> -	hca = kmalloc(sizeof *hca, GFP_ATOMIC);
> -	if (hca) {
> -		memset(hca, 0, sizeof *hca);
> -
> -		if (DAT_SUCCESS ==
> -		    dapl_hash_create(DAPL_HASH_TABLE_DEFAULT_CAPACITY,
> -				     &hca->lmr_hash_table)) {
> -			spin_lock_init(&hca->lock);
> -			INIT_LIST_HEAD(&hca->ia_list);
> -
> -			hca->name = dapl_os_strdup(name);
> -			hca->ib_hca_handle = device;
> -			hca->port_num = port;
> -			if (hca->name == NULL) {
> -				kfree(hca);
> -				hca = NULL;
> -			}
> -		} else {
> -			kfree(hca);
> -			hca = NULL;
> -		}
> -	}
> -
> -	return hca;
> -}
> -
> -/*
> - * dapl_hca_free
> - *
> - * free an IA INFO struct
> - *
> - * Input:
> - * 	hca
> - *
> - * Output:
> - * 	none
> - *
> - * Returns:
> - * 	none
> - *
> - */
> -void dapl_hca_free(struct dapl_hca *hca)
> -{
> -	(void)dapl_hash_free(hca->lmr_hash_table);
> -	kfree(hca->name);
> -	kfree(hca);
> -}
> -
> -/*
> - * dapl_hca_link_ia
> - *
> - * Add an ia to the HCA structure
> - *
> - * Input:
> - *	hca
> - *	ia_ptr
> - *
> - * Output:
> - * 	none
> - *
> - * Returns:
> - * 	none
> - *
> - */
> -void dapl_hca_link_ia(struct dapl_hca *hca, struct dapl_ia *ia_ptr)
> -{
> -	spin_lock_irqsave(&hca->lock, hca->flags);
> -	list_add(&ia_ptr->list, &hca->ia_list);
> -	spin_unlock_irqrestore(&hca->lock, hca->flags);
> -}
> -
> -/*
> - * dapl_hca_unlink_ia
> - *
> - * Remove an ia from the hca info structure
> - *
> - * Input:
> - *	hca
> - *	ia_ptr
> - *
> - * Output:
> - * 	none
> - *
> - * Returns:
> - * 	none
> - *
> - */
> -void dapl_hca_unlink_ia(struct dapl_hca *hca, struct dapl_ia *ia)
> -{
> -	spin_lock_irqsave(&hca->lock, hca->flags);
> -	list_del(&ia->list);
> -	spin_unlock_irqrestore(&hca->lock, hca->flags);
> -}
> Index: dat-provider/dapl_ia.c
> ===================================================================
> --- dat-provider/dapl_ia.c	(revision 2608)
> +++ dat-provider/dapl_ia.c	(working copy)
> @@ -33,7 +33,6 @@
> #include "dapl_ia.h"
> #include "dapl_provider.h"
> #include "dapl_evd.h"
> -#include "dapl_hca_util.h"
> #include "dapl_openib_util.h"
> #include "dapl_sp.h"
> #include "dapl_cr.h"
> @@ -70,8 +69,9 @@
> 	INIT_LIST_HEAD(&ia->psp_list);
> 	INIT_LIST_HEAD(&ia->srq_list);
>
> -	dapl_hca_link_ia(hca, ia);
> -
> +	spin_lock_irqsave(&hca->lock, hca->flags);
> +	list_add(&ia->list, &hca->ia_list);
> +	spin_unlock_irqrestore(&hca->lock, hca->flags);
> 	return ia;
> }
>
> @@ -378,7 +378,9 @@
> 	dapl_os_assert(list_empty(&ia->psp_list));
> 	dapl_os_assert(list_empty(&ia->rsp_list));
>
> -	dapl_hca_unlink_ia(ia->hca, ia);
> +	spin_lock_irqsave(&ia->hca->lock, ia->hca->flags);
> +	list_del(&ia->list);
> +	spin_unlock_irqrestore(&ia->hca->lock, ia->hca->flags);
> 	/* no need to destroy ia->common.lock */
>
> 	kfree(ia);
> Index: dat-provider/dapl_lmr.c
> ===================================================================
> --- dat-provider/dapl_lmr.c	(revision 2608)
> +++ dat-provider/dapl_lmr.c	(working copy)
> @@ -31,7 +31,6 @@
>
> #include "dapl_openib_util.h"
> #include "dapl_ia.h"
> -#include "dapl_hash.h"
>
> static struct dapl_lmr *dapl_lmr_alloc(struct dapl_ia *ia,
> 				       enum dat_mem_type mem_type,
> @@ -103,17 +102,6 @@
> 	if (DAT_SUCCESS != status)
> 		goto error2;
>
> -	/* if the LMR context is already in the hash table */
> -	status = dapl_hash_search(ia->hca->lmr_hash_table,
> -				  new_lmr->param.lmr_context, NULL);
> -	if (status == DAT_SUCCESS)
> -		goto error3;
> -
> -	status = dapl_hash_insert(ia->hca->lmr_hash_table,
> -				  new_lmr->param.lmr_context, lmr);
> -	if (status != DAT_SUCCESS)
> -		goto error3;
> -
> 	atomic_inc(&pz->pz_ref_count);
>
> 	if (lmr)
> @@ -129,8 +117,6 @@
>
> 	return DAT_SUCCESS;
>
> -error3:
> -	(void)dapl_ib_mr_deregister(new_lmr);
> error2:
> 	dapl_lmr_dealloc(new_lmr);
> error1:
> @@ -167,17 +153,6 @@
> 	if (DAT_SUCCESS != status)
> 		goto error2;
>
> -	/* if the LMR context is already in the hash table */
> -	status = dapl_hash_search(ia->hca->lmr_hash_table,
> -				  new_lmr->param.lmr_context, NULL);
> -	if (status == DAT_SUCCESS)
> -		goto error3;
> -
> -	status = dapl_hash_insert(ia->hca->lmr_hash_table,
> -				  new_lmr->param.lmr_context, lmr);
> -	if (status != DAT_SUCCESS)
> -		goto error3;
> -
> 	atomic_inc(&pz->pz_ref_count);
>
> 	if (lmr)
> @@ -193,8 +168,6 @@
>
> 	return DAT_SUCCESS;
>
> -error3:
> -	(void)dapl_ib_mr_deregister(new_lmr);
> error2:
> 	dapl_lmr_dealloc(new_lmr);
> error1:
> @@ -215,12 +188,6 @@
> 	DAT_REGION_DESCRIPTION reg_desc;
> 	u32 status;
>
> -	status = dapl_hash_search(ia->hca->lmr_hash_table,
> -				  original_lmr->param.lmr_context,
> -				  (DAPL_HASH_DATA *) &lmr);
> -	if (status != DAT_SUCCESS)
> -		goto error1;
> -
> 	reg_desc.for_lmr = (struct dat_lmr *) original_lmr;
>
> 	new_lmr = dapl_lmr_alloc(ia, DAT_MEM_TYPE_LMR, reg_desc, 0,
> @@ -235,17 +202,6 @@
> 	if (DAT_SUCCESS != status)
> 		goto error2;
>
> -	/* if the LMR context is already in the hash table */
> -	status = dapl_hash_search(ia->hca->lmr_hash_table,
> -				  new_lmr->param.lmr_context, NULL);
> -	if (status == DAT_SUCCESS)
> -		goto error3;
> -
> -	status = dapl_hash_insert(ia->hca->lmr_hash_table,
> -				  new_lmr->param.lmr_context, lmr);
> -	if (status != DAT_SUCCESS)
> -		goto error3;
> -
> 	atomic_inc(&pz->pz_ref_count);
>
> 	if (lmr)
> @@ -262,8 +218,6 @@
>
> 	return DAT_SUCCESS;
>
> -error3:
> -	dapl_ib_mr_deregister(new_lmr);
> error2:
> 	dapl_lmr_dealloc(new_lmr);
> error1:
> @@ -371,22 +325,12 @@
> 		if (0 != atomic_read(&dapl_lmr->lmr_ref_count))
> 			return DAT_INVALID_STATE;
>
> -		status = dapl_hash_remove(
> -			dapl_lmr->common.owner_ia->hca->lmr_hash_table,
> -			dapl_lmr->param.lmr_context, NULL);
> -		if (status != DAT_SUCCESS)
> -			goto error;
> -
> 		status = dapl_ib_mr_deregister(dapl_lmr);
> 		if (status == DAT_SUCCESS) {
> 			pz = (struct dapl_pz *)dapl_lmr->param.pz;
> 			atomic_dec(&pz->pz_ref_count);
> 			dapl_lmr_dealloc(dapl_lmr);
> -		} else /* failure; put dapl_lmr back in hash table */
> -			dapl_hash_insert(dapl_lmr->common.owner_ia->
> -					 hca->lmr_hash_table,
> -					 dapl_lmr->param.lmr_context, dapl_lmr);
> -
> +		}
> 		break;
> 	}
> 	case DAT_MEM_TYPE_PLATFORM:
> Index: dat-provider/Makefile
> ===================================================================
> --- dat-provider/Makefile	(revision 2608)
> +++ dat-provider/Makefile	(working copy)
> @@ -20,8 +20,6 @@
>         dapl_cr                  	\
>         dapl_ep                         \
>         dapl_evd                        \
> -        dapl_hash                     	\
> -        dapl_hca_util                 	\
>         dapl_ia                  	\
>         dapl_lmr                 	\
>         dapl_provider                 	\
> Index: dat-provider/dapl_hca_util.h
> ===================================================================
> --- dat-provider/dapl_hca_util.h	(revision 2608)
> +++ dat-provider/dapl_hca_util.h	(working copy)
> @@ -1,45 +0,0 @@
> -/*
> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
> - *
> - * This Software is licensed under one of the following licenses:
> - *
> - * 1) under the terms of the "Common Public License 1.0" a copy of which is
> - *    available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/cpl.php.
> - *
> - * 2) under the terms of the "The BSD License" a copy of which is
> - *    available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/bsd-license.php.
> - *
> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
> - *    copy of which is available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/gpl-license.php.
> - *
> - * Licensee has the right to choose one of the above licenses.
> - *
> - * Redistributions of source code must retain the above copyright
> - * notice and one of the license notices.
> - *
> - * Redistributions in binary form must reproduce both the above copyright
> - * notice, one of the license notices in the documentation
> - * and/or other materials provided with the distribution.
> - */
> -
> -/*
> - * $Id$
> - */
> -
> -#ifndef DAPL_HCA_UTIL_H
> -#define DAPL_HCA_UTIL_H
> -
> -#include "dapl.h"
> -
> -struct dapl_hca *dapl_hca_alloc(char *name, struct ib_device *device, u8 port);
> -
> -void dapl_hca_free(struct dapl_hca *hca);
> -
> -void dapl_hca_link_ia(struct dapl_hca *hca, struct dapl_ia *ia);
> -
> -void dapl_hca_unlink_ia(struct dapl_hca *hca, struct dapl_ia *ia);
> -
> -#endif
> Index: dat-provider/dapl_rmr.c
> ===================================================================
> --- dat-provider/dapl_rmr.c	(revision 2608)
> +++ dat-provider/dapl_rmr.c	(working copy)
> @@ -32,7 +32,6 @@
> #include "dapl.h"
> #include "dapl_ep.h"
> #include "dapl_ia.h"
> -#include "dapl_hash.h"
> #include "dapl_cookie.h"
> #include "dapl_openib_util.h"
>
> @@ -148,26 +147,18 @@
> }
>
> static inline u32 dapl_rmr_bind_fuse(struct dapl_rmr *rmr,
> -				     const struct dat_lmr_triplet *lmr_triplet,
> +				     struct dapl_lmr *lmr,
> +				     const struct dat_lmr_triplet *lmr_triplet,
> 				     enum dat_mem_priv_flags mem_priv,
> 				     struct dapl_ep *ep_ptr,
> 				     DAT_RMR_COOKIE user_cookie,
> 				     enum dat_completion_flags completion_flags,
> 				     DAT_RMR_CONTEXT *rmr_context)
> {
> -	struct dapl_lmr *lmr;
> 	struct dapl_cookie *cookie;
> 	u32 status;
> 	boolean_t is_signaled;
>
> -	status = dapl_hash_search(rmr->common.owner_ia->hca->lmr_hash_table,
> -                                  lmr_triplet->lmr_context,
> -                                  (DAPL_HASH_DATA *) &lmr);
> -	if (DAT_SUCCESS != status) {
> -		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
> -		goto bail;
> -	}
> -
> 	/*
> 	 * if the ep in unconnected return an error. IB requires that the
> 	 * QP be connected to change a memory window binding since:
> @@ -352,6 +343,7 @@
>  * Output:
>  */
> u32 dapl_rmr_bind(struct dat_rmr *rmr_handle,
> +		  struct dat_lmr *lmr_handle,
> 		  const struct dat_lmr_triplet *lmr_triplet,
> 		  enum dat_mem_priv_flags mem_priv, struct dat_ep *ep,
> 		  DAT_RMR_COOKIE user_cookie,
> @@ -359,20 +351,25 @@
> 		  DAT_RMR_CONTEXT *rmr_context)
> {
> 	struct dapl_rmr *rmr;
> +	struct dapl_lmr *lmr;
> 	struct dapl_ep *ep_ptr;
>
> 	if (!rmr_handle)
> 		return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
>
> +	if (!lmr_handle)
> +		return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_LMR);
> +
> 	if (!ep)
> 		return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
>
> 	rmr = (struct dapl_rmr *)rmr_handle;
> +	lmr = (struct dapl_lmr *)lmr_handle;
> 	ep_ptr = (struct dapl_ep *)ep;
>
> 	/* if the rmr should be bound */
> 	if (0 != lmr_triplet->segment_length)
> -		return dapl_rmr_bind_fuse(rmr, lmr_triplet, mem_priv, ep_ptr,
> +		return dapl_rmr_bind_fuse(rmr, lmr, lmr_triplet, mem_priv, ep_ptr,
> 					  user_cookie, completion_flags,
>                                           rmr_context);
> 	else /* the rmr should be unbound */
> Index: dat-provider/dapl_util.h
> ===================================================================
> --- dat-provider/dapl_util.h	(revision 2608)
> +++ dat-provider/dapl_util.h	(working copy)
> @@ -40,7 +40,6 @@
> #include <asm/types.h>
> #include <asm/atomic.h>
> #include <linux/delay.h>
> -#include <asm/div64.h>		/* needed by hash functions */
>
> #ifdef __ia64__
> #include <asm/atomic.h>
> @@ -120,18 +119,6 @@
> }
>
> /*
> - * String Functions
> - */
> -
> -static inline char *dapl_os_strdup(const char *str)
> -{
> -	char *ns = kmalloc(strlen(str) + 1, GFP_KERNEL);
> -	if (ns)
> -		strcpy(ns, str);
> -	return ns;
> -}
> -
> -/*
>  * *printf format helper. We use the C string constant concatenation
>  * ability to define 64 bit formats, which unfortunatly are non standard
>  * in the C compiler world.
> @@ -143,22 +130,6 @@
> #endif
>
> /*
> - * dapl_os_mod64
> - *
> - * Returne the modulo of a 64 bit number. Given that this is running
> - * on a 32 bit platform, we need to use the kernel macro to prevent
> - * exceptions from killing the machine.
> - */
> -static inline long dapl_os_mod64(uint64_t key, unsigned long hashsize)
> -{
> -#ifdef __ia64__
> -	return ((uint64_t) ((key) % (hashsize)))
> -#else
> -	return do_div(key, hashsize);
> -#endif
> -}
> -
> -/*
>  *  Debug Functions
>  */
>
> Index: dat-provider/dapl_hash.c
> ===================================================================
> --- dat-provider/dapl_hash.c	(revision 2608)
> +++ dat-provider/dapl_hash.c	(working copy)
> @@ -1,461 +0,0 @@
> -/*
> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
> - *
> - * This Software is licensed under one of the following licenses:
> - *
> - * 1) under the terms of the "Common Public License 1.0" a copy of which is
> - *    available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/cpl.php.
> - *
> - * 2) under the terms of the "The BSD License" a copy of which is
> - *    available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/bsd-license.php.
> - *
> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
> - *    copy of which is available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/gpl-license.php.
> - *
> - * Licensee has the right to choose one of the above licenses.
> - *
> - * Redistributions of source code must retain the above copyright
> - * notice and one of the license notices.
> - *
> - * Redistributions in binary form must reproduce both the above copyright
> - * notice, one of the license notices in the documentation
> - * and/or other materials provided with the distribution.
> - */
> -
> -/*
> - * Provides a generic hash table with chaining.
> - *
> - * $Id$
> - */
> -
> -#include "dapl_hash.h"
> -
> -/*********************************************************************
> - *                                                                   *
> - * Structures                                                        *
> - *                                                                   *
> - *********************************************************************/
> -
> -/*
> - * A hash table element
> - */
> -typedef struct DAPL_HASH_ELEM {
> -	struct DAPL_HASH_ELEM *next_element;
> -	DAPL_HASH_KEY key;
> -	void *datum;
> -} DAPL_HASH_ELEM;
> -
> -/*
> - * The hash table
> - */
> -struct dapl_hash_table {
> -	unsigned long num_entries;
> -	unsigned long tbl_size;
> -	DAPL_HASH_ELEM *table;
> -	spinlock_t lock;
> -	unsigned long flags;
> -	/*
> -	 * statistics - we tally on insert operations, counting
> -	 * the number of entries in the whole hash table, as
> -	 * well as the length of chains we walk to insert.  This
> -	 * ignores empty buckets, giving us data on overall table
> -	 * occupancy, as well as max/average chain length for
> -	 * the buckets used.  If our hash function results in
> -	 * hot buckets, this will show it.
> -	 */
> -	uint64_t hash_tbl_inserts;	/* total inserts ops    */
> -	uint64_t hash_tbl_max;	/* max in entire table  */
> -	uint64_t hash_tbl_total;	/* total in table       */
> -	uint64_t hash_chn_max;	/* longest chain        */
> -	uint64_t hash_chn_total;	/* total non-0 lenghts  */
> -};
> -
> -/*********************************************************************
> - *                                                                   *
> - * Defines                                                           *
> - *                                                                   *
> - *********************************************************************/
> -
> -/* datum value in empty table slots  (use 0UL or ~0UL as appropriate) */
> -#define NO_DATUM_VALUE          ((void *) 0UL)
> -#define NO_DATUM(value)         ((value) == NO_DATUM_VALUE)
> -
> -/* Lookup macro (which falls back to function to rehash) */
> -#define DAPL_HASHLOOKUP( p_table, in_key, out_datum, bucket_head) \
> -    do { \
> -        DAPL_HASH_KEY save_key = in_key; \
> -        DAPL_HASH_ELEM *element = \
> -            &((p_table)->table)[DAPL_DOHASH(in_key,(p_table)->tbl_size)]; \
> -        in_key = save_key; \
> -        if (NO_DATUM(element->datum)) { \
> -            (bucket_head) = (void *)0; \
> -        } else if (element->key == (DAPL_HASH_KEY) (in_key)) { \
> -            (out_datum) = element->datum; \
> -            (bucket_head) = (void *)element; \
> -        } else if (element->next_element) { \
> -            dapl_hash_rehash(element, \
> -                            (in_key), \
> -                            (void **)&(out_datum), \
> -                            (DAPL_HASH_ELEM **)&(bucket_head)); \
> -        } else { \
> -            (bucket_head) = (void *)0; \
> -        }\
> -    } while (0)
> -
> -/*********************************************************************
> - *                                                                   *
> - * Internal Functions                                                *
> - *                                                                   *
> - *********************************************************************/
> -
> -/*
> - * Rehash the key (used by add and lookup functions)
> - *
> - * Inputs:  element	element to rehash key
> - *	    key, datum	datum for key head
> - *	    head	head for list
> - */
> -static void
> -dapl_hash_rehash(DAPL_HASH_ELEM * element,
> -		 DAPL_HASH_KEY key, void **datum, DAPL_HASH_ELEM ** head)
> -{
> -	/*
> -	 * assume we looked at the contents of element already,
> -	 * and start with the next element.
> -	 */
> -	dapl_os_assert(element->next_element);
> -	dapl_os_assert(!NO_DATUM(element->datum));
> -
> -	*head = element;
> -	while (1) {
> -		element = element->next_element;
> -		if (!element) {
> -			break;
> -		}
> -		if (element->key == key) {
> -			*datum = element->datum;
> -			return;
> -		}
> -	}
> -	*head = NULL;
> -}
> -
> -/*
> - * Add a new key to the hash table
> - *
> - * Inputs:
> - *          table, key and datum to be added
> - *          allow_dup   - TRUE if dups are allowed
> - * Outputs:
> - *          report_dup  - should you care to know
> - * Returns:
> - *          TRUE on success
> - */
> -static boolean_t
> -dapl_hash_add(struct dapl_hash_table *table, DAPL_HASH_KEY key, void *datum,
> -	      boolean_t allow_dup, boolean_t *report_dup)
> -{
> -	void *olddatum;
> -	DAPL_HASH_KEY hashValue, save_key = key;
> -	DAPL_HASH_ELEM *found;
> -	boolean_t status = FALSE;
> -	unsigned int chain_len = 0;
> -
> -	if (report_dup) {
> -		(*report_dup) = FALSE;
> -	}
> -
> -	if (NO_DATUM(datum)) {
> -		/*
> -		 * Reserved value used for datum
> -		 */
> -		dapl_dbg_log(DAPL_DBG_TYPE_ERR,
> -			     "dapl_hash_add() called with magic NO_DATA "
> -			     "value (%p) used as datum!\n", datum);
> -		return FALSE;
> -	}
> -
> -	DAPL_HASHLOOKUP(table, key, olddatum, found);
> -	if (found) {
> -		/*
> -		 * key exists already
> -		 */
> -		if (report_dup) {
> -			*report_dup = TRUE;
> -		}
> -
> -		if (!allow_dup) {
> -			dapl_dbg_log(DAPL_DBG_TYPE_ERR,
> -				     "dapl_hash_add() called with duplicate "
> -				     "key (" F64x ")\n", key);
> -			return FALSE;
> -		}
> -	}
> -
> -	hashValue = DAPL_DOHASH(key, table->tbl_size);
> -	key = save_key;
> -	if (NO_DATUM(table->table[hashValue].datum)) {
> -		/*
> -		 * Empty head - just fill it in
> -		 */
> -		table->table[hashValue].key = key;
> -		table->table[hashValue].datum = datum;
> -		table->table[hashValue].next_element = NULL;
> -		table->num_entries++;
> -		status = TRUE;
> -	} else {
> -		DAPL_HASH_ELEM *newelement = kmalloc(sizeof *newelement,
> -						     GFP_ATOMIC);
> -		/*
> -		 * Add an element to the end of the chain
> -		 */
> -		if (newelement) {
> -			DAPL_HASH_ELEM *lastelement;
> -			newelement->key = key;
> -			newelement->datum = datum;
> -			newelement->next_element = NULL;
> -			for (lastelement = &table->table[hashValue];
> -			     lastelement->next_element;
> -			     lastelement = lastelement->next_element) {
> -				/* Walk to the end of the chain */
> -				chain_len++;
> -			}
> -			lastelement->next_element = newelement;
> -			table->num_entries++;
> -			status = TRUE;
> -		} else
> -			status = FALSE;
> -	}
> -
> -	/*
> -	 * Tally up our counters. chain_len is one less than current chain
> -	 * length.
> -	 */
> -	chain_len++;
> -	table->hash_tbl_inserts++;
> -	table->hash_tbl_total += table->num_entries;
> -	table->hash_chn_total += chain_len;
> -	if (table->num_entries > table->hash_tbl_max) {
> -		table->hash_tbl_max = table->num_entries;
> -	}
> -	if (chain_len > table->hash_chn_max) {
> -		table->hash_chn_max = chain_len;
> -	}
> -
> -	return status;
> -}
> -
> -/*
> - * Remove element from hash bucket
> - *
> - * Inputs:
> - *          element, key        to be deleted
> - * Returns:
> - *          TRUE on success
> - */
> -static boolean_t
> -dapl_hash_delete_element(DAPL_HASH_ELEM * element,
> -			 DAPL_HASH_KEY key, DAPL_HASH_DATA * p_datum)
> -{
> -	DAPL_HASH_ELEM *curelement;
> -	DAPL_HASH_ELEM *lastelement;
> -
> -	lastelement = NULL;
> -	for (curelement = element;
> -	     curelement;
> -	     lastelement = curelement, curelement = curelement->next_element) {
> -		if (curelement->key == key) {
> -			if (p_datum) {
> -				*p_datum = curelement->datum;
> -			}
> -			if (lastelement) {
> -				/*
> -				 * curelement was malloc'd; free it
> -				 */
> -				lastelement->next_element =
> -				    curelement->next_element;
> -				kfree(curelement);
> -			} else {
> -				/*
> -				 * curelement is static list head
> -				 */
> -				DAPL_HASH_ELEM *n = curelement->next_element;
> -				if (n) {
> -					/*
> -					 * If there is a next element, copy its contents into the
> -					 * head and free the original next element.
> -					 */
> -					curelement->key = n->key;
> -					curelement->datum = n->datum;
> -					curelement->next_element =
> -					    n->next_element;
> -					kfree(n);
> -				} else {
> -					curelement->datum = NO_DATUM_VALUE;
> -				}
> -			}
> -			break;
> -		}
> -	}
> -
> -	return (curelement != NULL ? TRUE : FALSE);
> -}
> -
> -/*********************************************************************
> - *                                                                   *
> - * External Functions                                                *
> - *                                                                   *
> - *********************************************************************/
> -
> -/*
> - * Create a new hash table with at least 'table_size' hash buckets.
> - */
> -u32 dapl_hash_create(int table_size, struct dapl_hash_table **pp_table)
> -{
> -	struct dapl_hash_table *p_table;
> -	int table_length = table_size * sizeof (struct DAPL_HASH_ELEM);
> -	u32 dat_status = DAT_SUCCESS;
> -	int i;
> -
> -	dapl_os_assert(pp_table);
> -
> -	/* Allocate hash table */
> -	p_table = kmalloc(sizeof *p_table, GFP_ATOMIC);
> -	if (!p_table) {
> -		dat_status =
> -		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
> -		goto bail;
> -	}
> -
> -	/* Init hash table, allocate and init and buckets */
> -	memset(p_table, 0, sizeof *p_table);
> -	p_table->tbl_size = table_size;
> -	p_table->table = kmalloc(table_length, GFP_ATOMIC);
> -	if (!p_table->table) {
> -		kfree(p_table);
> -		dat_status =
> -		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
> -		goto bail;
> -	}
> -
> -	spin_lock_init(&p_table->lock);
> -	for (i = 0; i < table_size; i++) {
> -		p_table->table[i].datum = NO_DATUM_VALUE;
> -		p_table->table[i].key = 0;
> -		p_table->table[i].next_element = NULL;
> -	}
> -
> -	*pp_table = p_table;
> -
> -bail:
> -	return DAT_SUCCESS;
> -}
> -
> -/*
> - * Destroy a hash table
> - */
> -u32 dapl_hash_free(struct dapl_hash_table *p_table)
> -{
> -	dapl_os_assert(p_table && p_table->table);
> -
> -	/* no need to destroy p_table->lock */
> -	kfree(p_table->table);
> -	kfree(p_table);
> -
> -	return DAT_SUCCESS;
> -}
> -
> -/*
> - * Returns the number of elements stored in the table
> - */
> -
> -u32 dapl_hash_size(struct dapl_hash_table *p_table, int *p_size)
> -{
> -	dapl_os_assert(p_table && p_size);
> -
> -	*p_size = p_table->num_entries;
> -
> -	return DAT_SUCCESS;
> -}
> -
> -/*
> - * Inserts the specified data into the table with the given key.
> - * Duplicates are not expected, and return in error, having done nothing.
> - */
> -
> -u32 dapl_hash_insert(struct dapl_hash_table *p_table, DAPL_HASH_KEY key,
> -		     DAPL_HASH_DATA data)
> -{
> -	u32 dat_status = DAT_SUCCESS;
> -
> -	dapl_os_assert(p_table);
> -
> -	spin_lock_irqsave(&p_table->lock, p_table->flags);
> -	if (!dapl_hash_add(p_table, key, data, FALSE, NULL)) {
> -		dat_status =
> -		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
> -	}
> -	spin_unlock_irqrestore(&p_table->lock, p_table->flags);
> -
> -	return dat_status;
> -}
> -
> -/*
> - * Searches for the given key.  If found,
> - * DAT_SUCCESS is returned and the associated
> - * data is returned in the DAPL_HASH_DATA
> - * pointer if that pointer is not NULL.
> - */
> -u32 dapl_hash_search(struct dapl_hash_table *p_table, DAPL_HASH_KEY key,
> -		     DAPL_HASH_DATA *p_data)
> -{
> -	u32 dat_status;
> -	void *olddatum;
> -	DAPL_HASH_ELEM *found;
> -
> -	dapl_os_assert(p_table);
> -	dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, 0);
> -
> -	spin_lock_irqsave(&p_table->lock, p_table->flags);
> -	DAPL_HASHLOOKUP(p_table, key, olddatum, found);
> -	spin_unlock_irqrestore(&p_table->lock, p_table->flags);
> -
> -	if (found) {
> -		if (p_data) {
> -			*p_data = olddatum;
> -		}
> -		dat_status = DAT_SUCCESS;
> -	}
> -
> -	return dat_status;
> -}
> -
> -u32 dapl_hash_remove(struct dapl_hash_table *p_table, DAPL_HASH_KEY key,
> -		     DAPL_HASH_DATA *p_data)
> -{
> -	u32 dat_status;
> -	DAPL_HASH_KEY hashValue, save_key = key;
> -
> -	dapl_os_assert(p_table);
> -	dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, 0);
> -
> -	if (p_table->num_entries == 0) {
> -		dapl_dbg_log(DAPL_DBG_TYPE_ERR,
> -			     "dapl_hash_remove () called on empty hash table!\n");
> -		return dat_status;
> -	}
> -
> -	hashValue = DAPL_DOHASH(key, p_table->tbl_size);
> -	key = save_key;
> -	spin_lock_irqsave(&p_table->lock, p_table->flags);
> -	if (dapl_hash_delete_element(&p_table->table[hashValue], key, p_data)) {
> -		p_table->num_entries--;
> -		dat_status = DAT_SUCCESS;
> -	}
> -	spin_unlock_irqrestore(&p_table->lock, p_table->flags);
> -
> -	return dat_status;
> -}
> Index: dat-provider/dapl.h
> ===================================================================
> --- dat-provider/dapl.h	(revision 2608)
> +++ dat-provider/dapl.h	(working copy)
> @@ -83,9 +83,6 @@
>
> typedef void (*ib_async_handler_t) (struct ib_event *, void *);
>
> -typedef u64 DAPL_HASH_KEY;
> -typedef void *DAPL_HASH_DATA;
> -
> /*********************************************************************
>  *                                                                   *
>  * Structures                                                        *
> @@ -124,8 +121,6 @@
>         u8 port_num;
> 	struct ib_device *ib_hca_handle;
> 	struct ib_cq *null_cq; 	/* CQ with 0 entries */
> -	/* Memory Subsystem Support */
> -	struct dapl_hash_table *lmr_hash_table;
> 	/* Limits & useful HCA attributes */
> 	struct dat_ia_attr ia_attr;
> 	struct dat_ep_attr ep_attr;
> @@ -542,6 +537,7 @@
> 			  struct dat_rmr_param *rmr_args);
>
> extern u32 dapl_rmr_bind(struct dat_rmr *rmr,
> +			 struct dat_lmr *lmr,
> 			 const struct dat_lmr_triplet *lmr_triplet,
> 			 enum dat_mem_priv_flags mem_priv,
> 			 struct dat_ep *ep,
> Index: dat-provider/dapl_hash.h
> ===================================================================
> --- dat-provider/dapl_hash.h	(revision 2608)
> +++ dat-provider/dapl_hash.h	(working copy)
> @@ -1,80 +0,0 @@
> -/*
> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
> - *
> - * This Software is licensed under one of the following licenses:
> - *
> - * 1) under the terms of the "Common Public License 1.0" a copy of which is
> - *    available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/cpl.php.
> - *
> - * 2) under the terms of the "The BSD License" a copy of which is
> - *    available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/bsd-license.php.
> - *
> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
> - *    copy of which is available from the Open Source Initiative, see
> - *    http://www.opensource.org/licenses/gpl-license.php.
> - *
> - * Licensee has the right to choose one of the above licenses.
> - *
> - * Redistributions of source code must retain the above copyright
> - * notice and one of the license notices.
> - *
> - * Redistributions in binary form must reproduce both the above copyright
> - * notice, one of the license notices in the documentation
> - * and/or other materials provided with the distribution.
> - */
> -
> -/*
> - * $Id$
> - */
> -
> -#ifndef DAPL_HASH_H
> -#define DAPL_HASH_H
> -
> -#include "dapl.h"
> -
> -/*********************************************************************
> - *                                                                   *
> - * Defines                                                           *
> - *                                                                   *
> - *********************************************************************/
> -
> -/*
> - * Hash table size.
> - *
> - * Default is small; use the larger sample values for hash tables
> - * known to be heavily used.  The sample values chosen are the
> - * largest primes below 2^8, 2^9, and 2^10.
> - */
> -#define DAPL_DEF_HASHSIZE               251
> -#define DAPL_MED_HASHSIZE               509
> -#define DAPL_LRG_HASHSIZE               1021
> -
> -#define DAPL_HASH_TABLE_DEFAULT_CAPACITY DAPL_DEF_HASHSIZE
> -
> -/* The hash function */
> -#define DAPL_DOHASH(key,hashsize) dapl_os_mod64(key,hashsize)
> -
> -/*********************************************************************
> - *                                                                   *
> - * Function Prototypes                                               *
> - *                                                                   *
> - *********************************************************************/
> -
> -extern u32 dapl_hash_create(int capacity, struct dapl_hash_table **pp_table);
> -
> -extern u32 dapl_hash_free(struct dapl_hash_table *p_table);
> -
> -extern u32 dapl_hash_size(struct dapl_hash_table *p_table, int *p_size);
> -
> -extern u32 dapl_hash_insert(struct dapl_hash_table *p_table, DAPL_HASH_KEY key,
> -			    DAPL_HASH_DATA data);
> -
> -extern u32 dapl_hash_search(struct dapl_hash_table *p_table, DAPL_HASH_KEY key,
> -			    DAPL_HASH_DATA *p_data);
> -
> -extern u32 dapl_hash_remove(struct dapl_hash_table *p_table, DAPL_HASH_KEY key,
> -			    DAPL_HASH_DATA *p_data);
> -
> -#endif				/* DAPL_HASH_H */
> Index: dat-provider/dapl_provider.c
> ===================================================================
> --- dat-provider/dapl_provider.c	(revision 2608)
> +++ dat-provider/dapl_provider.c	(working copy)
> @@ -34,7 +34,6 @@
> #include <dat.h>
>
> #include "dapl.h"
> -#include "dapl_hca_util.h"
> #include "dapl_provider.h"
> #include "dapl_util.h"
> #include "dapl_openib_util.h"
> @@ -247,6 +246,23 @@
> 	provider_info->is_thread_safe = DAPL_THREADSAFE;
> }
>
> +struct dapl_hca *dapl_hca_alloc(char *name, struct ib_device *device, u8 port)
> +{
> +	struct dapl_hca *hca;
> +	int malloc_size = sizeof *hca + strlen(name) + 1;
> +	hca = kmalloc(malloc_size, GFP_ATOMIC);
> +	if (hca) {
> +		memset(hca, 0, malloc_size);
> +        spin_lock_init(&hca->lock);
> +   		INIT_LIST_HEAD(&hca->ia_list);
> +        hca->name = (char *)hca + sizeof *hca;
> +		strcpy(hca->name, name);
> +   		hca->ib_hca_handle = device;
> +   		hca->port_num = port;
> +   	}
> +    return hca;
> +}
> +
> static void dapl_add_port(struct ib_device *device, u8 port)
> {
> 	struct dat_provider_info provider_info;
> @@ -306,7 +322,7 @@
> 			(void)dapl_provider_list_remove(provider_info.ia_name);
>
> 		if (NULL != hca)
> -			dapl_hca_free(hca);
> +			kfree(hca);
> 	}
> }
>
> @@ -339,7 +355,7 @@
> 			     provider_info.ia_name);
> 	}
>
> -	dapl_hca_free(provider->extension);
> +	kfree(provider->extension);
>
> 	dapl_provider_list_remove(provider_info.ia_name);
> }
> Index: dat/dat.h
> ===================================================================
> --- dat/dat.h	(revision 2608)
> +++ dat/dat.h	(working copy)
> @@ -1153,7 +1153,8 @@
>
> typedef u32 (*DAT_RMR_QUERY_FUNC)(struct dat_rmr *, struct dat_rmr_param *);
>
> -typedef u32 (*DAT_RMR_BIND_FUNC)(struct dat_rmr *, const struct dat_lmr_triplet *,
> +typedef u32 (*DAT_RMR_BIND_FUNC)(struct dat_rmr *, struct dat_lmr *,
> +				 const struct dat_lmr_triplet *,
> 				 enum dat_mem_priv_flags, struct dat_ep *,
> 				 DAT_RMR_COOKIE, enum dat_completion_flags,
> 				 DAT_RMR_CONTEXT *);
> @@ -1638,14 +1639,15 @@
> }
>
> static inline u32 dat_rmr_bind(struct dat_rmr * rmr,
> -			       const struct dat_lmr_triplet *iov,
> +			       struct dat_lmr *lmr,
> +		 	       const struct dat_lmr_triplet *iov,
> 			       enum dat_mem_priv_flags mem_flags,
> 			       struct dat_ep *ep, DAT_RMR_COOKIE cookie,
> 			       enum dat_completion_flags comp_flags,
> 			       DAT_RMR_CONTEXT *context)
> {
> -        return DAT_CALL_PROVIDER_FUNC(rmr_bind_func, rmr, iov, mem_flags, ep,
> -                                      cookie, comp_flags, context);
> +        return DAT_CALL_PROVIDER_FUNC(rmr_bind_func, rmr, lmr, iov, mem_flags,
> +                                      ep, cookie, comp_flags, context);
> }
>
> static inline u32 dat_rmr_free(struct dat_rmr * rmr)
>
> -- 
> Itamar
>



More information about the general mailing list