[SSI] openssi/kernel/cluster/ssi/util rmtfb.c,1.27,1.28
Roger Tsang <[email protected]> Fri, 05 Mar 2010 06:06:01 +0000
| Newsgroups | gmane.linux.cluster.ssic.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/util
In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv3645/cluster/ssi/util
Modified Files:
Tag: OPENSSI-FC
rmtfb.c
Log Message:
- Double the number of buckets in hash tables rmtfb_svrtbl and rmtfb_clitbl.
Use hlist_head struct. Memory footprint unchanged.
cluster/ssi/util/rmtfb.c | 93 ++++++++++++++++---------------
include/cluster/ssi/util/rmtfb.h | 4 -
2 files changed, 50 insertions(+), 47 deletions(-)
Index: rmtfb.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/util/rmtfb.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- rmtfb.c 5 Mar 2010 05:48:18 -0000 1.27
+++ rmtfb.c 5 Mar 2010 06:05:59 -0000 1.28
@@ -57,10 +57,10 @@
#define RMTFB_MAGIC 0xDEAD2A9E
#define RMTFB_VALID(_rfb) ((_rfb)->rfb_magic == RMTFB_MAGIC)
-#define rmtfb_tbllen (PAGE_SIZE / sizeof(struct list_head))
+#define rmtfb_tbllen (PAGE_SIZE / sizeof(struct hlist_head))
static unsigned int rmtfb_tblbits;
-static struct list_head *rmtfb_svrtbl, *rmtfb_clitbl;
+static struct hlist_head *rmtfb_svrtbl, *rmtfb_clitbl;
#ifdef RMTFB_HASH_LOCKLESS
static __cacheline_aligned_in_smp DEFINE_SPINLOCK(rmtfb_svrtbl_lock);
static __cacheline_aligned_in_smp DEFINE_SPINLOCK(rmtfb_clitbl_lock);
@@ -166,8 +166,8 @@
{
int ctr;
- rmtfb_svrtbl = (struct list_head *)__get_free_page(GFP_KERNEL);
- rmtfb_clitbl = (struct list_head *)__get_free_page(GFP_KERNEL);
+ rmtfb_svrtbl = (typeof(rmtfb_svrtbl)) __get_free_page(GFP_KERNEL);
+ rmtfb_clitbl = (typeof(rmtfb_clitbl)) __get_free_page(GFP_KERNEL);
if (!rmtfb_svrtbl || !rmtfb_clitbl)
panic("rmtfb_init: Out of memory\n");
@@ -180,8 +180,8 @@
#endif
for (ctr = 0; ctr < rmtfb_tbllen; ++ctr) {
- INIT_LIST_HEAD(&rmtfb_svrtbl[ctr]);
- INIT_LIST_HEAD(&rmtfb_clitbl[ctr]);
+ INIT_HLIST_HEAD(&rmtfb_svrtbl[ctr]);
+ INIT_HLIST_HEAD(&rmtfb_clitbl[ctr]);
}
#ifndef RMTFB_HASH_LOCKLESS
@@ -203,7 +203,7 @@
#ifdef SSI_NOTUSED
void
-rmtfb_getids(struct list_head *ids, unsigned long min)
+rmtfb_getids(struct hlist_head *ids, unsigned long min)
{
/* SSI_XXX: need a real implementation when we handle
* wrapping in the unique number server
@@ -345,7 +345,8 @@
rmtfb_tryagain_handle(struct rmtfb_svrhandle **svrhandle, const int error)
{
struct inode *inode = NULL;
- struct list_head *head;
+ struct hlist_head *head;
+ struct hlist_node *pos;
struct rmtfb_cmn *cmn;
int ctr, fixed_ino = 0;
@@ -359,7 +360,7 @@
SSI_ASSERT(*svrhandle);
LOCK_SHR_RW_LOCK(&rmtfb_svrtbl_lock);
for (ctr = 0, head = rmtfb_svrtbl; ctr < rmtfb_tbllen; ++ctr, ++head) {
- list_for_each_entry(cmn, head, rfb_hash) {
+ hlist_for_each_entry(cmn, pos, head, rfb_hash) {
if (cmn->rfb_id == (*svrhandle)->id) {
inode = ftoi(cmn->rfb_file);
/* NB: rfb_id must be unique */
@@ -553,7 +554,7 @@
#else /* RMTFB_HASH_LOCKLESS */
struct rmtfb_clrnode_arg {
clusternode_t node;
- struct list_head *list;
+ struct hlist_head *list;
};
static void
@@ -565,12 +566,15 @@
#ifdef RMTFB_REFCNT_FIX
if (test_bit(ap->node - 1, rfb->rfb_clients)) {
rmtfb_get(rfb);
- list_move(&rfb->common.rfb_hash, ap->list);
+ hlist_del(&rfb->common.rfb_hash);
+ hlist_add_head(&rfb->common.rfb_hash, ap->list);
}
#else
rmtfb_clear_bit(ap->node, rfb);
- if (!atomic_read(&rfb->rfb_refcnt) && rmtfb_nocli(rfb))
- list_move(&rfb->common.rfb_hash, ap->list);
+ if (!atomic_read(&rfb->rfb_refcnt) && rmtfb_nocli(rfb)) {
+ hlist_del(&rfb->common.rfb_hash);
+ hlist_add_head(&rfb->common.rfb_hash, ap->list);
+ }
#endif
}
#endif /* !RMTFB_HASH_LOCKLESS */
@@ -581,22 +585,23 @@
/* also used by the print routines */
static inline void
rmtfb_nodedown_cmn(
- struct list_head *table,
+ struct hlist_head *table,
rmtfb_nodedown_do *do_f,
u_long arg)
{
- struct list_head *head;
- struct rmtfb_cmn *cmn;
+ struct hlist_head *head;
+ struct hlist_node *pos;
#ifndef RMTFB_HASH_LOCKLESS
- struct rmtfb_cmn *next;
+ struct hlist_node *next;
#endif
+ struct rmtfb_cmn *cmn;
int ctr;
for (ctr = 0, head = table; ctr < rmtfb_tbllen; ++ctr, ++head) {
#ifdef RMTFB_HASH_LOCKLESS
rcu_read_lock();
- list_for_each_entry_rcu(cmn, head, rfb_hash) {
+ hlist_for_each_entry_rcu(cmn, pos, head, rfb_hash) {
if (!atomic_test_and_add(1, &cmn->rfb_ref_cnt))
continue;
/* do_f() to decrement rfb_ref_cnt */
@@ -604,7 +609,7 @@
}
rcu_read_unlock();
#else
- list_for_each_entry_safe(cmn, next, head, rfb_hash) {
+ hlist_for_each_entry_safe(cmn, pos, next, head, rfb_hash) {
do_f(cmn, arg);
}
#endif /* !RMTFB_HASH_LOCKLESS */
@@ -621,11 +626,11 @@
{
#ifndef RMTFB_HASH_LOCKLESS
#ifdef RMTFB_REFCNT_FIX
- struct rmtfb_svr *rfb, *tmp;
-#else
- struct list_head *cur;
+ struct rmtfb_svr *rfb;
+ struct hlist_node *tmp;
#endif
- LIST_HEAD(freelist);
+ struct hlist_node *cur;
+ HLIST_HEAD(freelist);
struct rmtfb_clrnode_arg rca;
#endif /* !RMTFB_HASH_LOCKLESS */
@@ -648,14 +653,14 @@
UNLOCK_EXCL_RW_LOCK(&rmtfb_svrtbl_lock);
#ifdef RMTFB_REFCNT_FIX
- list_for_each_entry_safe(rfb, tmp, &freelist, common.rfb_hash) {
+ hlist_for_each_entry_safe(rfb, cur, tmp, &freelist, common.rfb_hash) {
rmtfb_clear_bit(node, rfb);
rmtfb_putsvr(rfb);
}
#else
- list_for_each(cur, &freelist) {
+ hlist_for_each(cur, &freelist) {
struct rmtfb_svr *rfb = (struct rmtfb_svr *)
- list_entry(cur, struct rmtfb_cmn, rfb_hash);
+ hlist_entry(cur, struct rmtfb_cmn, rfb_hash);
rmtfb_freesvr(rfb);
}
#endif /* !RMTFB_REFCNT_FIX */
@@ -687,16 +692,17 @@
/* common lookup -- assumes the appropriate table is at least read-locked */
static struct rmtfb_cmn *
rmtfb_getcmn(
- struct list_head *head,
+ struct hlist_head *head,
rmtfb_test *test,
void *data)
{
struct rmtfb_cmn *cmn;
+ struct hlist_node *pos;
#ifdef RMTFB_HASH_LOCKLESS
char found = 0;
rcu_read_lock();
- list_for_each_entry_rcu(cmn, head, rfb_hash) {
+ hlist_for_each_entry_rcu(cmn, pos, head, rfb_hash) {
if (!test(cmn, data))
continue;
if (!atomic_test_and_add(1, &cmn->rfb_ref_cnt))
@@ -707,7 +713,7 @@
rcu_read_unlock();
return found ? cmn : NULL;
#else
- list_for_each_entry(cmn, head, rfb_hash) {
+ hlist_for_each_entry(cmn, pos, head, rfb_hash) {
if (test(cmn, data))
return cmn;
}
@@ -871,7 +877,7 @@
SSI_ASSERT(atomic_read(&rfb->rfb_refcnt));
LOCK_EXCL_RW_LOCK(&rmtfb_svrtbl_lock);
if (atomic_dec_and_test(&rfb->rfb_refcnt) && rmtfb_nocli(rfb)) {
- list_del(&rfb->common.rfb_hash);
+ hlist_del(&rfb->common.rfb_hash);
UNLOCK_EXCL_RW_LOCK(&rmtfb_svrtbl_lock);
rmtfb_freesvr(rfb);
}
@@ -884,7 +890,7 @@
#ifdef RMTFB_HASH_LOCKLESS
if (!atomic_dec_and_lock(&rfb->rfb_refcnt, &rmtfb_svrtbl_lock))
return;
- list_del_rcu(&rfb->common.rfb_hash);
+ hlist_del_rcu(&rfb->common.rfb_hash);
spin_unlock(&rmtfb_svrtbl_lock);
#else
LOCK_EXCL_RW_LOCK(&rmtfb_svrtbl_lock);
@@ -892,7 +898,7 @@
UNLOCK_EXCL_RW_LOCK(&rmtfb_svrtbl_lock);
return;
}
- list_del(&rfb->common.rfb_hash);
+ hlist_del(&rfb->common.rfb_hash);
UNLOCK_EXCL_RW_LOCK(&rmtfb_svrtbl_lock);
#endif /* !RMTFB_HASH_LOCKLESS */
rmtfb_freesvr(rfb);
@@ -1095,7 +1101,7 @@
#ifdef RMTFB_HASH_LOCKLESS
if (!atomic_dec_and_lock(&rfb->rfb_refcnt, &rmtfb_clitbl_lock))
return;
- list_del_rcu(&rfb->common.rfb_hash);
+ hlist_del_rcu(&rfb->common.rfb_hash);
spin_unlock(&rmtfb_clitbl_lock);
#else
LOCK_EXCL_RW_LOCK(&rmtfb_clitbl_lock);
@@ -1103,7 +1109,7 @@
UNLOCK_EXCL_RW_LOCK(&rmtfb_clitbl_lock);
return;
}
- list_del(&rfb->common.rfb_hash);
+ hlist_del(&rfb->common.rfb_hash);
UNLOCK_EXCL_RW_LOCK(&rmtfb_clitbl_lock);
#endif /* !RMTFB_HASH_LOCKLESS */
rmtfb_freecli(rfb);
@@ -1123,7 +1129,7 @@
if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
SLAB_CTOR_CONSTRUCTOR) {
- INIT_LIST_HEAD(&cmn->rfb_hash);
+ INIT_HLIST_NODE(&cmn->rfb_hash);
INIT_RCU_HEAD(&cmn->rfb_rcu);
}
}
@@ -1145,10 +1151,7 @@
static inline void
rmtfb_new_prep(struct rmtfb_cmn *cmn, struct file *file, unsigned long id)
{
-#if 0
- INIT_LIST_HEAD(&cmn->rfb_hash);
- get_file(file); /* done in caller */
-#endif
+ /* Skipped get_file(); done in caller */
cmn->rfb_file = file;
cmn->rfb_id = id ? : unum_getnum(unum_rmtfbid);
atomic_set(&cmn->rfb_ref_cnt, 1);
@@ -1196,7 +1199,7 @@
if (!cmn)
return NULL;
- INIT_LIST_HEAD(&cmn->rfb_hash);
+ INIT_HLIST_NODE(&cmn->rfb_hash);
cmn->rfb_file = file; /* Client to grab reference to file struct */
cmn->rfb_id = id ? id : unum_getnum(unum_rmtfbid);
return cmn;
@@ -1236,7 +1239,7 @@
}
spin_lock(&rmtfb_svrtbl_lock);
- list_add_rcu(&rfb->common.rfb_hash, &rmtfb_svrtbl[rfbhash(ino)]);
+ hlist_add_head_rcu(&rfb->common.rfb_hash, &rmtfb_svrtbl[rfbhash(ino)]);
spin_unlock(&rmtfb_svrtbl_lock);
up(&rmtfb_newsvr_lock);
out:
@@ -1288,7 +1291,7 @@
#ifndef RMTFB_REFCNT_FIX
get_file(file);
#endif
- list_add(&rfb->common.rfb_hash, &rmtfb_svrtbl[rfbhash(ino)]);
+ hlist_add_head(&rfb->common.rfb_hash, &rmtfb_svrtbl[rfbhash(ino)]);
UNLOCK_EXCL_RW_LOCK(&rmtfb_svrtbl_lock);
out:
#ifdef RFBDEBUG
@@ -1435,7 +1438,7 @@
*/
spin_lock(&rmtfb_clitbl_lock);
- list_add_rcu(&rfb->common.rfb_hash, &rmtfb_clitbl[rfbhash(id)]);
+ hlist_add_head_rcu(&rfb->common.rfb_hash, &rmtfb_clitbl[rfbhash(id)]);
spin_unlock(&rmtfb_clitbl_lock);
up(&rmtfb_newcli_lock);
out:
@@ -1539,7 +1542,7 @@
*/
rmtfb_get(rfb); /* for file->private_data */
#endif
- list_add(&rfb->common.rfb_hash, &rmtfb_clitbl[rfbhash(id)]);
+ hlist_add_head(&rfb->common.rfb_hash, &rmtfb_clitbl[rfbhash(id)]);
SSI_ASSERT(ftocli(file) == rfb);
/* Skipped get_file(file) due to circular reference.
* file->private_data->common.rfb_file == file
@@ -1631,7 +1634,7 @@
file->private_data = NULL;
#else
LOCK_EXCL_RW_LOCK(&rmtfb_clitbl_lock);
- list_del(&rfb->common.rfb_hash);
+ hlist_del(&rfb->common.rfb_hash);
UNLOCK_EXCL_RW_LOCK(&rmtfb_clitbl_lock);
rfb->rfb_magic = 0;
kfree(rfb);
------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev