[openib-general] [PATCH][kdapl]update dat_rmr_bind API & delete dapl_hash
Rabenstein Itamar
itamar at mellanox.co.il
Wed Jun 15 06:34:03 PDT 2005
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