Commit 194a3fb4 authored by Alexander Aring's avatar Alexander Aring Committed by David Teigland

fs: dlm: relax sending to allow receiving

This patch drops additionally the sock_mutex when there is a sending
message burst. Since we have acknowledge handling we free sending
buffers only when we receive an ack back, but if we are stuck in
send_to_sock() looping because dlm sends a lot of messages and we never
leave the loop the sending buffer fill up very quickly. We can't receive
during this iteration because the sock_mutex is held. This patch will
unlock the sock_mutex so it should be possible to receive messages when
a burst of sending messages happens. This will allow to free up memory
because acks which are already received can be processed.
Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
Signed-off-by: default avatarDavid Teigland <teigland@redhat.com>
parent 3872f87b
...@@ -1418,7 +1418,10 @@ static void send_to_sock(struct connection *con) ...@@ -1418,7 +1418,10 @@ static void send_to_sock(struct connection *con)
const int msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL; const int msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL;
struct writequeue_entry *e; struct writequeue_entry *e;
int len, offset, ret; int len, offset, ret;
int count = 0; int count;
again:
count = 0;
mutex_lock(&con->sock_mutex); mutex_lock(&con->sock_mutex);
if (con->sock == NULL) if (con->sock == NULL)
...@@ -1453,14 +1456,16 @@ static void send_to_sock(struct connection *con) ...@@ -1453,14 +1456,16 @@ static void send_to_sock(struct connection *con)
} else if (ret < 0) } else if (ret < 0)
goto out; goto out;
spin_lock(&con->writequeue_lock);
writequeue_entry_complete(e, ret);
/* Don't starve people filling buffers */ /* Don't starve people filling buffers */
if (++count >= MAX_SEND_MSG_COUNT) { if (++count >= MAX_SEND_MSG_COUNT) {
spin_unlock(&con->writequeue_lock);
mutex_unlock(&con->sock_mutex);
cond_resched(); cond_resched();
count = 0; goto again;
} }
spin_lock(&con->writequeue_lock);
writequeue_entry_complete(e, ret);
} }
spin_unlock(&con->writequeue_lock); spin_unlock(&con->writequeue_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment