mirror of https://github.com/schoebel/mars
logger: replace spinlock by rwsem
This commit is contained in:
parent
d2786079f6
commit
e5bb5ade55
|
@ -2708,7 +2708,6 @@ void replay_endio(struct generic_callback *cb)
|
||||||
struct trans_logger_mref_aspect *mref_a = cb->cb_private;
|
struct trans_logger_mref_aspect *mref_a = cb->cb_private;
|
||||||
struct trans_logger_brick *brick;
|
struct trans_logger_brick *brick;
|
||||||
bool ok;
|
bool ok;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
_crashme(22, false);
|
_crashme(22, false);
|
||||||
|
|
||||||
|
@ -2722,10 +2721,10 @@ void replay_endio(struct generic_callback *cb)
|
||||||
MARS_ERR("IO error = %d\n", cb->cb_error);
|
MARS_ERR("IO error = %d\n", cb->cb_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
traced_lock(&brick->replay_lock, flags);
|
down_write(&brick->replay_mutex);
|
||||||
ok = !list_empty(&mref_a->replay_head);
|
ok = !list_empty(&mref_a->replay_head);
|
||||||
list_del_init(&mref_a->replay_head);
|
list_del_init(&mref_a->replay_head);
|
||||||
traced_unlock(&brick->replay_lock, flags);
|
up_write(&brick->replay_mutex);
|
||||||
|
|
||||||
if (likely(ok)) {
|
if (likely(ok)) {
|
||||||
atomic_dec(&brick->replay_count);
|
atomic_dec(&brick->replay_count);
|
||||||
|
@ -2745,11 +2744,8 @@ bool _has_conflict(struct trans_logger_brick *brick, struct trans_logger_mref_as
|
||||||
struct mref_object *mref = mref_a->object;
|
struct mref_object *mref = mref_a->object;
|
||||||
struct list_head *tmp;
|
struct list_head *tmp;
|
||||||
bool res = false;
|
bool res = false;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
// NOTE: replacing this by rwlock_t will not gain anything, because there exists at most 1 reader at any time
|
down_read(&brick->replay_mutex);
|
||||||
|
|
||||||
traced_lock(&brick->replay_lock, flags);
|
|
||||||
|
|
||||||
for (tmp = brick->replay_list.next; tmp != &brick->replay_list; tmp = tmp->next) {
|
for (tmp = brick->replay_list.next; tmp != &brick->replay_list; tmp = tmp->next) {
|
||||||
struct trans_logger_mref_aspect *tmp_a;
|
struct trans_logger_mref_aspect *tmp_a;
|
||||||
|
@ -2763,7 +2759,7 @@ bool _has_conflict(struct trans_logger_brick *brick, struct trans_logger_mref_as
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
traced_unlock(&brick->replay_lock, flags);
|
up_read(&brick->replay_mutex);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2774,7 +2770,6 @@ void wait_replay(struct trans_logger_brick *brick, struct trans_logger_mref_aspe
|
||||||
int conflicts = 0;
|
int conflicts = 0;
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
bool was_empty;
|
bool was_empty;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
wait_event_interruptible_timeout(brick->worker_event,
|
wait_event_interruptible_timeout(brick->worker_event,
|
||||||
atomic_read(&brick->replay_count) < max
|
atomic_read(&brick->replay_count) < max
|
||||||
|
@ -2785,7 +2780,7 @@ void wait_replay(struct trans_logger_brick *brick, struct trans_logger_mref_aspe
|
||||||
if (conflicts)
|
if (conflicts)
|
||||||
atomic_inc(&brick->total_replay_conflict_count);
|
atomic_inc(&brick->total_replay_conflict_count);
|
||||||
|
|
||||||
traced_lock(&brick->replay_lock, flags);
|
down_write(&brick->replay_mutex);
|
||||||
was_empty = !!list_empty(&mref_a->replay_head);
|
was_empty = !!list_empty(&mref_a->replay_head);
|
||||||
if (likely(was_empty)) {
|
if (likely(was_empty)) {
|
||||||
atomic_inc(&brick->replay_count);
|
atomic_inc(&brick->replay_count);
|
||||||
|
@ -2793,7 +2788,7 @@ void wait_replay(struct trans_logger_brick *brick, struct trans_logger_mref_aspe
|
||||||
list_del(&mref_a->replay_head);
|
list_del(&mref_a->replay_head);
|
||||||
}
|
}
|
||||||
list_add(&mref_a->replay_head, &brick->replay_list);
|
list_add(&mref_a->replay_head, &brick->replay_list);
|
||||||
traced_unlock(&brick->replay_lock, flags);
|
up_write(&brick->replay_mutex);
|
||||||
|
|
||||||
if (unlikely(!was_empty)) {
|
if (unlikely(!was_empty)) {
|
||||||
MARS_ERR("replay_head was already used (ok=%d, conflicts=%d, replay_count=%d)\n", ok, conflicts, atomic_read(&brick->replay_count));
|
MARS_ERR("replay_head was already used (ok=%d, conflicts=%d, replay_count=%d)\n", ok, conflicts, atomic_read(&brick->replay_count));
|
||||||
|
@ -3391,7 +3386,7 @@ int trans_logger_brick_construct(struct trans_logger_brick *brick)
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_set(&brick->hash_count, 0);
|
atomic_set(&brick->hash_count, 0);
|
||||||
spin_lock_init(&brick->replay_lock);
|
init_rwsem(&brick->replay_mutex);
|
||||||
INIT_LIST_HEAD(&brick->replay_list);
|
INIT_LIST_HEAD(&brick->replay_list);
|
||||||
INIT_LIST_HEAD(&brick->group_head);
|
INIT_LIST_HEAD(&brick->group_head);
|
||||||
init_waitqueue_head(&brick->worker_event);
|
init_waitqueue_head(&brick->worker_event);
|
||||||
|
|
|
@ -187,7 +187,7 @@ struct trans_logger_brick {
|
||||||
struct trans_logger_hash_anchor **hash_table;
|
struct trans_logger_hash_anchor **hash_table;
|
||||||
struct list_head group_head;
|
struct list_head group_head;
|
||||||
loff_t old_margin;
|
loff_t old_margin;
|
||||||
spinlock_t replay_lock;
|
struct rw_semaphore replay_mutex;
|
||||||
struct list_head replay_list;
|
struct list_head replay_list;
|
||||||
struct task_struct *thread;
|
struct task_struct *thread;
|
||||||
wait_queue_head_t worker_event;
|
wait_queue_head_t worker_event;
|
||||||
|
|
Loading…
Reference in New Issue