From patchwork Sat Oct 7 20:35:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13412475 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 CE175E95A62 for ; Sat, 7 Oct 2023 20:36:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 413998D000E; Sat, 7 Oct 2023 16:36:02 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3C3118D0001; Sat, 7 Oct 2023 16:36:02 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2B2638D000E; Sat, 7 Oct 2023 16:36:02 -0400 (EDT) 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 1BE368D0001 for ; Sat, 7 Oct 2023 16:36:02 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id D8AE7C02AF for ; Sat, 7 Oct 2023 20:36:01 +0000 (UTC) X-FDA: 81319822122.24.CC07704 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf27.hostedemail.com (Postfix) with ESMTP id A91C04000E for ; Sat, 7 Oct 2023 20:35:59 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=vvK0TzTj; dmarc=none; spf=none (imf27.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=1696710960; 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=XSq7hOCZtUTD3xmIh2+j7L/eFgD05O4FG3L1sm/q0vU=; b=OL1AS5fOtmdaBc1VhqEnJcOFfQIaI2U8LMu4ynb2HIGTwicvFC2ORgdQVP9MsFBJgXPBm/ Gvma8z6a2x8O3FbL9f8tf9jUnMHYnu9xRSAeVqSSvbVD+GFJau9t3C0lVhGn7gXfAmV/V3 /v5tcqlVF4JwFhciqgEVrJH2YsBTqB0= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=vvK0TzTj; dmarc=none; spf=none (imf27.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=1696710960; a=rsa-sha256; cv=none; b=7GhpeUZZTP9aTLI6H/Bpu7uP41U5qXRi9jiBbxFOY3lXyFylxKvzUN60NCwHq3iiwz45VX 9HPXKLE9tSbyTj9DgnlFQCBNs0OjCR4wCqmBN4/ib+rD9BvTM417QSY/O/P/jyf+rUIeRw nPL0U6H0BXLgiusbbPwUp8OaHCC8zuY= 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=XSq7hOCZtUTD3xmIh2+j7L/eFgD05O4FG3L1sm/q0vU=; b=vvK0TzTj5czxdfAs0vX3rONj3R CyOinIlNZZFgSisIAlafVf+YcJotrT54o8RfwWrEfl4Mjhkq/6gRHoXp/GWLfEav5h+9d27Lfgrue kZGkrdGXIjvuB+ies2741IrTpLI7ISbl8uaY0x0VP2r5Pf0ADQGLNcRjFiZe9AfHj8rWjKI1s1zW2 rycySDH7CUC80HfTQA6VuVMJJrM/ktxfimoYiC6Cj75IE8oXjIPrQX1+xTMSdswir1pIJ8ynDLu0R gABbXZ8H2vDfxTFUt/pzfNKXILKBZcVquhCtWVbqfSey1hKSSUCcZNtNXBSnKHmdRldFXYMUtIeW+ 2J0CfQBw==; Received: from willy by casper.infradead.org with local (Exim 4.94.2 #2 (Red Hat Linux)) id 1qpE1Y-005mLG-Rn; Sat, 07 Oct 2023 20:35:44 +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 v2 4/5] xfs: Remove mrlock wrapper Date: Sat, 7 Oct 2023 21:35:42 +0100 Message-Id: <20231007203543.1377452-5-willy@infradead.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20231007203543.1377452-1-willy@infradead.org> References: <20231007203543.1377452-1-willy@infradead.org> MIME-Version: 1.0 X-Rspam-User: X-Stat-Signature: yuuduozeisrhjz4mmqsn36nk3hp8qr36 X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: A91C04000E X-HE-Tag: 1696710959-802853 X-HE-Meta: U2FsdGVkX18YwUGaENPjf+3wH3cZQYBDd+qPqwU3HUEtRc5hHLMrUJhs2kj5a5vsVsKrO28WeJcbOT+QgnHk6/hbjgIaGpMRvC/maI0VNVgtdrfk/C/2Ux884RVNZ7P86vdAT2fMhxQWFziV03YNzOLo00XSv8COBnwmoAcno1PWk1ZWj2s0bS8bwc1bk0GCqI0yrsO3GjTRuQy28drLLqqdR/g2R+kYTmbMyBnQx1VqIYwvvd5kw8KEAGQldNLq86cEM6RRC+xNMZjXlHELhILpzPGSL/4/gKvKompJ86AiN/2mGjzELiUjX9jy3KUAx3k5nLcVyEzpjY25UR7X05qs7/uZs5AteHXQpZ5dHUHhv+IYch9Vre26TIov2KxemFP8iq347D0eg17AwwbjT+jkR0y6SiNK+Eyr2cTDgpCqc+rJl7yPOsNGNtWkSFLAnkZgnYE3cclhTCeNmSnRBUGRpGf+YLH4vLgdnnPTrZagGhygvVx8nLpbpGbZLpaInNd+OTuRL2L60TeULCxLF90QlagoMkw8299wDezsqe0xnYmbzg0Mfg/rjQ4XCDv/MDPG6qNN3YZ/WE+nTqb7U2/6E8HWE1JgdXP8jueGCld+DWX0P5DPCgYx83ECNZdQccSqayJnXmzLaoEf1kvC7tGeSLILR4zom7XOEtDZeLZvSW0dls/z0+k3cWMN3fRpjPhPYoCDx7i+HrV39r9Tv1EcmQ4O/ZiXo0PvsSEet05u9NJcNnbruw8kUG3Zq4mj+W1X9hBUEClJqm6n1jUyb/xpJp9qEUMP6m7B6xHNcKJRjxkMzZKixHKYSQgrWtreLcvJt2V7O9bpQ7Ue/UelJHBdIEwRLRkGWv3fx9/Y1ZbGuxaNBlBjWKHyCrHd9dd4Xzu7za/oDnBI08a2sjd3FHKsbFaa52Zxw0BwqTEt1ZMCq+jeuhluheQMMY+bNf3ksJOQlU0QfwOqv7MduYr 2XbXPZjX bGp8qSJ5IPH3rxGzFPj/hYv8NzWK56/o7+CRlVyBOVb0syszEfIDnAW8L/oOTqDtNwRf1V/n8szB4ZF2zUBOwP6Yar6ir8DJ5W2xlajDSPq7U/Nxls18xTCWOVmCLXE2r+M8qQILtw7JYilvmc82jj/q8GasRk6s9S47/4Hvy0czlp0dEcVv7K38a6nHSOUoiaM6uwEGm88h5Ejc= 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: 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 812d6f255d84..a6d9a834d869 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) - BUG_ON(!ip->i_lock.mr_writer); + __rwsem_assert_held_write(&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 b70f3e8e4525..1c2484b6afff 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 2492b746912e..fcceb2b4e40d 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1279,9 +1279,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 e9d317a3dafe..15fdaef578fe 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 819a3568b28f..19435fa4c6b3 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -717,9 +717,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); } /*