From patchwork Tue Jul 11 21:53:48 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Trond Myklebust X-Patchwork-Id: 9835513 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E16F660363 for ; Tue, 11 Jul 2017 21:53:56 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C8F2F2856A for ; Tue, 11 Jul 2017 21:53:56 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BAEB528572; Tue, 11 Jul 2017 21:53:56 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1E04E2856A for ; Tue, 11 Jul 2017 21:53:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933355AbdGKVxz (ORCPT ); Tue, 11 Jul 2017 17:53:55 -0400 Received: from mail-it0-f65.google.com ([209.85.214.65]:33880 "EHLO mail-it0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933186AbdGKVxy (ORCPT ); Tue, 11 Jul 2017 17:53:54 -0400 Received: by mail-it0-f65.google.com with SMTP id o202so533679itc.1 for ; Tue, 11 Jul 2017 14:53:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id; bh=Ki8WxPAXUzZJ8ufQsQGnE3E2uCFxbSvYnyQtFD1U2as=; b=u5W8p/JsXXpnR1LGS6L05fiqfcexLF9cA/vC6iOIm6LO2Qf5X/3MUm0hOULcCZ9GSV olYe/3he+EnVKb/ogoAmIL3AUyNj4QpHk5yDvpJ2LT9qLM5X8N7WZ0el5Pa7Oy+5NonO b4HzSn2mBWV2TFqE3cjGMw+arXB0o3bU+R1RF8eV9dHtOBCTtRcHPwW+TLq8zD1sYC/J 98hUOz3EYzAAFdh3x7g007ZJPYjBo5G6Wka1Qqn2yyWk6C3pGKfJujvXt8RRkP9+iOd1 X7a397FohOCoLTa/gkJTmYnZ0lyn5+fOk3V+rnJurIsTplg7zVth4CUHlRRkGol0py+9 HusA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=Ki8WxPAXUzZJ8ufQsQGnE3E2uCFxbSvYnyQtFD1U2as=; b=Fc5cakr8OtAhYFNyJR27PGNQWUYLBkIrKTznXW1UUCN10obtcG6sf9xO2N6erIOf8S nXmXGJ/g3V5HMtt0O/IgYq8uLCCFob+5uEWI3NXTShR4PVZ9MbRonh9JTyASkZHNt+T4 mDifnIxOY5WaKGlkwTLnlav90FhJQUwy9sSfNFvbPP7pt8I1bRGvUbrwGBkrEwIjZacB xLi8XWzmGr9lpnK18ehALl7djqka69I6FL83x3VW7rgmOPoK9c1jkcxrzL3hqkUn+uZl Fv7KgRuQgztBJyQzB9FgSeKMdvNIafEATdefv0VWCD3T3IXiValiLmK/h40p6p3L+Q7B nqJg== X-Gm-Message-State: AIVw112QUd4foEPUKqQmH5Tp4pyxx5a2GNbfp0CtBwSUY9ZR/cawCfIW tuNSrpSLGQ7PFA== X-Received: by 10.36.65.224 with SMTP id b93mr5625900itd.90.1499810033597; Tue, 11 Jul 2017 14:53:53 -0700 (PDT) Received: from leira.trondhjem.org (c-68-49-162-121.hsd1.mi.comcast.net. [68.49.162.121]) by smtp.gmail.com with ESMTPSA id d72sm577094iod.46.2017.07.11.14.53.52 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 11 Jul 2017 14:53:52 -0700 (PDT) From: Trond Myklebust To: anna.schumaker@netapp.com Cc: linux-nfs@vger.kernel.org Subject: [PATCH] NFS: Don't run wake_up_bit() when nobody is waiting... Date: Tue, 11 Jul 2017 17:53:48 -0400 Message-Id: <20170711215348.18596-1-trond.myklebust@primarydata.com> X-Mailer: git-send-email 2.13.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP "perf lock" shows fairly heavy contention for the bit waitqueue locks when doing an I/O heavy workload. Use a bit to tell whether or not there has been contention for a lock so that we can optimise away the bit waitqueue options in those cases. Signed-off-by: Trond Myklebust --- fs/nfs/pagelist.c | 17 ++++++++++++++++- include/linux/nfs_page.h | 2 ++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c index ce5f8d2875ae..046162b79b4b 100644 --- a/fs/nfs/pagelist.c +++ b/fs/nfs/pagelist.c @@ -155,9 +155,12 @@ nfs_page_group_lock(struct nfs_page *req, bool nonblock) if (!test_and_set_bit(PG_HEADLOCK, &head->wb_flags)) return 0; - if (!nonblock) + if (!nonblock) { + set_bit(PG_CONTENDED1, &head->wb_flags); + smp_mb__after_atomic(); return wait_on_bit_lock(&head->wb_flags, PG_HEADLOCK, TASK_UNINTERRUPTIBLE); + } return -EAGAIN; } @@ -175,6 +178,10 @@ nfs_page_group_lock_wait(struct nfs_page *req) WARN_ON_ONCE(head != head->wb_head); + if (!test_bit(PG_HEADLOCK, &head->wb_flags)) + return; + set_bit(PG_CONTENDED1, &head->wb_flags); + smp_mb__after_atomic(); wait_on_bit(&head->wb_flags, PG_HEADLOCK, TASK_UNINTERRUPTIBLE); } @@ -193,6 +200,8 @@ nfs_page_group_unlock(struct nfs_page *req) smp_mb__before_atomic(); clear_bit(PG_HEADLOCK, &head->wb_flags); smp_mb__after_atomic(); + if (!test_bit(PG_CONTENDED1, &head->wb_flags)) + return; wake_up_bit(&head->wb_flags, PG_HEADLOCK); } @@ -383,6 +392,8 @@ void nfs_unlock_request(struct nfs_page *req) smp_mb__before_atomic(); clear_bit(PG_BUSY, &req->wb_flags); smp_mb__after_atomic(); + if (!test_bit(PG_CONTENDED2, &req->wb_flags)) + return; wake_up_bit(&req->wb_flags, PG_BUSY); } @@ -465,6 +476,10 @@ void nfs_release_request(struct nfs_page *req) int nfs_wait_on_request(struct nfs_page *req) { + if (!test_bit(PG_BUSY, &req->wb_flags)) + return 0; + set_bit(PG_CONTENDED2, &req->wb_flags); + smp_mb__after_atomic(); return wait_on_bit_io(&req->wb_flags, PG_BUSY, TASK_UNINTERRUPTIBLE); } diff --git a/include/linux/nfs_page.h b/include/linux/nfs_page.h index abbee2d15dce..d67b67ae6c8b 100644 --- a/include/linux/nfs_page.h +++ b/include/linux/nfs_page.h @@ -33,6 +33,8 @@ enum { 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 */ + PG_CONTENDED1, /* Is someone waiting for a lock? */ + PG_CONTENDED2, /* Is someone waiting for a lock? */ }; struct nfs_inode;