client: replace spinlock with mutex

This commit is contained in:
Thomas Schoebel-Theuer 2017-12-10 22:23:48 +01:00 committed by Thomas Schoebel-Theuer
parent 8b6f93a6db
commit 2fef63b72a
2 changed files with 14 additions and 20 deletions

View File

@ -238,17 +238,16 @@ static
void _hash_insert(struct client_output *output, struct client_mref_aspect *mref_a) void _hash_insert(struct client_output *output, struct client_mref_aspect *mref_a)
{ {
struct mref_object *mref = mref_a->object; struct mref_object *mref = mref_a->object;
unsigned long flags;
int hash_index; int hash_index;
traced_lock(&output->lock, flags); mutex_lock(&output->mutex);
list_del(&mref_a->io_head); list_del(&mref_a->io_head);
list_add_tail(&mref_a->io_head, &output->mref_list); list_add_tail(&mref_a->io_head, &output->mref_list);
list_del(&mref_a->hash_head); list_del(&mref_a->hash_head);
mref->ref_id = ++output->last_id; mref->ref_id = ++output->last_id;
hash_index = mref->ref_id % CLIENT_HASH_MAX; hash_index = mref->ref_id % CLIENT_HASH_MAX;
list_add_tail(&mref_a->hash_head, &output->hash_table[hash_index]); list_add_tail(&mref_a->hash_head, &output->hash_table[hash_index]);
traced_unlock(&output->lock, flags); mutex_unlock(&output->mutex);
} }
static void client_ref_io(struct client_output *output, struct mref_object *mref) static void client_ref_io(struct client_output *output, struct mref_object *mref)
@ -300,7 +299,6 @@ int receiver_thread(void *data)
struct list_head *tmp; struct list_head *tmp;
struct client_mref_aspect *mref_a = NULL; struct client_mref_aspect *mref_a = NULL;
struct mref_object *mref = NULL; struct mref_object *mref = NULL;
unsigned long flags;
if (output->recv_error) { if (output->recv_error) {
/* The protocol may be out of sync. /* The protocol may be out of sync.
@ -333,13 +331,13 @@ int receiver_thread(void *data)
{ {
int hash_index = cmd.cmd_int1 % CLIENT_HASH_MAX; int hash_index = cmd.cmd_int1 % CLIENT_HASH_MAX;
traced_lock(&output->lock, flags); mutex_lock(&output->mutex);
for (tmp = output->hash_table[hash_index].next; tmp != &output->hash_table[hash_index]; tmp = tmp->next) { for (tmp = output->hash_table[hash_index].next; tmp != &output->hash_table[hash_index]; tmp = tmp->next) {
struct mref_object *tmp_mref; struct mref_object *tmp_mref;
mref_a = container_of(tmp, struct client_mref_aspect, hash_head); mref_a = container_of(tmp, struct client_mref_aspect, hash_head);
tmp_mref = mref_a->object; tmp_mref = mref_a->object;
if (unlikely(!tmp_mref)) { if (unlikely(!tmp_mref)) {
traced_unlock(&output->lock, flags); mutex_unlock(&output->mutex);
MARS_ERR("bad internal mref pointer\n"); MARS_ERR("bad internal mref pointer\n");
status = -EBADR; status = -EBADR;
goto done; goto done;
@ -351,7 +349,7 @@ int receiver_thread(void *data)
break; break;
} }
} }
traced_unlock(&output->lock, flags); mutex_unlock(&output->mutex);
if (unlikely(!mref)) { if (unlikely(!mref)) {
MARS_WRN("got unknown id = %d for callback\n", cmd.cmd_int1); MARS_WRN("got unknown id = %d for callback\n", cmd.cmd_int1);
@ -415,9 +413,7 @@ int receiver_thread(void *data)
static static
void _do_resubmit(struct client_output *output) void _do_resubmit(struct client_output *output)
{ {
unsigned long flags; mutex_lock(&output->mutex);
traced_lock(&output->lock, flags);
if (!list_empty(&output->wait_list)) { if (!list_empty(&output->wait_list)) {
struct list_head *first = output->wait_list.next; struct list_head *first = output->wait_list.next;
struct list_head *last = output->wait_list.prev; struct list_head *last = output->wait_list.prev;
@ -428,7 +424,7 @@ void _do_resubmit(struct client_output *output)
INIT_LIST_HEAD(&output->wait_list); INIT_LIST_HEAD(&output->wait_list);
MARS_IO("done re-submit %p %p\n", first, last); MARS_IO("done re-submit %p %p\n", first, last);
} }
traced_unlock(&output->lock, flags); mutex_unlock(&output->mutex);
} }
static static
@ -440,7 +436,6 @@ void _do_timeout(struct client_output *output, struct list_head *anchor, bool fo
LIST_HEAD(tmp_list); LIST_HEAD(tmp_list);
int rounds = 0; int rounds = 0;
long io_timeout = brick->power.io_timeout; long io_timeout = brick->power.io_timeout;
unsigned long flags;
if (io_timeout <= 0) if (io_timeout <= 0)
io_timeout = global_net_io_timeout; io_timeout = global_net_io_timeout;
@ -453,7 +448,7 @@ void _do_timeout(struct client_output *output, struct list_head *anchor, bool fo
io_timeout *= HZ; io_timeout *= HZ;
traced_lock(&output->lock, flags); mutex_lock(&output->mutex);
for (tmp = anchor->next, next = tmp->next; tmp != anchor; tmp = next, next = tmp->next) { for (tmp = anchor->next, next = tmp->next; tmp != anchor; tmp = next, next = tmp->next) {
struct client_mref_aspect *mref_a; struct client_mref_aspect *mref_a;
@ -468,7 +463,7 @@ void _do_timeout(struct client_output *output, struct list_head *anchor, bool fo
list_del_init(&mref_a->io_head); list_del_init(&mref_a->io_head);
list_add_tail(&mref_a->tmp_head, &tmp_list); list_add_tail(&mref_a->tmp_head, &tmp_list);
} }
traced_unlock(&output->lock, flags); mutex_unlock(&output->mutex);
while (!list_empty(&tmp_list)) { while (!list_empty(&tmp_list)) {
struct client_mref_aspect *mref_a; struct client_mref_aspect *mref_a;
@ -501,7 +496,6 @@ static int sender_thread(void *data)
{ {
struct client_output *output = data; struct client_output *output = data;
struct client_brick *brick = output->brick; struct client_brick *brick = output->brick;
unsigned long flags;
bool do_kill = false; bool do_kill = false;
int status = 0; int status = 0;
@ -569,16 +563,16 @@ static int sender_thread(void *data)
/* Grab the next mref from the queue /* Grab the next mref from the queue
*/ */
traced_lock(&output->lock, flags); mutex_lock(&output->mutex);
if (list_empty(&output->mref_list)) { if (list_empty(&output->mref_list)) {
traced_unlock(&output->lock, flags); mutex_unlock(&output->mutex);
continue; continue;
} }
tmp = output->mref_list.next; tmp = output->mref_list.next;
list_del(tmp); list_del(tmp);
list_add(tmp, &output->wait_list); list_add(tmp, &output->wait_list);
mref_a = container_of(tmp, struct client_mref_aspect, io_head); mref_a = container_of(tmp, struct client_mref_aspect, io_head);
traced_unlock(&output->lock, flags); mutex_unlock(&output->mutex);
mref = mref_a->object; mref = mref_a->object;
@ -739,7 +733,7 @@ static int client_output_construct(struct client_output *output)
for (i = 0; i < CLIENT_HASH_MAX; i++) { for (i = 0; i < CLIENT_HASH_MAX; i++) {
INIT_LIST_HEAD(&output->hash_table[i]); INIT_LIST_HEAD(&output->hash_table[i]);
} }
spin_lock_init(&output->lock); mutex_init(&output->mutex);
INIT_LIST_HEAD(&output->mref_list); INIT_LIST_HEAD(&output->mref_list);
INIT_LIST_HEAD(&output->wait_list); INIT_LIST_HEAD(&output->wait_list);
init_waitqueue_head(&output->event); init_waitqueue_head(&output->event);

View File

@ -64,7 +64,7 @@ struct client_output {
MARS_OUTPUT(client); MARS_OUTPUT(client);
atomic_t fly_count; atomic_t fly_count;
atomic_t timeout_count; atomic_t timeout_count;
spinlock_t lock; struct mutex mutex;
struct list_head mref_list; struct list_head mref_list;
struct list_head wait_list; struct list_head wait_list;
wait_queue_head_t event; wait_queue_head_t event;