Received: by 2002:a25:683:0:0:0:0:0 with SMTP id 125csp3999365ybg; Sun, 7 Jun 2020 18:01:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwXwSIsXEvRMl9/fN0I+hyDnWXYnsDcVlSguXNlDs92KNPjNbrd4KPlUGqROzKolCjwclsN X-Received: by 2002:a17:906:d0d7:: with SMTP id bq23mr19456801ejb.259.1591578082299; Sun, 07 Jun 2020 18:01:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1591578082; cv=none; d=google.com; s=arc-20160816; b=yRrLv0hBcvBk2eOOrC39lMxTHfFZq+qcrHoW2+5IC4uaXyfHkwPcqDlxbMphky6lgC V3z2uBjs3kGdBBTnoe6vDdHo0cFWKabLdJawgxcXus+g2Dus9E4ES5u/JiDeq8G69w63 PkIxPABf2JMueb7Sk9vDEYM1NcMxLM827G2G+xh17X6+I3ST9RnMkilJ5kdQ4fhbQzBD 8iqVLN5uSrAVP8RCaHGXRhCQCX9QnoDoppPLO6fQtDbRNv4xEfvBxzvlN/EWBpSMncoI 8SGkHIZQt/1pa+H7am6Rx3MkfYjGnrPf7g4AVS+ad0zLPorddYzdx5kPyydG2aZzuNCH bnHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=6j59hR0ZkjaF3BFg/dGpF8b2cLPpeHKpKO+/4x14+CU=; b=RdJDnU923RpXvJwdi/YOrCZtys6BnR98HKZIks6z5aNu3i7bv+0jBdTmAUNmNFkORS FShV3dh6ie19gZVaRGmc/SLQxjavVKzKzer5X7V9yvhxo7tsXSQqVgrVhUPxBqPUi3mA wJwxym9sRZZwciwwVw9MF/fu6hgWFyv7AvJzDTNODwiGcPJinWBMfAvrBAY7PJiYv4+o RC6fFw9D6i3dH3JiDMAfTDVWnJKUGF7PLEb6b1FqahYo5+uljj8Ywvtfs4B7svGSxt/o TPB6A+5rPnDaD3mQwOYV7GKmf8U7LqGGiS6O+SUx2fHwCcXGpgTfHCb/g7wdzBdtcQug dM7w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m9si7738261edp.531.2020.06.07.18.00.59; Sun, 07 Jun 2020 18:01:22 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728988AbgFHA6n (ORCPT + 99 others); Sun, 7 Jun 2020 20:58:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58436 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728973AbgFHA6l (ORCPT ); Sun, 7 Jun 2020 20:58:41 -0400 Received: from Galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1269DC08C5C5; Sun, 7 Jun 2020 17:58:41 -0700 (PDT) Received: from [5.158.153.53] (helo=debian-buster-darwi.lab.linutronix.de.) by Galois.linutronix.de with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1ji67R-0000vA-Ml; Mon, 08 Jun 2020 02:58:29 +0200 From: "Ahmed S. Darwish" To: Peter Zijlstra , Ingo Molnar , Will Deacon Cc: Thomas Gleixner , "Paul E. McKenney" , "Sebastian A. Siewior" , Steven Rostedt , LKML , "Ahmed S. Darwish" , Alexander Viro , Mauro Carvalho Chehab , Jonathan Corbet , linux-fsdevel@vger.kernel.org Subject: [PATCH v2 12/18] vfs: Use sequence counter with associated spinlock Date: Mon, 8 Jun 2020 02:57:23 +0200 Message-Id: <20200608005729.1874024-13-a.darwish@linutronix.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200608005729.1874024-1-a.darwish@linutronix.de> References: <20200519214547.352050-1-a.darwish@linutronix.de> <20200608005729.1874024-1-a.darwish@linutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org A sequence counter write side critical section must be protected by some form of locking to serialize writers. A plain seqcount_t does not contain the information of which lock must be held when entering a write side critical section. Use the new seqcount_spinlock_t data type, which allows to associate a spinlock with the sequence counter. This enables lockdep to verify that the spinlock used for writer serialization is held when the write side critical section is entered. If lockdep is disabled this lock association is compiled out and has neither storage size nor runtime overhead. Signed-off-by: Ahmed S. Darwish --- fs/dcache.c | 2 +- fs/fs_struct.c | 4 ++-- include/linux/dcache.h | 2 +- include/linux/fs_struct.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/dcache.c b/fs/dcache.c index b280e07e162b..e5f365d8fd67 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1727,7 +1727,7 @@ static struct dentry *__d_alloc(struct super_block *sb, const struct qstr *name) dentry->d_lockref.count = 1; dentry->d_flags = 0; spin_lock_init(&dentry->d_lock); - seqcount_init(&dentry->d_seq); + seqcount_spinlock_init(&dentry->d_seq, &dentry->d_lock); dentry->d_inode = NULL; dentry->d_parent = dentry; dentry->d_sb = sb; diff --git a/fs/fs_struct.c b/fs/fs_struct.c index ca639ed967b7..04b3f5b9c629 100644 --- a/fs/fs_struct.c +++ b/fs/fs_struct.c @@ -117,7 +117,7 @@ struct fs_struct *copy_fs_struct(struct fs_struct *old) fs->users = 1; fs->in_exec = 0; spin_lock_init(&fs->lock); - seqcount_init(&fs->seq); + seqcount_spinlock_init(&fs->seq, &fs->lock); fs->umask = old->umask; spin_lock(&old->lock); @@ -163,6 +163,6 @@ EXPORT_SYMBOL(current_umask); struct fs_struct init_fs = { .users = 1, .lock = __SPIN_LOCK_UNLOCKED(init_fs.lock), - .seq = SEQCNT_ZERO(init_fs.seq), + .seq = SEQCNT_SPINLOCK_ZERO(init_fs.seq, &init_fs.lock), .umask = 0022, }; diff --git a/include/linux/dcache.h b/include/linux/dcache.h index c1488cc84fd9..235563da356d 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -89,7 +89,7 @@ extern struct dentry_stat_t dentry_stat; struct dentry { /* RCU lookup touched fields */ unsigned int d_flags; /* protected by d_lock */ - seqcount_t d_seq; /* per dentry seqlock */ + seqcount_spinlock_t d_seq; /* per dentry seqlock */ struct hlist_bl_node d_hash; /* lookup hash list */ struct dentry *d_parent; /* parent directory */ struct qstr d_name; diff --git a/include/linux/fs_struct.h b/include/linux/fs_struct.h index cf1015abfbf2..783b48dedb72 100644 --- a/include/linux/fs_struct.h +++ b/include/linux/fs_struct.h @@ -9,7 +9,7 @@ struct fs_struct { int users; spinlock_t lock; - seqcount_t seq; + seqcount_spinlock_t seq; int umask; int in_exec; struct path root, pwd; -- 2.20.1