From: Alexander Aring <aahringo@redhat.com>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH v5.14-rc1 11/12] fs: dlm: fix multiple empty writequeue alloc
Date: Fri, 16 Jul 2021 16:22:44 -0400 [thread overview]
Message-ID: <20210716202245.1262791-12-aahringo@redhat.com> (raw)
In-Reply-To: <20210716202245.1262791-1-aahringo@redhat.com>
This patch will add a mutex that a connection can allocate a writequeue
entry buffer only at a sleepable context at one time. If multiple caller
waits at the writequeue spinlock and the spinlock gets release it could
be that multiple new writequeue page buffers were allocated instead of
allocate one writequeue page buffer and other waiters will use remaining
buffer of it. It will only be the case for sleepable context which is
the common case. In non-sleepable contexts like retransmission we just
don't care about such behaviour.
Signed-off-by: Alexander Aring <aahringo@redhat.com>
---
fs/dlm/lowcomms.c | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index ac5825d77ce8..04d16ece2bcb 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -84,6 +84,7 @@ struct connection {
struct list_head writequeue; /* List of outgoing writequeue_entries */
spinlock_t writequeue_lock;
atomic_t writequeue_cnt;
+ struct mutex wq_alloc;
int retries;
#define MAX_CONNECT_RETRIES 3
struct hlist_node list;
@@ -264,6 +265,8 @@ static struct connection *nodeid2con(int nodeid, gfp_t alloc)
return NULL;
}
+ mutex_init(&con->wq_alloc);
+
spin_lock(&connections_lock);
/* Because multiple workqueues/threads calls this function it can
* race on multiple cpu's. Instead of locking hot path __find_con()
@@ -1251,19 +1254,37 @@ static struct dlm_msg *dlm_lowcomms_new_msg_con(struct connection *con, int len,
{
struct writequeue_entry *e;
struct dlm_msg *msg;
+ bool sleepable;
msg = kzalloc(sizeof(*msg), allocation);
if (!msg)
return NULL;
+ /* this mutex is being used as a wait to avoid multiple "fast"
+ * new writequeue page list entry allocs in new_wq_entry in
+ * normal operation which is sleepable context. Without it
+ * we could end in multiple writequeue entries with one
+ * dlm message because multiple callers were waiting at
+ * the writequeue_lock in new_wq_entry().
+ */
+ sleepable = gfpflags_normal_context(allocation);
+ if (sleepable)
+ mutex_lock(&con->wq_alloc);
+
kref_init(&msg->ref);
e = new_wq_entry(con, len, allocation, ppc, cb, mh);
if (!e) {
+ if (sleepable)
+ mutex_unlock(&con->wq_alloc);
+
kfree(msg);
return NULL;
}
+ if (sleepable)
+ mutex_unlock(&con->wq_alloc);
+
msg->ppc = *ppc;
msg->len = len;
msg->entry = e;
--
2.27.0
next prev parent reply other threads:[~2021-07-16 20:22 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-16 20:22 [Cluster-devel] [PATCH v5.14-rc1 00/12] fs: dlm: combine similar functionaility Alexander Aring
2021-07-16 20:22 ` [Cluster-devel] [PATCH v5.14-rc1 01/12] fs: dlm: use sk->sk_socket instead of con->sock Alexander Aring
2021-07-16 20:22 ` [Cluster-devel] [PATCH v5.14-rc1 02/12] fs: dlm: use READ_ONCE for config var Alexander Aring
2021-07-16 20:22 ` [Cluster-devel] [PATCH v5.14-rc1 03/12] fs: dlm: fix typo in tlv prefix Alexander Aring
2021-07-16 20:22 ` [Cluster-devel] [PATCH v5.14-rc1 04/12] fs: dlm: clear CF_APP_LIMITED on close Alexander Aring
2021-07-16 20:22 ` [Cluster-devel] [PATCH v5.14-rc1 05/12] fs: dlm: cleanup and remove _send_rcom Alexander Aring
2021-07-16 20:22 ` [Cluster-devel] [PATCH v5.14-rc1 06/12] fs: dlm: introduce con_next_wq helper Alexander Aring
2021-07-16 20:22 ` [Cluster-devel] [PATCH v5.14-rc1 07/12] fs: dlm: move to static proto ops Alexander Aring
2021-07-16 20:22 ` [Cluster-devel] [PATCH v5.14-rc1 08/12] fs: dlm: introduce generic listen Alexander Aring
2021-07-16 20:22 ` [Cluster-devel] [PATCH v5.14-rc1 09/12] fs: dlm: auto load sctp module Alexander Aring
2021-07-16 20:22 ` [Cluster-devel] [PATCH v5.14-rc1 10/12] fs: dlm: generic connect func Alexander Aring
2021-07-16 20:22 ` Alexander Aring [this message]
2021-07-16 20:22 ` [Cluster-devel] [PATCH v5.14-rc1 12/12] fs: dlm: move receive loop into receive handler Alexander Aring
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210716202245.1262791-12-aahringo@redhat.com \
--to=aahringo@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).