提交 41d7db0a 编写于 作者: S Steven Whitehouse

[GFS2] Reduce size of struct gdlm_lock

This patch removes the completion (which is rather large) from struct
gdlm_lock in favour of using the wait_on_bit() functions. We don't need
to add any extra fields to the structure to do this, so we save 32 bytes
(on x86_64) per structure. This adds up to quite a lot when we may
potentially have millions of these lock structures,
Signed-off-by: NSteven Whitehouse <swhiteho@redhat.com>
Acked-by: NDavid Teigland <teigland@redhat.com>
上级 cd81a4ba
...@@ -174,7 +174,6 @@ static int gdlm_create_lp(struct gdlm_ls *ls, struct lm_lockname *name, ...@@ -174,7 +174,6 @@ static int gdlm_create_lp(struct gdlm_ls *ls, struct lm_lockname *name,
lp->cur = DLM_LOCK_IV; lp->cur = DLM_LOCK_IV;
lp->lvb = NULL; lp->lvb = NULL;
lp->hold_null = NULL; lp->hold_null = NULL;
init_completion(&lp->ast_wait);
INIT_LIST_HEAD(&lp->clist); INIT_LIST_HEAD(&lp->clist);
INIT_LIST_HEAD(&lp->blist); INIT_LIST_HEAD(&lp->blist);
INIT_LIST_HEAD(&lp->delay_list); INIT_LIST_HEAD(&lp->delay_list);
...@@ -399,6 +398,12 @@ static void gdlm_del_lvb(struct gdlm_lock *lp) ...@@ -399,6 +398,12 @@ static void gdlm_del_lvb(struct gdlm_lock *lp)
lp->lksb.sb_lvbptr = NULL; lp->lksb.sb_lvbptr = NULL;
} }
static int gdlm_ast_wait(void *word)
{
schedule();
return 0;
}
/* This can do a synchronous dlm request (requiring a lock_dlm thread to get /* This can do a synchronous dlm request (requiring a lock_dlm thread to get
the completion) because gfs won't call hold_lvb() during a callback (from the completion) because gfs won't call hold_lvb() during a callback (from
the context of a lock_dlm thread). */ the context of a lock_dlm thread). */
...@@ -424,10 +429,10 @@ static int hold_null_lock(struct gdlm_lock *lp) ...@@ -424,10 +429,10 @@ static int hold_null_lock(struct gdlm_lock *lp)
lpn->lkf = DLM_LKF_VALBLK | DLM_LKF_EXPEDITE; lpn->lkf = DLM_LKF_VALBLK | DLM_LKF_EXPEDITE;
set_bit(LFL_NOBAST, &lpn->flags); set_bit(LFL_NOBAST, &lpn->flags);
set_bit(LFL_INLOCK, &lpn->flags); set_bit(LFL_INLOCK, &lpn->flags);
set_bit(LFL_AST_WAIT, &lpn->flags);
init_completion(&lpn->ast_wait);
gdlm_do_lock(lpn); gdlm_do_lock(lpn);
wait_for_completion(&lpn->ast_wait); wait_on_bit(&lpn->flags, LFL_AST_WAIT, gdlm_ast_wait, TASK_UNINTERRUPTIBLE);
error = lpn->lksb.sb_status; error = lpn->lksb.sb_status;
if (error) { if (error) {
printk(KERN_INFO "lock_dlm: hold_null_lock dlm error %d\n", printk(KERN_INFO "lock_dlm: hold_null_lock dlm error %d\n",
......
...@@ -101,6 +101,7 @@ enum { ...@@ -101,6 +101,7 @@ enum {
LFL_NOBAST = 10, LFL_NOBAST = 10,
LFL_HEADQUE = 11, LFL_HEADQUE = 11,
LFL_UNLOCK_DELETE = 12, LFL_UNLOCK_DELETE = 12,
LFL_AST_WAIT = 13,
}; };
struct gdlm_lock { struct gdlm_lock {
...@@ -117,7 +118,6 @@ struct gdlm_lock { ...@@ -117,7 +118,6 @@ struct gdlm_lock {
unsigned long flags; /* lock_dlm flags LFL_ */ unsigned long flags; /* lock_dlm flags LFL_ */
int bast_mode; /* protected by async_lock */ int bast_mode; /* protected by async_lock */
struct completion ast_wait;
struct list_head clist; /* complete */ struct list_head clist; /* complete */
struct list_head blist; /* blocking */ struct list_head blist; /* blocking */
......
...@@ -44,6 +44,13 @@ static void process_blocking(struct gdlm_lock *lp, int bast_mode) ...@@ -44,6 +44,13 @@ static void process_blocking(struct gdlm_lock *lp, int bast_mode)
ls->fscb(ls->sdp, cb, &lp->lockname); ls->fscb(ls->sdp, cb, &lp->lockname);
} }
static void wake_up_ast(struct gdlm_lock *lp)
{
clear_bit(LFL_AST_WAIT, &lp->flags);
smp_mb__after_clear_bit();
wake_up_bit(&lp->flags, LFL_AST_WAIT);
}
static void process_complete(struct gdlm_lock *lp) static void process_complete(struct gdlm_lock *lp)
{ {
struct gdlm_ls *ls = lp->ls; struct gdlm_ls *ls = lp->ls;
...@@ -136,7 +143,7 @@ static void process_complete(struct gdlm_lock *lp) ...@@ -136,7 +143,7 @@ static void process_complete(struct gdlm_lock *lp)
*/ */
if (test_and_clear_bit(LFL_SYNC_LVB, &lp->flags)) { if (test_and_clear_bit(LFL_SYNC_LVB, &lp->flags)) {
complete(&lp->ast_wait); wake_up_ast(lp);
return; return;
} }
...@@ -214,7 +221,7 @@ static void process_complete(struct gdlm_lock *lp) ...@@ -214,7 +221,7 @@ static void process_complete(struct gdlm_lock *lp)
if (test_bit(LFL_INLOCK, &lp->flags)) { if (test_bit(LFL_INLOCK, &lp->flags)) {
clear_bit(LFL_NOBLOCK, &lp->flags); clear_bit(LFL_NOBLOCK, &lp->flags);
lp->cur = lp->req; lp->cur = lp->req;
complete(&lp->ast_wait); wake_up_ast(lp);
return; return;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册