From patchwork Fri Nov 10 20:41:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13452779 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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 34F93C4167D for ; Fri, 10 Nov 2023 20:41:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C314F28001D; Fri, 10 Nov 2023 15:41:39 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id BE1DA8D0005; Fri, 10 Nov 2023 15:41:39 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AA9DE28001D; Fri, 10 Nov 2023 15:41:39 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 9BF7D8D0005 for ; Fri, 10 Nov 2023 15:41:39 -0500 (EST) Received: from smtpin19.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 5973F1CBC7A for ; Fri, 10 Nov 2023 20:41:39 +0000 (UTC) X-FDA: 81443215518.19.2992411 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf03.hostedemail.com (Postfix) with ESMTP id 9CAA120006 for ; Fri, 10 Nov 2023 20:41:37 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=NXjTGPNA; dmarc=none; spf=none (imf03.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1699648897; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=xbcUpDlbQzcZtzSAWcv3Q7LJrTanIECAc3h72m1YlgE=; b=hHdpBpCWfPE7mkWWqKNgtLudUfX5bxEnxnDAyRDzYAmy13qjd5aQowEy1kKMeMDf9/dH1f SAiCNs8mwbgWklFVPjFeCevBiO5PBIotfAjN2T5w9o0kfrPYtAIv+PAe/UDN1TaXRb0idl +Wpxz2qV0Mv8ICh75dt2gprzihhvpZg= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=NXjTGPNA; dmarc=none; spf=none (imf03.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1699648897; a=rsa-sha256; cv=none; b=XtbB9L4vBAr+ofvL2Gyec29usz/zS540DwIAm/JNcMu3d4j4oLLK4rg12YuYOZ9uqOwN6D xkI0Ipm6O1lGgwSofdGwsAW2IdVQzXpWx2F17P4Fsgmj2bGLDMuH+gT7zdLz7UzauEW/0m ZrcuXKWK21JTUgUXgz08PRJbj8nnVrM= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=xbcUpDlbQzcZtzSAWcv3Q7LJrTanIECAc3h72m1YlgE=; b=NXjTGPNA2/J+S0B69M9GryHSZy JEUbI2a0TcAYRnGh16+i9v4DFgBnH83q3GPcVmkFYWeoL2adHr3jmgVG2axEPdWLdI+jor9FpoEB4 WOd9Nh4rje6m4Be73wVz7JajVwB7Jan9En5P94sI1bn6IbzMWrOZvu1ynUfk1Exyo9UtvvRaTOuli UT4d0/S9wkysIlvVu4vAARkoMPnt9Ip/T/fESfI7hCRzWsnPwgaNjQq6wxrjMZc/qLz8aiJ6qT2cc HBY6Q7ud4STl3KlqSrCt/oXDuxacuZuLcBHlCvpCK6j8ogowkjqKuJiYsJ7n9Cjn0Ra/nTJqxskGj aq72S09w==; Received: from willy by casper.infradead.org with local (Exim 4.94.2 #2 (Red Hat Linux)) id 1r1YJd-00FUTA-Bl; Fri, 10 Nov 2023 20:41:21 +0000 From: "Matthew Wilcox (Oracle)" To: Peter Zijlstra , Ingo Molnar , Will Deacon , Waiman Long Cc: "Matthew Wilcox (Oracle)" , linux-kernel@vger.kernel.org, linux-mm@kvack.org, Chandan Babu R , "Darrick J . Wong" , linux-xfs@vger.kernel.org, Mateusz Guzik Subject: [PATCH v3 4/4] xfs: Remove mrlock wrapper Date: Fri, 10 Nov 2023 20:41:19 +0000 Message-Id: <20231110204119.3692023-5-willy@infradead.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20231110204119.3692023-1-willy@infradead.org> References: <20231110204119.3692023-1-willy@infradead.org> MIME-Version: 1.0 X-Rspamd-Queue-Id: 9CAA120006 X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: igw3u3rwtc8tj8gmfdxh7bu465xgedou X-HE-Tag: 1699648897-947870 X-HE-Meta: U2FsdGVkX18ew2aaqwRjHGchZxgi9Q3ECsXPjzV4a44U7JYxlpM5gWRpekL3Z8wa/g5WGP/fR4oAe24ITymiJ75mQYQn0jSAyiL09eKNIy3C2Tub9/RfrIRugZc9cz+HfIWq9ZYyJ3mH9MYzxfo6BimrcjOX5MOoUpZ+DBAoOfeE/ij4v2Og1fSgPJNQQ0a80+6WyXFVC/GlX6wNE5Jzz6O7G+Z4SRLDrmcYQDfNi9RFnguxl91NrWDYQ/Ug0yAoEaHtPY3X/Gao63kbaoAu/ZTWS15v6BO1xpPwjZanzKfVqyxB0WoINymsM3Z6W5IZlFhW2jU6cW3ZBd/GgU0tusgvEFIAXxDs7DeCK/INmtwVPrlVU06yDBbPPydzDdMauggzb9nNJFE3vGE4DIb9BA3X0h5yALFUvId5QhIIVdAHhOQYAOhvmFPz1CSyzFOaW28JJzpcyHKkdh6CPxS+3VMnomiSrXC9Xi1S2UhPiwtaBqXZnV2zf9ihR1APm5gnuD04U6Xx4lT7BBB0C+ng2wZc2szQNXD4q/KvjAQFpC2ZObcE6uEmAuHopIRP9NJevnvAUm3FzkllBIQLFda10t/BkkSc8IrXQLU+B5WnfEEat2SPTLiJYWZGxbwBZcuQcE58k73AQJLWEB5X3H0RP9DfG/R7qIPY+GpA1OD/U9QuUpHlVFbC/8KtY/zRsHtBmPFg66dbjht+KWRw/jgdOiIrZ9hgopN7saZOj9ILPfUdtwZ/zqsK7rU9Dfl2dTvnUgUZlp1YNq1e9++wgJYyKsXH7TdIx8ojsTEfp8yKS1bxbsvVL1y96N6gK7q/N3M1vWpQlkc82b/v1cr1ngEpB8nEu7VNeGFiesuQgNOa9BEQDjJHBlzJ6uZ8yN3gStBplJruoXiH+nbnWGkoNCXxGDW2Na+KDHZQvUndtOsaCOg8lfvZ98Vl0D9B2UkFQI5INsSBuEZ4RLAjx9BBWzG xy7CHUhQ tSIfDu1bMIRdmiN2MSceC8OEE3Hol+VCwoiQLpgOuOEmJ0/lAfQju8u+kRD46K5d4GJ0S/VnHQvCLwwTQk7EVAP66eNJRD98ew+r+/2graLhdaw2wpaJO+nD7Q3SHS5xQO4VDGbDKdJN1X4WZNkpxFzDHN6CU7kklq89EEZOTeiuTGwSfOlVCcnMZxA== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: mrlock was an rwsem wrapper that also recorded whether the lock was held for read or write. Now that we can ask the generic code whether the lock is held for read or write, we can remove this wrapper and use an rwsem directly. As the comment says, we can't use lockdep to assert that the ILOCK is held for write, because we might be in a workqueue, and we aren't able to tell lockdep that we do in fact own the lock. Signed-off-by: Matthew Wilcox (Oracle) --- fs/xfs/mrlock.h | 78 ---------------------------------------------- fs/xfs/xfs_inode.c | 22 +++++++------ fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 4 +-- fs/xfs/xfs_linux.h | 2 +- fs/xfs/xfs_super.c | 4 +-- 6 files changed, 18 insertions(+), 94 deletions(-) delete mode 100644 fs/xfs/mrlock.h diff --git a/fs/xfs/mrlock.h b/fs/xfs/mrlock.h deleted file mode 100644 index 79155eec341b..000000000000 --- a/fs/xfs/mrlock.h +++ /dev/null @@ -1,78 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. - * All Rights Reserved. - */ -#ifndef __XFS_SUPPORT_MRLOCK_H__ -#define __XFS_SUPPORT_MRLOCK_H__ - -#include - -typedef struct { - struct rw_semaphore mr_lock; -#if defined(DEBUG) || defined(XFS_WARN) - int mr_writer; -#endif -} mrlock_t; - -#if defined(DEBUG) || defined(XFS_WARN) -#define mrinit(mrp, name) \ - do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) -#else -#define mrinit(mrp, name) \ - do { init_rwsem(&(mrp)->mr_lock); } while (0) -#endif - -#define mrlock_init(mrp, t,n,s) mrinit(mrp, n) -#define mrfree(mrp) do { } while (0) - -static inline void mraccess_nested(mrlock_t *mrp, int subclass) -{ - down_read_nested(&mrp->mr_lock, subclass); -} - -static inline void mrupdate_nested(mrlock_t *mrp, int subclass) -{ - down_write_nested(&mrp->mr_lock, subclass); -#if defined(DEBUG) || defined(XFS_WARN) - mrp->mr_writer = 1; -#endif -} - -static inline int mrtryaccess(mrlock_t *mrp) -{ - return down_read_trylock(&mrp->mr_lock); -} - -static inline int mrtryupdate(mrlock_t *mrp) -{ - if (!down_write_trylock(&mrp->mr_lock)) - return 0; -#if defined(DEBUG) || defined(XFS_WARN) - mrp->mr_writer = 1; -#endif - return 1; -} - -static inline void mrunlock_excl(mrlock_t *mrp) -{ -#if defined(DEBUG) || defined(XFS_WARN) - mrp->mr_writer = 0; -#endif - up_write(&mrp->mr_lock); -} - -static inline void mrunlock_shared(mrlock_t *mrp) -{ - up_read(&mrp->mr_lock); -} - -static inline void mrdemote(mrlock_t *mrp) -{ -#if defined(DEBUG) || defined(XFS_WARN) - mrp->mr_writer = 0; -#endif - downgrade_write(&mrp->mr_lock); -} - -#endif /* __XFS_SUPPORT_MRLOCK_H__ */ diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 1ed6bed19bec..7661084ca568 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -208,9 +208,9 @@ xfs_ilock( } if (lock_flags & XFS_ILOCK_EXCL) - mrupdate_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); + down_write_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); else if (lock_flags & XFS_ILOCK_SHARED) - mraccess_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); + down_read_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); } /* @@ -251,10 +251,10 @@ xfs_ilock_nowait( } if (lock_flags & XFS_ILOCK_EXCL) { - if (!mrtryupdate(&ip->i_lock)) + if (!down_write_trylock(&ip->i_lock)) goto out_undo_mmaplock; } else if (lock_flags & XFS_ILOCK_SHARED) { - if (!mrtryaccess(&ip->i_lock)) + if (!down_read_trylock(&ip->i_lock)) goto out_undo_mmaplock; } return 1; @@ -303,9 +303,9 @@ xfs_iunlock( up_read(&VFS_I(ip)->i_mapping->invalidate_lock); if (lock_flags & XFS_ILOCK_EXCL) - mrunlock_excl(&ip->i_lock); + up_write(&ip->i_lock); else if (lock_flags & XFS_ILOCK_SHARED) - mrunlock_shared(&ip->i_lock); + up_read(&ip->i_lock); trace_xfs_iunlock(ip, lock_flags, _RET_IP_); } @@ -324,7 +324,7 @@ xfs_ilock_demote( ~(XFS_IOLOCK_EXCL|XFS_MMAPLOCK_EXCL|XFS_ILOCK_EXCL)) == 0); if (lock_flags & XFS_ILOCK_EXCL) - mrdemote(&ip->i_lock); + downgrade_write(&ip->i_lock); if (lock_flags & XFS_MMAPLOCK_EXCL) downgrade_write(&VFS_I(ip)->i_mapping->invalidate_lock); if (lock_flags & XFS_IOLOCK_EXCL) @@ -338,10 +338,14 @@ xfs_assert_ilocked( struct xfs_inode *ip, uint lock_flags) { + /* + * Sometimes we assert the ILOCK is held exclusively, but we're in + * a workqueue, so lockdep doesn't know we're the owner. + */ if (lock_flags & XFS_ILOCK_SHARED) - rwsem_assert_held(&ip->i_lock.mr_lock); + rwsem_assert_held(&ip->i_lock); else if (lock_flags & XFS_ILOCK_EXCL) - ASSERT(ip->i_lock.mr_writer); + rwsem_assert_held_write_nolockdep(&ip->i_lock); if (lock_flags & XFS_MMAPLOCK_SHARED) rwsem_assert_held(&VFS_I(ip)->i_mapping->invalidate_lock); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index dd8b8339ba1b..3cade5903fda 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -39,7 +39,7 @@ typedef struct xfs_inode { /* Transaction and locking information. */ struct xfs_inode_log_item *i_itemp; /* logging information */ - mrlock_t i_lock; /* inode lock */ + struct rw_semaphore i_lock; /* inode lock */ atomic_t i_pincount; /* inode pin count */ struct llist_node i_gclist; /* deferred inactivation list */ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index e711668d601b..79010d60ee21 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1284,9 +1284,9 @@ xfs_setup_inode( */ lockdep_set_class(&inode->i_rwsem, &inode->i_sb->s_type->i_mutex_dir_key); - lockdep_set_class(&ip->i_lock.mr_lock, &xfs_dir_ilock_class); + lockdep_set_class(&ip->i_lock, &xfs_dir_ilock_class); } else { - lockdep_set_class(&ip->i_lock.mr_lock, &xfs_nondir_ilock_class); + lockdep_set_class(&ip->i_lock, &xfs_nondir_ilock_class); } /* diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index d7873e0360f0..ec3c6c138a63 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -22,7 +22,6 @@ typedef __u32 xfs_nlink_t; #include "xfs_types.h" #include "kmem.h" -#include "mrlock.h" #include #include @@ -51,6 +50,7 @@ typedef __u32 xfs_nlink_t; #include #include #include +#include #include #include #include diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 764304595e8b..cd0200ed51f0 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -724,9 +724,7 @@ xfs_fs_inode_init_once( /* xfs inode */ atomic_set(&ip->i_pincount, 0); spin_lock_init(&ip->i_flags_lock); - - mrlock_init(&ip->i_lock, MRLOCK_ALLOW_EQUAL_PRI|MRLOCK_BARRIER, - "xfsino", ip->i_ino); + init_rwsem(&ip->i_lock); } /*