From patchwork Tue Apr 22 21:29:15 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: 4036081 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 3F39CBFF02 for ; Tue, 22 Apr 2014 21:29:39 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3C411201EC for ; Tue, 22 Apr 2014 21:29:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1B4AD20136 for ; Tue, 22 Apr 2014 21:29:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758649AbaDVV3O (ORCPT ); Tue, 22 Apr 2014 17:29:14 -0400 Received: from mail-ig0-f172.google.com ([209.85.213.172]:60536 "EHLO mail-ig0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758700AbaDVV3J (ORCPT ); Tue, 22 Apr 2014 17:29:09 -0400 Received: by mail-ig0-f172.google.com with SMTP id hn18so3549806igb.17 for ; Tue, 22 Apr 2014 14:29:08 -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=KH0N3ikAdmRXYaasodrSPa/mkhB8qRQYr1GUrAZg3Ik=; b=khwSkff4M0WxX18a3Nd+uZ9pvc8fa/y2XYPxLWGKWlxMHs/vNSTZOMmRmC+xd+U07D j6/8tTQ3ZIuddEte3WMWhwmnVCnZdBtv1Ur0jh9AkxAay1cG5meKSuGxBB30k16QOUQN 1MFFysAAViszJgzT4T16yoV1uEFVFk+/VK+L3e3+azNraZT+ptkGusTTAgajWw1r21Df 7wxB4kqA/+nLIyZfRu3bctKGbIyIZzNjy/EmPi31su6W8+OTI+NUkrj7XyT9fmjb/F1D cp5TnjQ/uAHyJaJOXlZuagIH+s6LyWVCibZK3cFxNESF1/zJY3PvqKLb1gVGAezOL7ue GvDw== X-Gm-Message-State: ALoCoQmEW3TSGR24Pt+QRNGyKVkgDswJ0VuA52P6y7+zpZI/CcNwfxyDiI1RZGA1M5T7pM5FnMVK X-Received: by 10.50.13.100 with SMTP id g4mr353123igc.9.1398202148181; Tue, 22 Apr 2014 14:29:08 -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.06 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 22 Apr 2014 14:29:06 -0700 (PDT) From: Weston Andros Adamson To: trond.myklebust@primarydata.com Cc: linux-nfs@vger.kernel.org, Weston Andros Adamson Subject: [PATCH 07/17] nfs: page group syncing in write path Date: Tue, 22 Apr 2014 17:29:15 -0400 Message-Id: <1398202165-78897-8-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 write path, this is calling end_page_writeback and removing the head request from an inode. Both of these operations 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/write.c | 29 ++++++++++++++++++++--------- include/linux/nfs_page.h | 2 ++ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/fs/nfs/write.c b/fs/nfs/write.c index d1453f2..c6f6449 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -258,12 +258,15 @@ static void nfs_set_page_writeback(struct page *page) } } -static void nfs_end_page_writeback(struct page *page) +static void nfs_end_page_writeback(struct nfs_page *req) { - struct inode *inode = page_file_mapping(page)->host; + struct inode *inode = page_file_mapping(req->wb_page)->host; struct nfs_server *nfss = NFS_SERVER(inode); - end_page_writeback(page); + if (!nfs_page_group_sync_on_bit(req, PG_WB_END)) + return; + + end_page_writeback(req->wb_page); if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH) clear_bdi_congested(&nfss->backing_dev_info, BLK_RW_ASYNC); } @@ -452,12 +455,20 @@ static void nfs_inode_remove_request(struct nfs_page *req) { struct inode *inode = req->wb_context->dentry->d_inode; struct nfs_inode *nfsi = NFS_I(inode); + struct nfs_page *head; + + if (!nfs_page_group_sync_on_bit(req, PG_REMOVE)) + return; + + /* always operate on the *head* of the page group (it's what was + referenced in _add_request) */ + head = req->wb_head; spin_lock(&inode->i_lock); - if (likely(!PageSwapCache(req->wb_page))) { - set_page_private(req->wb_page, 0); - ClearPagePrivate(req->wb_page); - clear_bit(PG_MAPPED, &req->wb_flags); + if (likely(!PageSwapCache(head->wb_page))) { + set_page_private(head->wb_page, 0); + ClearPagePrivate(head->wb_page); + clear_bit(PG_MAPPED, &head->wb_flags); } nfsi->npages--; spin_unlock(&inode->i_lock); @@ -654,7 +665,7 @@ remove_req: nfs_inode_remove_request(req); next: nfs_unlock_request(req); - nfs_end_page_writeback(req->wb_page); + nfs_end_page_writeback(req); do_destroy = !test_bit(NFS_IOHDR_NEED_COMMIT, &hdr->flags); nfs_release_request(req); } @@ -1128,7 +1139,7 @@ static void nfs_redirty_request(struct nfs_page *req) { nfs_mark_request_dirty(req); nfs_unlock_request(req); - nfs_end_page_writeback(req->wb_page); + nfs_end_page_writeback(req); nfs_release_request(req); } diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h index 56b1f1c..41ce262 100644 --- a/include/linux/nfs_page.h +++ b/include/linux/nfs_page.h @@ -30,6 +30,8 @@ enum { 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 */ + PG_WB_END, /* page group sync bit in write path */ + PG_REMOVE, /* page group sync bit in write path */ }; struct nfs_inode;