From patchwork Tue Apr 22 21:29:14 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Weston Andros Adamson X-Patchwork-Id: 4036191 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 619659F1F4 for ; Tue, 22 Apr 2014 21:30:26 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 5FC4F201EC for ; Tue, 22 Apr 2014 21:30:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3FC192018A for ; Tue, 22 Apr 2014 21:30:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932502AbaDVV3j (ORCPT ); Tue, 22 Apr 2014 17:29:39 -0400 Received: from mail-ig0-f182.google.com ([209.85.213.182]:59625 "EHLO mail-ig0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758796AbaDVV3G (ORCPT ); Tue, 22 Apr 2014 17:29:06 -0400 Received: by mail-ig0-f182.google.com with SMTP id uy17so217125igb.15 for ; Tue, 22 Apr 2014 14:29:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=RY5ywPSDRZcQSQM2lh/mSQ7jenzeWDT+RxifGQkXnMo=; b=MWVl34xxDwdDCqiD9xYUQZV3VfMGPZhVxL5vfBWKr4/mrolDMXbmM8XgkqWjRzEEhW vYxlGXjON2PxuI079hwInWn09qcGkaTIt2S+vd6wGJxvuGS65zMKskQO9Y7XTQ6VZ1W/ h/A1e7h1n62eEv8Ca72A8UKpR+7v1HqCHSbS5Lo5LWhaaToOsJC0lb3jieZrO8s1gGZD 10hGqD9menNulb3aMZGshQ0O0/dWIELnlWl0tlO+0188JqWBNNOBORYzcbdU4k1y8uDv s2zUqntYNn/ZM9GpL5ggu91aYUb7r8KAzZWrDNpVMjZiecNge5i2UwMHQVbTslNphFmm dW3A== X-Gm-Message-State: ALoCoQkomEkGe9F6WL3cW7iWY3HccvmIGa1EbSBo+WYrGAh6tLnFr4KSBMWYfL1sUWj52F3hfUp0 X-Received: by 10.50.112.167 with SMTP id ir7mr302077igb.27.1398202146241; Tue, 22 Apr 2014 14:29:06 -0700 (PDT) Received: from gavrio-wifi.robotsandstuff.fake (c-98-209-19-144.hsd1.mi.comcast.net. [98.209.19.144]) by mx.google.com with ESMTPSA id j9sm31115582igu.10.2014.04.22.14.29.04 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 22 Apr 2014 14:29:05 -0700 (PDT) From: Weston Andros Adamson To: trond.myklebust@primarydata.com Cc: linux-nfs@vger.kernel.org, Weston Andros Adamson Subject: [PATCH 06/17] nfs: page group syncing in read path Date: Tue, 22 Apr 2014 17:29:14 -0400 Message-Id: <1398202165-78897-7-git-send-email-dros@primarydata.com> X-Mailer: git-send-email 1.8.5.2 (Apple Git-48) In-Reply-To: <1398202165-78897-1-git-send-email-dros@primarydata.com> References: <1398202165-78897-1-git-send-email-dros@primarydata.com> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, 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 Operations that modify state for a whole page must be syncronized across all requests within a page group. In the read path, this is calling unlock_page and SetPageUptodate. Both of these functions should not be called until all requests in a page group have reached the point where they would call them. This patch should have no effect yet since all page groups currently have one request, but will come into play when pg_test functions are modified to split pages into sub-page regions. Signed-off-by: Weston Andros Adamson --- fs/nfs/read.c | 22 +++++++++++++++++----- include/linux/nfs_page.h | 2 ++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/fs/nfs/read.c b/fs/nfs/read.c index ee0a3cd..c774810 100644 --- a/fs/nfs/read.c +++ b/fs/nfs/read.c @@ -158,10 +158,16 @@ static void nfs_readpage_release(struct nfs_page *req) { struct inode *d_inode = req->wb_context->dentry->d_inode; - if (PageUptodate(req->wb_page)) - nfs_readpage_to_fscache(d_inode, req->wb_page, 0); + dprintk("NFS: read done (%s/%llu %d@%lld)\n", d_inode->i_sb->s_id, + (unsigned long long)NFS_FILEID(d_inode), req->wb_bytes, + (long long)req_offset(req)); - unlock_page(req->wb_page); + if (nfs_page_group_sync_on_bit(req, PG_UNLOCKPAGE)) { + if (PageUptodate(req->wb_page)) + nfs_readpage_to_fscache(d_inode, req->wb_page, 0); + + unlock_page(req->wb_page); + } dprintk("NFS: read done (%s/%Lu %d@%Ld)\n", req->wb_context->dentry->d_inode->i_sb->s_id, @@ -171,6 +177,12 @@ static void nfs_readpage_release(struct nfs_page *req) nfs_release_request(req); } +static void nfs_page_group_set_uptodate(struct nfs_page *req) +{ + if (nfs_page_group_sync_on_bit(req, PG_UPTODATE)) + SetPageUptodate(req->wb_page); +} + /* Note io was page aligned */ static void nfs_read_completion(struct nfs_pgio_header *hdr) { @@ -193,9 +205,9 @@ static void nfs_read_completion(struct nfs_pgio_header *hdr) bytes += req->wb_bytes; if (test_bit(NFS_IOHDR_ERROR, &hdr->flags)) { if (bytes <= hdr->good_bytes) - SetPageUptodate(page); + nfs_page_group_set_uptodate(req); } else - SetPageUptodate(page); + nfs_page_group_set_uptodate(req); nfs_list_remove_request(req); nfs_readpage_release(req); } diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h index 1fb161b..56b1f1c 100644 --- a/include/linux/nfs_page.h +++ b/include/linux/nfs_page.h @@ -28,6 +28,8 @@ enum { PG_COMMIT_TO_DS, /* used by pnfs layouts */ PG_HEADLOCK, /* page group lock of wb_head */ PG_TEARDOWN, /* page group sync for destroy */ + PG_UNLOCKPAGE, /* page group sync bit in read path */ + PG_UPTODATE, /* page group sync bit in read path */ }; struct nfs_inode;