From patchwork Thu May 28 18:50:54 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tejun Heo X-Patchwork-Id: 6500631 Return-Path: X-Original-To: patchwork-linux-fsdevel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 3FE4A9F38C for ; Thu, 28 May 2015 18:52:52 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 84D6820732 for ; Thu, 28 May 2015 18:52:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2A71A2076E for ; Thu, 28 May 2015 18:52:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754731AbbE1Swi (ORCPT ); Thu, 28 May 2015 14:52:38 -0400 Received: from mail-qc0-f169.google.com ([209.85.216.169]:35128 "EHLO mail-qc0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754142AbbE1SvL (ORCPT ); Thu, 28 May 2015 14:51:11 -0400 Received: by qchk10 with SMTP id k10so18273529qch.2; Thu, 28 May 2015 11:51:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=1dv5tN71KsD9PWzEzEZwh7Cz84Ek4GckMx5ugVLDoU8=; b=tKgP+kq76LqCi+O/ej/bECjwz4A1+cczdaGwMBpPbRelWpsFuMYC0iH9Ol/25WXBCU ujGQlr9r8i2+7NOo5se4NefCG7Xmh4uqX4ea9V3QGZygcMqWfo2E1MRdlNzgeJy8PX+U Ph6Q98lf8mAMnsF+jrfM0M7tUqSPPgawsDMlm7O8Kz6inQPUqnngBMouUoM/S3vKPTUl DtQdYA2pzQjeYt1cjFESzoQRZPWxfbtdXK+0WbCDifq/RsI2Fhxdj16jhZgaLZNSMmHM zugJeVsFL2l/oVQdv6qJpdY69tkHL11SlArITA7zfqSc6m+X3gM5Zy36FUjFUcqKpqMf /Kdg== X-Received: by 10.55.18.144 with SMTP id 16mr8114354qks.17.1432839070955; Thu, 28 May 2015 11:51:10 -0700 (PDT) Received: from htj.duckdns.org.lan (207-38-238-8.c3-0.wsd-ubr1.qens-wsd.ny.cable.rcn.com. [207.38.238.8]) by mx.google.com with ESMTPSA id c20sm1466282qka.21.2015.05.28.11.51.09 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 May 2015 11:51:10 -0700 (PDT) From: Tejun Heo To: axboe@kernel.dk Cc: linux-kernel@vger.kernel.org, jack@suse.cz, hch@infradead.org, hannes@cmpxchg.org, linux-fsdevel@vger.kernel.org, vgoyal@redhat.com, lizefan@huawei.com, cgroups@vger.kernel.org, linux-mm@kvack.org, mhocko@suse.cz, clm@fb.com, fengguang.wu@intel.com, david@fromorbit.com, gthelen@google.com, khlebnikov@yandex-team.ru, Tejun Heo Subject: [PATCH 6/9] writeback: use unlocked_inode_to_wb transaction in inode_congested() Date: Thu, 28 May 2015 14:50:54 -0400 Message-Id: <1432839057-17609-7-git-send-email-tj@kernel.org> X-Mailer: git-send-email 2.4.0 In-Reply-To: <1432839057-17609-1-git-send-email-tj@kernel.org> References: <1432839057-17609-1-git-send-email-tj@kernel.org> Sender: linux-fsdevel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_RP_MATCHES_RCVD,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Similar to wb stat updates, inode_congested() accesses the associated wb of an inode locklessly, which will break with foreign inode wb switching. This path updates inode_congested() to use unlocked inode wb access transaction introduced by the previous patch. Combined with the previous two patches, this makes all wb list and access operations to be protected by either of inode->i_lock, wb->list_lock, or mapping->tree_lock while wb switching is in progress. Signed-off-by: Tejun Heo Cc: Jens Axboe Cc: Jan Kara Cc: Wu Fengguang Cc: Greg Thelen --- fs/fs-writeback.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 08f5496..25458fa 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -618,10 +618,18 @@ void wbc_account_io(struct writeback_control *wbc, struct page *page, */ int inode_congested(struct inode *inode, int cong_bits) { - if (inode) { - struct bdi_writeback *wb = inode_to_wb(inode); - if (wb) - return wb_congested(wb, cong_bits); + /* + * Once set, ->i_wb never becomes NULL while the inode is alive. + * Start transaction iff ->i_wb is visible. + */ + if (inode && inode_to_wb(inode)) { + struct bdi_writeback *wb; + bool locked, congested; + + wb = unlocked_inode_to_wb_begin(inode, &locked); + congested = wb_congested(wb, cong_bits); + unlocked_inode_to_wb_end(inode, locked); + return congested; } return wb_congested(&inode_to_bdi(inode)->wb, cong_bits);