Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp1121ybh; Mon, 20 Jul 2020 08:59:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzn88hGhj4+tKa1wtWNBl47dMpSERYu2L3MmTe9I0l/VlJSEkNfszfD86dwpMHXjAgk6w2G X-Received: by 2002:a17:906:3a04:: with SMTP id z4mr20838403eje.441.1595260784707; Mon, 20 Jul 2020 08:59:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595260784; cv=none; d=google.com; s=arc-20160816; b=HBLvb0wM5mJyr1GCX+ucLYPFc1zqpScTACvG4HEC84GQuGnilN0GvvNqi3xcbkt27r 34Yy0TGWcbZDLWufOJxin3UkiFkNHoLe7i9u044xtQX9NKmvCdEQ9T+vms4Ye2E4NKOZ unS4n4BFF29p8hKu5opinZkus/DnIKJBTADEqlxh+u+7jcb5NQBJ/5Vo6WxmGNDma93F E0ylVQeA1ui4L3fe7WoZPF8E0MnVrxH0aYstanEl5Ft2nXdelrgFEsgAYbqDCxs0E19P Df/BBQFaz++hQvb6uaMOJsNl4ySu+qDUhYYk/gM1V78AOhhKD9Wrv5i8KlLz/XjMAacd I7RQ== 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:dkim-signature :dkim-signature:from; bh=uclKhm3C3HWRsWu3kv+xtaxPcHBGBDKRm9M/IiUD/fg=; b=F8j2FNzB8ux03coVD4QOYAdDfAY2ISXwOym8Py1RthvbcBfUsWm2V3k4+AICPNf849 8O1AuesAnQ7h0MZY+WEm5Sr0XnMWI/F9xKDx3AK6fwu7Rgd5YuZqPgkYsM+tOuPqGFsv +x2s9FpnxfJugsmZcAuaki0fcTWImBT4YVXV7WMXemywS4N2pCtJaBWUuLZUZZVg3WTl 8oGOFrnQFXiFp1E6d4NBN6AljToJKZWuag5u60NqK1r1qa+PohoKuAJlLTVPZcW3KjaT 8CbW2MjVJfFp8gV36P6L6F7Y/TZZpOgAKT6h3fz0OQhnv2B/SoudtFPgQS+vZPE8Rdho eD2A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=v1TCrN7a; dkim=neutral (no key) header.i=@linutronix.de; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i17si10998621edv.60.2020.07.20.08.59.17; Mon, 20 Jul 2020 08:59:44 -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; dkim=pass header.i=@linutronix.de header.s=2020 header.b=v1TCrN7a; dkim=neutral (no key) header.i=@linutronix.de; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731877AbgGTP5L (ORCPT + 99 others); Mon, 20 Jul 2020 11:57:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41636 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731582AbgGTP5A (ORCPT ); Mon, 20 Jul 2020 11:57:00 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F0330C061794; Mon, 20 Jul 2020 08:56:59 -0700 (PDT) From: "Ahmed S. Darwish" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1595260618; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uclKhm3C3HWRsWu3kv+xtaxPcHBGBDKRm9M/IiUD/fg=; b=v1TCrN7a6i4F79ocfMgeLLNWWn5H2ouDIUUyWyMVYnZYY8GvS7F7f7uGgAa5V45kS4yeUl /a48BhDUtDvVOM6456JHge7Lw3Db6HZhoCmFtYeQv9g/wrRV187NQngN35/XP2K/MM2Y66 2Nml72hcndYDeyoTlkuus1LtzqFMLq5wws6zOfXIKauMSYyV1b9R0shDW9+zwD59UcSLiR oyGqWgPPC6V7igT8Z5uvGdzuGeffdJkaNSBWdfyt0j3lSHDDUJJ42KJ4WFxVRRo0XwYEyC t0GJA7Mf1R1eQ3/yQIJrQ8CkQmKO484A1SYlxQW5rdvTzP6PB87jrTBfMiFs7Q== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1595260618; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=uclKhm3C3HWRsWu3kv+xtaxPcHBGBDKRm9M/IiUD/fg=; b=Y78QWRZnhKYxklESsDYd76ZuXXIFBDKATthEsq0dxV74+o0RZ2QM1RmkzhmTKDHyzIhzGJ s1kapUUFht/uFMBw== 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 v4 18/24] vfs: Use sequence counter with associated spinlock Date: Mon, 20 Jul 2020 17:55:24 +0200 Message-Id: <20200720155530.1173732-19-a.darwish@linutronix.de> In-Reply-To: <20200720155530.1173732-1-a.darwish@linutronix.de> References: <20200519214547.352050-1-a.darwish@linutronix.de> <20200720155530.1173732-1-a.darwish@linutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 361ea7ab30ea..ea0485861d93 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1746,7 +1746,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 a81f0c3cf352..65d975bf9390 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