From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 10E6CEEB574 for ; Fri, 8 Sep 2023 20:46:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1694205991; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=qo+d6nNKE+EIchcN7YW+XEiU6sgPMrNfhdkIflmsjKg=; b=SoXefie1One5lkYXyOjTvQE0/np7LKloGSn2RVl462PyVFMrKXy7VvTUVhT/8GMsoSqSE/ 42XhXV462/bCEY/cZdVYuy6hRbh9ZWjxs+CTLetidm8OGo3hmqjT8p3WDrCgV/OVzeM4MF vtum1jtVuq7SoQ4bQzUvb5ubb8SrZ5I= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-584-8mN3uvZcPbiGHTfEOyuniA-1; Fri, 08 Sep 2023 16:46:27 -0400 X-MC-Unique: 8mN3uvZcPbiGHTfEOyuniA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 4993181650A; Fri, 8 Sep 2023 20:46:26 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id E891540ED414; Fri, 8 Sep 2023 20:46:25 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id B641E1946594; Fri, 8 Sep 2023 20:46:25 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id CDA341946597 for ; Fri, 8 Sep 2023 20:46:23 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id B32D721EE56B; Fri, 8 Sep 2023 20:46:23 +0000 (UTC) Received: from fs-i40c-03.fs.lab.eng.bos.redhat.com (fs-i40c-03.fs.lab.eng.bos.redhat.com [10.16.224.23]) by smtp.corp.redhat.com (Postfix) with ESMTP id 892D821EE56A; Fri, 8 Sep 2023 20:46:23 +0000 (UTC) From: Alexander Aring To: teigland@redhat.com Date: Fri, 8 Sep 2023 16:46:08 -0400 Message-Id: <20230908204611.1910601-7-aahringo@redhat.com> In-Reply-To: <20230908204611.1910601-1-aahringo@redhat.com> References: <20230908204611.1910601-1-aahringo@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.6 Subject: [Cluster-devel] [RFC dlm/next 07/10] fs: dlm: ls_root_lock semaphore to rwlock X-BeenThere: cluster-devel@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: "\[Cluster devel\]" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: cluster-devel@redhat.com, gfs2@lists.linux.dev Errors-To: cluster-devel-bounces@redhat.com Sender: "Cluster-devel" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true This patch converts the ls_root_lock semaphore to a rwlock to not sleep during dlm message processing. Signed-off-by: Alexander Aring --- fs/dlm/dir.c | 14 +++++++------- fs/dlm/dlm_internal.h | 2 +- fs/dlm/lock.c | 4 ++-- fs/dlm/lockspace.c | 2 +- fs/dlm/recover.c | 28 ++++++++++++++-------------- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/fs/dlm/dir.c b/fs/dlm/dir.c index f6acba4310a7..c70e286f3dbc 100644 --- a/fs/dlm/dir.c +++ b/fs/dlm/dir.c @@ -51,11 +51,11 @@ void dlm_recover_dir_nodeid(struct dlm_ls *ls) { struct dlm_rsb *r; - down_read(&ls->ls_root_sem); + read_lock(&ls->ls_root_lock); list_for_each_entry(r, &ls->ls_root_list, res_root_list) { r->res_dir_nodeid = dlm_hash2nodeid(ls, r->res_hash); } - up_read(&ls->ls_root_sem); + read_unlock(&ls->ls_root_lock); } int dlm_recover_directory(struct dlm_ls *ls, uint64_t seq) @@ -216,16 +216,16 @@ static struct dlm_rsb *find_rsb_root(struct dlm_ls *ls, const char *name, if (!rv) return r; - down_read(&ls->ls_root_sem); + read_lock(&ls->ls_root_lock); list_for_each_entry(r, &ls->ls_root_list, res_root_list) { if (len == r->res_length && !memcmp(name, r->res_name, len)) { - up_read(&ls->ls_root_sem); + read_unlock(&ls->ls_root_lock); log_debug(ls, "find_rsb_root revert to root_list %s", r->res_name); return r; } } - up_read(&ls->ls_root_sem); + read_unlock(&ls->ls_root_lock); return NULL; } @@ -241,7 +241,7 @@ void dlm_copy_master_names(struct dlm_ls *ls, const char *inbuf, int inlen, int offset = 0, dir_nodeid; __be16 be_namelen; - down_read(&ls->ls_root_sem); + read_lock(&ls->ls_root_lock); if (inlen > 1) { r = find_rsb_root(ls, inbuf, inlen); @@ -302,6 +302,6 @@ void dlm_copy_master_names(struct dlm_ls *ls, const char *inbuf, int inlen, ls->ls_recover_dir_sent_msg++; } out: - up_read(&ls->ls_root_sem); + read_unlock(&ls->ls_root_lock); } diff --git a/fs/dlm/dlm_internal.h b/fs/dlm/dlm_internal.h index 65db6f834f04..9106e20e6c20 100644 --- a/fs/dlm/dlm_internal.h +++ b/fs/dlm/dlm_internal.h @@ -642,7 +642,7 @@ struct dlm_ls { spinlock_t ls_clear_proc_locks; struct list_head ls_root_list; /* root resources */ - struct rw_semaphore ls_root_sem; /* protect root_list */ + rwlock_t ls_root_lock; /* protect root_list */ const struct dlm_lockspace_ops *ls_ops; void *ls_ops_arg; diff --git a/fs/dlm/lock.c b/fs/dlm/lock.c index 989603643c03..1031f233a3ad 100644 --- a/fs/dlm/lock.c +++ b/fs/dlm/lock.c @@ -5216,7 +5216,7 @@ void dlm_recover_purge(struct dlm_ls *ls) if (!nodes_count) return; - down_write(&ls->ls_root_sem); + write_lock(&ls->ls_root_lock); list_for_each_entry(r, &ls->ls_root_list, res_root_list) { hold_rsb(r); lock_rsb(r); @@ -5231,7 +5231,7 @@ void dlm_recover_purge(struct dlm_ls *ls) unlock_rsb(r); unhold_rsb(r); } - up_write(&ls->ls_root_sem); + write_unlock(&ls->ls_root_lock); if (lkb_count) log_rinfo(ls, "dlm_recover_purge %u locks for %u nodes", diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c index b2cb0621031f..265d69752b90 100644 --- a/fs/dlm/lockspace.c +++ b/fs/dlm/lockspace.c @@ -579,7 +579,7 @@ static int new_lockspace(const char *name, const char *cluster, ls->ls_local_handle = ls; init_waitqueue_head(&ls->ls_wait_general); INIT_LIST_HEAD(&ls->ls_root_list); - init_rwsem(&ls->ls_root_sem); + rwlock_init(&ls->ls_root_lock); spin_lock(&lslist_lock); ls->ls_create_count = 1; diff --git a/fs/dlm/recover.c b/fs/dlm/recover.c index 752002304ca9..0d5b0f94eb46 100644 --- a/fs/dlm/recover.c +++ b/fs/dlm/recover.c @@ -529,10 +529,10 @@ int dlm_recover_masters(struct dlm_ls *ls, uint64_t seq) log_rinfo(ls, "dlm_recover_masters"); - down_read(&ls->ls_root_sem); + read_lock(&ls->ls_root_lock); list_for_each_entry(r, &ls->ls_root_list, res_root_list) { if (dlm_recovery_stopped(ls)) { - up_read(&ls->ls_root_sem); + read_unlock(&ls->ls_root_lock); error = -EINTR; goto out; } @@ -546,11 +546,11 @@ int dlm_recover_masters(struct dlm_ls *ls, uint64_t seq) total++; if (error) { - up_read(&ls->ls_root_sem); + read_unlock(&ls->ls_root_lock); goto out; } } - up_read(&ls->ls_root_sem); + read_unlock(&ls->ls_root_lock); log_rinfo(ls, "dlm_recover_masters %u of %u", count, total); @@ -660,7 +660,7 @@ int dlm_recover_locks(struct dlm_ls *ls, uint64_t seq) struct dlm_rsb *r; int error, count = 0; - down_read(&ls->ls_root_sem); + read_lock(&ls->ls_root_lock); list_for_each_entry(r, &ls->ls_root_list, res_root_list) { if (is_master(r)) { rsb_clear_flag(r, RSB_NEW_MASTER); @@ -672,19 +672,19 @@ int dlm_recover_locks(struct dlm_ls *ls, uint64_t seq) if (dlm_recovery_stopped(ls)) { error = -EINTR; - up_read(&ls->ls_root_sem); + read_unlock(&ls->ls_root_lock); goto out; } error = recover_locks(r, seq); if (error) { - up_read(&ls->ls_root_sem); + read_unlock(&ls->ls_root_lock); goto out; } count += r->res_recover_locks_count; } - up_read(&ls->ls_root_sem); + read_unlock(&ls->ls_root_lock); log_rinfo(ls, "dlm_recover_locks %d out", count); @@ -858,7 +858,7 @@ void dlm_recover_rsbs(struct dlm_ls *ls) struct dlm_rsb *r; unsigned int count = 0; - down_read(&ls->ls_root_sem); + read_lock(&ls->ls_root_lock); list_for_each_entry(r, &ls->ls_root_list, res_root_list) { lock_rsb(r); if (is_master(r)) { @@ -880,7 +880,7 @@ void dlm_recover_rsbs(struct dlm_ls *ls) rsb_clear_flag(r, RSB_NEW_MASTER2); unlock_rsb(r); } - up_read(&ls->ls_root_sem); + read_unlock(&ls->ls_root_lock); if (count) log_rinfo(ls, "dlm_recover_rsbs %d done", count); @@ -894,7 +894,7 @@ int dlm_create_root_list(struct dlm_ls *ls) struct dlm_rsb *r; int i, error = 0; - down_write(&ls->ls_root_sem); + write_lock(&ls->ls_root_lock); if (!list_empty(&ls->ls_root_list)) { log_error(ls, "root list not empty"); error = -EINVAL; @@ -914,7 +914,7 @@ int dlm_create_root_list(struct dlm_ls *ls) spin_unlock(&ls->ls_rsbtbl[i].lock); } out: - up_write(&ls->ls_root_sem); + write_unlock(&ls->ls_root_lock); return error; } @@ -922,12 +922,12 @@ void dlm_release_root_list(struct dlm_ls *ls) { struct dlm_rsb *r, *safe; - down_write(&ls->ls_root_sem); + write_lock(&ls->ls_root_lock); list_for_each_entry_safe(r, safe, &ls->ls_root_list, res_root_list) { list_del_init(&r->res_root_list); dlm_put_rsb(r); } - up_write(&ls->ls_root_sem); + write_unlock(&ls->ls_root_lock); } void dlm_clear_toss(struct dlm_ls *ls) -- 2.31.1