dlm: remove callback reference counting
Get rid of the unnecessary refcounting on callback structs. Copy interesting callback info into the lkb struct rather than maintaining pointers to callback structs from the lkb. This goes back to the way things were done prior to commit 61bed0baa4db ("fs: dlm: use a non-static queue for callbacks"). Signed-off-by: Alexander Aring <aahringo@redhat.com> Signed-off-by: David Teigland <teigland@redhat.com>
This commit is contained in:
parent
986ae3c2a8
commit
2bec1bbd55
56
fs/dlm/ast.c
56
fs/dlm/ast.c
@ -18,25 +18,6 @@
|
||||
#include "user.h"
|
||||
#include "ast.h"
|
||||
|
||||
void dlm_release_callback(struct kref *ref)
|
||||
{
|
||||
struct dlm_callback *cb = container_of(ref, struct dlm_callback, ref);
|
||||
|
||||
dlm_free_cb(cb);
|
||||
}
|
||||
|
||||
void dlm_callback_set_last_ptr(struct dlm_callback **from,
|
||||
struct dlm_callback *to)
|
||||
{
|
||||
if (*from)
|
||||
kref_put(&(*from)->ref, dlm_release_callback);
|
||||
|
||||
if (to)
|
||||
kref_get(&to->ref);
|
||||
|
||||
*from = to;
|
||||
}
|
||||
|
||||
static void dlm_callback_work(struct work_struct *work)
|
||||
{
|
||||
struct dlm_callback *cb = container_of(work, struct dlm_callback, work);
|
||||
@ -53,7 +34,7 @@ static void dlm_callback_work(struct work_struct *work)
|
||||
cb->astfn(cb->astparam);
|
||||
}
|
||||
|
||||
kref_put(&cb->ref, dlm_release_callback);
|
||||
dlm_free_cb(cb);
|
||||
}
|
||||
|
||||
int dlm_queue_lkb_callback(struct dlm_lkb *lkb, uint32_t flags, int mode,
|
||||
@ -70,11 +51,11 @@ int dlm_queue_lkb_callback(struct dlm_lkb *lkb, uint32_t flags, int mode,
|
||||
/* if cb is a bast, it should be skipped if the blocking mode is
|
||||
* compatible with the last granted mode
|
||||
*/
|
||||
if (lkb->lkb_last_cast) {
|
||||
if (dlm_modes_compat(mode, lkb->lkb_last_cast->mode)) {
|
||||
if (lkb->lkb_last_cast_cb_mode != -1) {
|
||||
if (dlm_modes_compat(mode, lkb->lkb_last_cast_cb_mode)) {
|
||||
log_debug(ls, "skip %x bast mode %d for cast mode %d",
|
||||
lkb->lkb_id, mode,
|
||||
lkb->lkb_last_cast->mode);
|
||||
lkb->lkb_last_cast_cb_mode);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@ -85,8 +66,9 @@ int dlm_queue_lkb_callback(struct dlm_lkb *lkb, uint32_t flags, int mode,
|
||||
* is a bast for the same mode or a more restrictive mode.
|
||||
* (the addional > PR check is needed for PR/CW inversion)
|
||||
*/
|
||||
if (lkb->lkb_last_cb && lkb->lkb_last_cb->flags & DLM_CB_BAST) {
|
||||
prev_mode = lkb->lkb_last_cb->mode;
|
||||
if (lkb->lkb_last_cb_mode != -1 &&
|
||||
lkb->lkb_last_cb_flags & DLM_CB_BAST) {
|
||||
prev_mode = lkb->lkb_last_cb_mode;
|
||||
|
||||
if ((prev_mode == mode) ||
|
||||
(prev_mode > mode && prev_mode > DLM_LOCK_PR)) {
|
||||
@ -95,19 +77,25 @@ int dlm_queue_lkb_callback(struct dlm_lkb *lkb, uint32_t flags, int mode,
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
lkb->lkb_last_bast_time = ktime_get();
|
||||
lkb->lkb_last_bast_cb_mode = mode;
|
||||
} else if (flags & DLM_CB_CAST) {
|
||||
if (test_bit(DLM_DFL_USER_BIT, &lkb->lkb_dflags)) {
|
||||
if (lkb->lkb_last_cast)
|
||||
prev_mode = lkb->lkb_last_cb->mode;
|
||||
else
|
||||
prev_mode = -1;
|
||||
prev_mode = lkb->lkb_last_cast_cb_mode;
|
||||
|
||||
if (!status && lkb->lkb_lksb->sb_lvbptr &&
|
||||
dlm_lvb_operations[prev_mode + 1][mode + 1])
|
||||
copy_lvb = 1;
|
||||
}
|
||||
|
||||
lkb->lkb_last_cast_cb_mode = mode;
|
||||
lkb->lkb_last_cast_time = ktime_get();
|
||||
}
|
||||
|
||||
lkb->lkb_last_cb_mode = mode;
|
||||
lkb->lkb_last_cb_flags = flags;
|
||||
|
||||
*cb = dlm_allocate_cb();
|
||||
if (!*cb) {
|
||||
rv = DLM_ENQUEUE_CALLBACK_FAILURE;
|
||||
@ -126,17 +114,7 @@ int dlm_queue_lkb_callback(struct dlm_lkb *lkb, uint32_t flags, int mode,
|
||||
(*cb)->sb_flags = (sbflags & 0x000000FF);
|
||||
(*cb)->copy_lvb = copy_lvb;
|
||||
(*cb)->lkb_lksb = lkb->lkb_lksb;
|
||||
kref_init(&(*cb)->ref);
|
||||
|
||||
if (flags & DLM_CB_BAST) {
|
||||
lkb->lkb_last_bast_time = ktime_get();
|
||||
lkb->lkb_last_bast_mode = mode;
|
||||
} else if (flags & DLM_CB_CAST) {
|
||||
dlm_callback_set_last_ptr(&lkb->lkb_last_cast, *cb);
|
||||
lkb->lkb_last_cast_time = ktime_get();
|
||||
}
|
||||
|
||||
dlm_callback_set_last_ptr(&lkb->lkb_last_cb, *cb);
|
||||
rv = DLM_ENQUEUE_CALLBACK_NEED_SCHED;
|
||||
|
||||
out:
|
||||
|
@ -19,10 +19,7 @@ int dlm_queue_lkb_callback(struct dlm_lkb *lkb, uint32_t flags, int mode,
|
||||
struct dlm_callback **cb);
|
||||
void dlm_add_cb(struct dlm_lkb *lkb, uint32_t flags, int mode, int status,
|
||||
uint32_t sbflags);
|
||||
void dlm_callback_set_last_ptr(struct dlm_callback **from,
|
||||
struct dlm_callback *to);
|
||||
|
||||
void dlm_release_callback(struct kref *ref);
|
||||
int dlm_callback_start(struct dlm_ls *ls);
|
||||
void dlm_callback_stop(struct dlm_ls *ls);
|
||||
void dlm_callback_suspend(struct dlm_ls *ls);
|
||||
|
@ -247,7 +247,7 @@ static void print_format3_lock(struct seq_file *s, struct dlm_lkb *lkb,
|
||||
lkb->lkb_status,
|
||||
lkb->lkb_grmode,
|
||||
lkb->lkb_rqmode,
|
||||
lkb->lkb_last_bast_mode,
|
||||
lkb->lkb_last_bast_cb_mode,
|
||||
rsb_lookup,
|
||||
lkb->lkb_wait_type,
|
||||
lkb->lkb_lvbseq,
|
||||
|
@ -258,7 +258,6 @@ struct dlm_callback {
|
||||
uint32_t lkb_id;
|
||||
|
||||
struct list_head list;
|
||||
struct kref ref;
|
||||
};
|
||||
|
||||
struct dlm_lkb {
|
||||
@ -289,9 +288,10 @@ struct dlm_lkb {
|
||||
struct list_head lkb_ownqueue; /* list of locks for a process */
|
||||
ktime_t lkb_timestamp;
|
||||
|
||||
struct dlm_callback *lkb_last_cast;
|
||||
struct dlm_callback *lkb_last_cb;
|
||||
int lkb_last_bast_mode;
|
||||
int8_t lkb_last_cast_cb_mode;
|
||||
int8_t lkb_last_bast_cb_mode;
|
||||
int8_t lkb_last_cb_mode;
|
||||
uint8_t lkb_last_cb_flags;
|
||||
ktime_t lkb_last_cast_time; /* for debugging */
|
||||
ktime_t lkb_last_bast_time; /* for debugging */
|
||||
|
||||
|
@ -1197,7 +1197,9 @@ static int _create_lkb(struct dlm_ls *ls, struct dlm_lkb **lkb_ret,
|
||||
if (!lkb)
|
||||
return -ENOMEM;
|
||||
|
||||
lkb->lkb_last_bast_mode = -1;
|
||||
lkb->lkb_last_bast_cb_mode = DLM_LOCK_IV;
|
||||
lkb->lkb_last_cast_cb_mode = DLM_LOCK_IV;
|
||||
lkb->lkb_last_cb_mode = DLM_LOCK_IV;
|
||||
lkb->lkb_nodeid = -1;
|
||||
lkb->lkb_grmode = DLM_LOCK_IV;
|
||||
kref_init(&lkb->lkb_ref);
|
||||
@ -6031,7 +6033,7 @@ void dlm_clear_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc)
|
||||
|
||||
list_for_each_entry_safe(cb, cb_safe, &proc->asts, list) {
|
||||
list_del(&cb->list);
|
||||
kref_put(&cb->ref, dlm_release_callback);
|
||||
dlm_free_cb(cb);
|
||||
}
|
||||
|
||||
spin_unlock(&ls->ls_clear_proc_locks);
|
||||
@ -6072,7 +6074,7 @@ static void purge_proc_locks(struct dlm_ls *ls, struct dlm_user_proc *proc)
|
||||
spin_lock(&proc->asts_spin);
|
||||
list_for_each_entry_safe(cb, cb_safe, &proc->asts, list) {
|
||||
list_del(&cb->list);
|
||||
kref_put(&cb->ref, dlm_release_callback);
|
||||
dlm_free_cb(cb);
|
||||
}
|
||||
spin_unlock(&proc->asts_spin);
|
||||
}
|
||||
|
@ -127,10 +127,6 @@ void dlm_free_lkb(struct dlm_lkb *lkb)
|
||||
}
|
||||
}
|
||||
|
||||
/* drop references if they are set */
|
||||
dlm_callback_set_last_ptr(&lkb->lkb_last_cast, NULL);
|
||||
dlm_callback_set_last_ptr(&lkb->lkb_last_cb, NULL);
|
||||
|
||||
kmem_cache_free(lkb_cache, lkb);
|
||||
}
|
||||
|
||||
|
@ -864,7 +864,7 @@ static ssize_t device_read(struct file *file, char __user *buf, size_t count,
|
||||
ret = copy_result_to_user(&cb->ua,
|
||||
test_bit(DLM_PROC_FLAGS_COMPAT, &proc->flags),
|
||||
cb->flags, cb->mode, cb->copy_lvb, buf, count);
|
||||
kref_put(&cb->ref, dlm_release_callback);
|
||||
dlm_free_cb(cb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user