From: David Teigland <teigland@redhat.com>
To: akpm@osdl.org
Cc: linux-kernel@vger.kernel.org
Subject: [patch 05/12] dlm: rsb flag ops with inlined functions
Date: Fri, 15 Jul 2005 18:36:23 +0800 [thread overview]
Message-ID: <20050715103623.GH17316@redhat.com> (raw)
[-- Attachment #1: rsb-flags.patch --]
[-- Type: text/plain, Size: 10307 bytes --]
Replace test/set/clear_bit of rsb flags with new inline functions that use
the less expense non-atomic bit ops.
Signed-off-by: David Teigland <teigland@redhat.com>
Index: linux-2.6.12-mm1/drivers/dlm/debug_fs.c
===================================================================
--- linux-2.6.12-mm1.orig/drivers/dlm/debug_fs.c
+++ linux-2.6.12-mm1/drivers/dlm/debug_fs.c
@@ -114,7 +114,7 @@ static int print_resource(struct dlm_rsb
seq_printf(s, "%02x ",
(unsigned char) res->res_lvbptr[i]);
}
- if (test_bit(RESFL_VALNOTVALID, &res->res_flags))
+ if (rsb_flag(res, RSB_VALNOTVALID))
seq_printf(s, " (INVALID)");
seq_printf(s, "\n");
}
Index: linux-2.6.12-mm1/drivers/dlm/dlm_internal.h
===================================================================
--- linux-2.6.12-mm1.orig/drivers/dlm/dlm_internal.h
+++ linux-2.6.12-mm1/drivers/dlm/dlm_internal.h
@@ -262,25 +262,11 @@ struct dlm_lkb {
long lkb_astparam; /* caller's ast arg */
};
-
-/* find_rsb() flags */
-
-#define R_MASTER 1 /* only return rsb if it's a master */
-#define R_CREATE 2 /* create/add rsb if not found */
-
-#define RESFL_MASTER_WAIT 0
-#define RESFL_MASTER_UNCERTAIN 1
-#define RESFL_VALNOTVALID 2
-#define RESFL_VALNOTVALID_PREV 3
-#define RESFL_NEW_MASTER 4
-#define RESFL_NEW_MASTER2 5
-#define RESFL_RECOVER_CONVERT 6
-
struct dlm_rsb {
struct dlm_ls *res_ls; /* the lockspace */
struct kref res_ref;
struct semaphore res_sem;
- unsigned long res_flags; /* RESFL_ */
+ unsigned long res_flags;
int res_length; /* length of rsb name */
int res_nodeid;
uint32_t res_lvbseq;
@@ -301,6 +287,38 @@ struct dlm_rsb {
char res_name[1];
};
+/* find_rsb() flags */
+
+#define R_MASTER 1 /* only return rsb if it's a master */
+#define R_CREATE 2 /* create/add rsb if not found */
+
+/* rsb_flags */
+
+enum rsb_flags {
+ RSB_MASTER_WAIT,
+ RSB_MASTER_UNCERTAIN,
+ RSB_VALNOTVALID,
+ RSB_VALNOTVALID_PREV,
+ RSB_NEW_MASTER,
+ RSB_NEW_MASTER2,
+ RSB_RECOVER_CONVERT,
+};
+
+static inline void rsb_set_flag(struct dlm_rsb *r, enum rsb_flags flag)
+{
+ __set_bit(flag, &r->res_flags);
+}
+
+static inline void rsb_clear_flag(struct dlm_rsb *r, enum rsb_flags flag)
+{
+ __clear_bit(flag, &r->res_flags);
+}
+
+static inline int rsb_flag(struct dlm_rsb *r, enum rsb_flags flag)
+{
+ return test_bit(flag, &r->res_flags);
+}
+
/* dlm_header is first element of all structs sent between nodes */
Index: linux-2.6.12-mm1/drivers/dlm/lock.c
===================================================================
--- linux-2.6.12-mm1.orig/drivers/dlm/lock.c
+++ linux-2.6.12-mm1/drivers/dlm/lock.c
@@ -317,18 +317,17 @@ static int _search_rsb(struct dlm_ls *ls
list_move(&r->res_hashchain, &ls->ls_rsbtbl[b].list);
if (r->res_nodeid == -1) {
- clear_bit(RESFL_MASTER_WAIT, &r->res_flags);
- clear_bit(RESFL_MASTER_UNCERTAIN, &r->res_flags);
+ rsb_clear_flag(r, RSB_MASTER_WAIT);
+ rsb_clear_flag(r, RSB_MASTER_UNCERTAIN);
r->res_trial_lkid = 0;
} else if (r->res_nodeid > 0) {
- clear_bit(RESFL_MASTER_WAIT, &r->res_flags);
- set_bit(RESFL_MASTER_UNCERTAIN, &r->res_flags);
+ rsb_clear_flag(r, RSB_MASTER_WAIT);
+ rsb_set_flag(r, RSB_MASTER_UNCERTAIN);
r->res_trial_lkid = 0;
} else {
DLM_ASSERT(r->res_nodeid == 0, dlm_print_rsb(r););
- DLM_ASSERT(!test_bit(RESFL_MASTER_WAIT, &r->res_flags),
- dlm_print_rsb(r););
- DLM_ASSERT(!test_bit(RESFL_MASTER_UNCERTAIN, &r->res_flags),);
+ DLM_ASSERT(!rsb_flag(r, RSB_MASTER_WAIT), dlm_print_rsb(r););
+ DLM_ASSERT(!rsb_flag(r, RSB_MASTER_UNCERTAIN),);
}
out:
*r_ret = r;
@@ -837,7 +836,7 @@ static void set_lvb_lock(struct dlm_rsb
} else if (b == 0) {
if (lkb->lkb_exflags & DLM_LKF_IVVALBLK) {
- set_bit(RESFL_VALNOTVALID, &r->res_flags);
+ rsb_set_flag(r, RSB_VALNOTVALID);
return;
}
@@ -856,10 +855,10 @@ static void set_lvb_lock(struct dlm_rsb
memcpy(r->res_lvbptr, lkb->lkb_lvbptr, len);
r->res_lvbseq++;
lkb->lkb_lvbseq = r->res_lvbseq;
- clear_bit(RESFL_VALNOTVALID, &r->res_flags);
+ rsb_clear_flag(r, RSB_VALNOTVALID);
}
- if (test_bit(RESFL_VALNOTVALID, &r->res_flags))
+ if (rsb_flag(r, RSB_VALNOTVALID))
lkb->lkb_sbflags |= DLM_SBF_VALNOTVALID;
}
@@ -869,7 +868,7 @@ static void set_lvb_unlock(struct dlm_rs
return;
if (lkb->lkb_exflags & DLM_LKF_IVVALBLK) {
- set_bit(RESFL_VALNOTVALID, &r->res_flags);
+ rsb_set_flag(r, RSB_VALNOTVALID);
return;
}
@@ -887,7 +886,7 @@ static void set_lvb_unlock(struct dlm_rs
memcpy(r->res_lvbptr, lkb->lkb_lvbptr, r->res_ls->ls_lvblen);
r->res_lvbseq++;
- clear_bit(RESFL_VALNOTVALID, &r->res_flags);
+ rsb_clear_flag(r, RSB_VALNOTVALID);
}
/* lkb is process copy (pc) */
@@ -1419,8 +1418,9 @@ static int set_master(struct dlm_rsb *r,
struct dlm_ls *ls = r->res_ls;
int error, dir_nodeid, ret_nodeid, our_nodeid = dlm_our_nodeid();
- if (test_and_clear_bit(RESFL_MASTER_UNCERTAIN, &r->res_flags)) {
- set_bit(RESFL_MASTER_WAIT, &r->res_flags);
+ if (rsb_flag(r, RSB_MASTER_UNCERTAIN)) {
+ rsb_clear_flag(r, RSB_MASTER_UNCERTAIN);
+ rsb_set_flag(r, RSB_MASTER_WAIT);
r->res_trial_lkid = lkb->lkb_id;
lkb->lkb_nodeid = r->res_nodeid;
return 0;
@@ -1437,7 +1437,7 @@ static int set_master(struct dlm_rsb *r,
return 0;
}
- if (test_bit(RESFL_MASTER_WAIT, &r->res_flags)) {
+ if (rsb_flag(r, RSB_MASTER_WAIT)) {
list_add_tail(&lkb->lkb_rsb_lookup, &r->res_lookup);
return 1;
}
@@ -1455,7 +1455,7 @@ static int set_master(struct dlm_rsb *r,
dir_nodeid = dlm_dir_nodeid(r);
if (dir_nodeid != our_nodeid) {
- set_bit(RESFL_MASTER_WAIT, &r->res_flags);
+ rsb_set_flag(r, RSB_MASTER_WAIT);
send_lookup(r, lkb);
return 1;
}
@@ -1481,7 +1481,7 @@ static int set_master(struct dlm_rsb *r,
return 0;
}
- set_bit(RESFL_MASTER_WAIT, &r->res_flags);
+ rsb_set_flag(r, RSB_MASTER_WAIT);
r->res_trial_lkid = lkb->lkb_id;
r->res_nodeid = ret_nodeid;
lkb->lkb_nodeid = ret_nodeid;
@@ -1503,7 +1503,7 @@ static void confirm_master(struct dlm_rs
{
struct dlm_lkb *lkb, *safe;
- if (!test_bit(RESFL_MASTER_WAIT, &r->res_flags))
+ if (!rsb_flag(r, RSB_MASTER_WAIT))
return;
switch (error) {
@@ -1512,7 +1512,7 @@ static void confirm_master(struct dlm_rs
/* the remote master queued our request, or
the remote dir node told us we're the master */
- clear_bit(RESFL_MASTER_WAIT, &r->res_flags);
+ rsb_clear_flag(r, RSB_MASTER_WAIT);
r->res_trial_lkid = 0;
list_for_each_entry_safe(lkb, safe, &r->res_lookup,
@@ -1544,7 +1544,7 @@ static void confirm_master(struct dlm_rs
r->res_nodeid = -1;
r->res_trial_lkid = 0;
- clear_bit(RESFL_MASTER_WAIT, &r->res_flags);
+ rsb_clear_flag(r, RSB_MASTER_WAIT);
break;
default:
@@ -2830,7 +2830,7 @@ static void receive_request_reply(struct
case -ENOTBLK:
/* find_rsb failed to find rsb or rsb wasn't master */
- DLM_ASSERT(test_bit(RESFL_MASTER_WAIT, &r->res_flags),
+ DLM_ASSERT(rsb_flag(r, RSB_MASTER_WAIT),
log_print("receive_request_reply error %d", error);
dlm_print_lkb(lkb);
dlm_print_rsb(r););
@@ -3188,7 +3188,7 @@ static void recover_convert_waiter(struc
/* Same special case as in receive_rcom_lock_args() */
lkb->lkb_grmode = DLM_LOCK_IV;
- set_bit(RESFL_RECOVER_CONVERT, &lkb->lkb_resource->res_flags);
+ rsb_set_flag(lkb->lkb_resource, RSB_RECOVER_CONVERT);
unhold_lkb(lkb);
} else if (lkb->lkb_rqmode >= lkb->lkb_grmode) {
@@ -3482,7 +3482,7 @@ static int receive_rcom_lock_args(struct
if (rl->rl_wait_type == DLM_MSG_CONVERT && middle_conversion(lkb)) {
rl->rl_status = DLM_LKSTS_CONVERT;
lkb->lkb_grmode = DLM_LOCK_IV;
- set_bit(RESFL_RECOVER_CONVERT, &r->res_flags);
+ rsb_set_flag(r, RSB_RECOVER_CONVERT);
}
return 0;
Index: linux-2.6.12-mm1/drivers/dlm/recover.c
===================================================================
--- linux-2.6.12-mm1.orig/drivers/dlm/recover.c
+++ linux-2.6.12-mm1/drivers/dlm/recover.c
@@ -309,8 +309,8 @@ static void set_new_master(struct dlm_rs
set_master_lkbs(r);
- set_bit(RESFL_NEW_MASTER, &r->res_flags);
- set_bit(RESFL_NEW_MASTER2, &r->res_flags);
+ rsb_set_flag(r, RSB_NEW_MASTER);
+ rsb_set_flag(r, RSB_NEW_MASTER2);
unlock_rsb(r);
}
@@ -487,11 +487,11 @@ int dlm_recover_locks(struct dlm_ls *ls)
down_read(&ls->ls_root_sem);
list_for_each_entry(r, &ls->ls_root_list, res_root_list) {
if (is_master(r)) {
- clear_bit(RESFL_NEW_MASTER, &r->res_flags);
+ rsb_clear_flag(r, RSB_NEW_MASTER);
continue;
}
- if (!test_bit(RESFL_NEW_MASTER, &r->res_flags))
+ if (!rsb_flag(r, RSB_NEW_MASTER))
continue;
error = dlm_recovery_stopped(ls);
@@ -525,7 +525,7 @@ void dlm_recovered_lock(struct dlm_rsb *
{
r->res_recover_locks_count--;
if (!r->res_recover_locks_count) {
- clear_bit(RESFL_NEW_MASTER, &r->res_flags);
+ rsb_clear_flag(r, RSB_NEW_MASTER);
recover_list_del(r);
}
@@ -538,7 +538,7 @@ void dlm_recovered_lock(struct dlm_rsb *
* the VALNOTVALID flag if necessary, and determining the correct lvb contents
* based on the lvb's of the locks held on the rsb.
*
- * RESFL_VALNOTVALID is set if there are only NL/CR locks on the rsb. If it
+ * RSB_VALNOTVALID is set if there are only NL/CR locks on the rsb. If it
* was already set prior to recovery, it's not cleared, regardless of locks.
*
* The LVB contents are only considered for changing when this is a new master
@@ -594,10 +594,10 @@ static void recover_lvb(struct dlm_rsb *
goto out;
if (!big_lock_exists)
- set_bit(RESFL_VALNOTVALID, &r->res_flags);
+ rsb_set_flag(r, RSB_VALNOTVALID);
/* don't mess with the lvb unless we're the new master */
- if (!test_bit(RESFL_NEW_MASTER2, &r->res_flags))
+ if (!rsb_flag(r, RSB_NEW_MASTER2))
goto out;
if (!r->res_lvbptr) {
@@ -657,12 +657,12 @@ void dlm_recover_rsbs(struct dlm_ls *ls)
list_for_each_entry(r, &ls->ls_root_list, res_root_list) {
lock_rsb(r);
if (is_master(r)) {
- if (test_bit(RESFL_RECOVER_CONVERT, &r->res_flags))
+ if (rsb_flag(r, RSB_RECOVER_CONVERT))
recover_conversion(r);
recover_lvb(r);
count++;
}
- clear_bit(RESFL_RECOVER_CONVERT, &r->res_flags);
+ rsb_clear_flag(r, RSB_RECOVER_CONVERT);
unlock_rsb(r);
}
up_read(&ls->ls_root_sem);
--
reply other threads:[~2005-07-15 10:34 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050715103623.GH17316@redhat.com \
--to=teigland@redhat.com \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.