From patchwork Wed Aug 5 21:13:31 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 6953171 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.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id C40409F39D for ; Wed, 5 Aug 2015 21:14:05 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id ACDDE20443 for ; Wed, 5 Aug 2015 21:14:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6F799205E5 for ; Wed, 5 Aug 2015 21:14:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752471AbbHEVN5 (ORCPT ); Wed, 5 Aug 2015 17:13:57 -0400 Received: from mail-yk0-f173.google.com ([209.85.160.173]:36607 "EHLO mail-yk0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752472AbbHEVNx (ORCPT ); Wed, 5 Aug 2015 17:13:53 -0400 Received: by ykeo23 with SMTP id o23so46445941yke.3 for ; Wed, 05 Aug 2015 14:13:52 -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=VNZUmdekjHBakobGjmrKuPt0PxSSWroLSt+8qyrKEnk=; b=Sf/JtP9iXS87YO27Uw8wD2znjCpLdGatHMoeoiioER78zsItPY1rrzQtEM+GIg7P+6 9Qs1ukjhTVYtPMVgNwAPkdXzJvXgQX1FhH7e1wtEPS9Zk1ZqI1c5tcgWxjpD7a7763Cg JMOLprPzWxe50CGOMxAqIZ1fLNV+2fFAjMd+hNyekBED/WcCtlMgZ1wwAiPjNLVacDry bJxhWBNhsx/hGh6lLY9oEKCWUgI4Sk5s5SGD3PZ+mNmLTzLrcnjqITSb9qmLJahFBQ+Q wCDbSNPSu1EIuUd7MjY6w7NU77kZMgxs30Q3I7DsK+D4ssa6nLgVxaz5k1E0JpG9y7y8 D3bw== X-Gm-Message-State: ALoCoQnDGQ4T9gfrE/VaCID6ChhYx7bvXV2xOTlC3lgpoIRYKBw9UT4mqBlWWp8LkBPPnVOwmmbi X-Received: by 10.13.253.5 with SMTP id n5mr11950358ywf.24.1438809232795; Wed, 05 Aug 2015 14:13:52 -0700 (PDT) Received: from tlielax.poochiereds.net (cpe-45-37-211-243.nc.res.rr.com. [45.37.211.243]) by smtp.googlemail.com with ESMTPSA id p81sm3975306ywe.19.2015.08.05.14.13.52 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Aug 2015 14:13:52 -0700 (PDT) From: Jeff Layton X-Google-Original-From: Jeff Layton To: bfields@fieldses.org Cc: linux-nfs@vger.kernel.org Subject: [PATCH v2 13/18] nfsd: add new tracepoints for nfsd_file cache Date: Wed, 5 Aug 2015 17:13:31 -0400 Message-Id: <1438809216-4846-14-git-send-email-jeff.layton@primarydata.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1438809216-4846-1-git-send-email-jeff.layton@primarydata.com> References: <1438264341-18048-1-git-send-email-jeff.layton@primarydata.com> <1438809216-4846-1-git-send-email-jeff.layton@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.0 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 Signed-off-by: Jeff Layton --- fs/nfsd/filecache.c | 19 ++++++++-- fs/nfsd/trace.h | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 3 deletions(-) diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c index 0adcc674441d..44dee985864b 100644 --- a/fs/nfsd/filecache.c +++ b/fs/nfsd/filecache.c @@ -14,6 +14,7 @@ #include "nfsd.h" #include "nfsfh.h" #include "filecache.h" +#include "trace.h" #define NFSDDBG_FACILITY NFSDDBG_FH @@ -74,6 +75,7 @@ nfsd_file_alloc(struct knfsd_fh *fh, unsigned int may, unsigned int hashval) if (may & NFSD_MAY_READ) __set_bit(NFSD_FILE_BREAK_READ, &nf->nf_flags); } + trace_nfsd_file_alloc(nf); } return nf; } @@ -81,6 +83,7 @@ nfsd_file_alloc(struct knfsd_fh *fh, unsigned int may, unsigned int hashval) static void nfsd_file_put_final(struct nfsd_file *nf) { + trace_nfsd_file_put_final(nf); if (nf->nf_file) fput(nf->nf_file); kfree_rcu(nf, nf_rcu); @@ -89,6 +92,7 @@ nfsd_file_put_final(struct nfsd_file *nf) static void nfsd_file_unhash(struct nfsd_file *nf) { + trace_nfsd_file_unhash(nf); if (test_and_clear_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { hlist_del_rcu(&nf->nf_node); nfsd_file_count_dec(); @@ -98,6 +102,7 @@ nfsd_file_unhash(struct nfsd_file *nf) static void nfsd_file_put_locked(struct nfsd_file *nf, struct list_head *dispose) { + trace_nfsd_file_put_locked(nf); if (!atomic_dec_and_test(&nf->nf_ref)) { nf->nf_time = jiffies; return; @@ -110,6 +115,7 @@ nfsd_file_put_locked(struct nfsd_file *nf, struct list_head *dispose) void nfsd_file_put(struct nfsd_file *nf) { + trace_nfsd_file_put(nf); if (!atomic_dec_and_lock(&nf->nf_ref, &nfsd_file_hashtbl[nf->nf_hashval].nfb_lock)) { nf->nf_time = jiffies; @@ -284,8 +290,11 @@ retry: if (!new) { new = nfsd_file_alloc(&fhp->fh_handle, may_flags, hashval); - if (!new) + if (!new) { + trace_nfsd_file_acquire(hashval, fh, may_flags, NULL, + nfserr_jukebox); return nfserr_jukebox; + } } spin_lock(&nfsd_file_hashtbl[hashval].nfb_lock); @@ -364,13 +373,17 @@ wait_for_construction: } } out: - if (status == nfs_ok) + if (status == nfs_ok) { *pnf = nf; - else + } else { nfsd_file_put(nf); + nf = NULL; + } if (new) nfsd_file_put(new); + + trace_nfsd_file_acquire(hashval, fh, may_flags, nf, status); return status; open_file: status = nfsd_open(rqstp, fhp, S_IFREG, may_flags, &nf->nf_file); diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h index 0befe762762b..ff26d91f8106 100644 --- a/fs/nfsd/trace.h +++ b/fs/nfsd/trace.h @@ -10,6 +10,8 @@ #include #include "state.h" +#include "filecache.h" +#include "vfs.h" DECLARE_EVENT_CLASS(nfsd_stateid_class, TP_PROTO(stateid_t *stp), @@ -48,6 +50,103 @@ DEFINE_STATEID_EVENT(layout_recall_done); DEFINE_STATEID_EVENT(layout_recall_fail); DEFINE_STATEID_EVENT(layout_recall_release); +#define show_nf_flags(val) \ + __print_flags(val, "|", \ + { 1 << NFSD_FILE_HASHED, "HASHED" }, \ + { 1 << NFSD_FILE_PENDING, "PENDING" }, \ + { 1 << NFSD_FILE_BREAK_READ, "BREAK_READ" }, \ + { 1 << NFSD_FILE_BREAK_WRITE, "BREAK_WRITE" }) + +/* FIXME: This should probably be fleshed out in the future. */ +#define show_nf_may(val) \ + __print_flags(val, "|", \ + { NFSD_MAY_READ, "READ" }, \ + { NFSD_MAY_WRITE, "WRITE" }, \ + { NFSD_MAY_NOT_BREAK_LEASE, "NOT_BREAK_LEASE" }) + +#define show_nf_fh(fh) \ + __print_hex((char *)&fh.fh_base, fh.fh_size) + +DECLARE_EVENT_CLASS(nfsd_file_class, + TP_PROTO(struct nfsd_file *nf), + TP_ARGS(nf), + TP_STRUCT__entry( + __field(unsigned int, nf_hashval) + __field_struct(struct knfsd_fh, nf_handle) + __field(int, nf_ref) + __field(unsigned long, nf_flags) + __field(unsigned char, nf_may) + __field(unsigned long, nf_time) + __field(struct file *, nf_file) + ), + TP_fast_assign( + __entry->nf_hashval = nf->nf_hashval; + __entry->nf_handle = nf->nf_handle; + __entry->nf_ref = atomic_read(&nf->nf_ref); + __entry->nf_flags = nf->nf_flags; + __entry->nf_may = nf->nf_may; + __entry->nf_time = nf->nf_time; + __entry->nf_file = nf->nf_file; + ), + TP_printk("hash=0x%x handle=%s ref=%d flags=%s may=%s time=%lu file=%p", + __entry->nf_hashval, + show_nf_fh(__entry->nf_handle), + __entry->nf_ref, + show_nf_flags(__entry->nf_flags), + show_nf_may(__entry->nf_may), + __entry->nf_time, + __entry->nf_file) +) + +#define DEFINE_NFSD_FILE_EVENT(name) \ +DEFINE_EVENT(nfsd_file_class, name, \ + TP_PROTO(struct nfsd_file *nf), \ + TP_ARGS(nf)) + +DEFINE_NFSD_FILE_EVENT(nfsd_file_alloc); +DEFINE_NFSD_FILE_EVENT(nfsd_file_put_final); +DEFINE_NFSD_FILE_EVENT(nfsd_file_unhash); +DEFINE_NFSD_FILE_EVENT(nfsd_file_put); +DEFINE_NFSD_FILE_EVENT(nfsd_file_put_locked); + +TRACE_EVENT(nfsd_file_acquire, + TP_PROTO(unsigned int hash, struct knfsd_fh *handle, + unsigned int may_flags, struct nfsd_file *nf, + __be32 status), + + TP_ARGS(hash, handle, may_flags, nf, status), + + TP_STRUCT__entry( + __field(unsigned int, hash) + __field_struct(struct knfsd_fh, handle) + __field(unsigned int, may_flags) + __field(int, nf_ref) + __field(unsigned long, nf_flags) + __field(unsigned char, nf_may) + __field(unsigned long, nf_time) + __field(struct file *, nf_file) + __field(__be32, status) + ), + + TP_fast_assign( + __entry->hash = hash; + __entry->handle = *handle; + __entry->may_flags = may_flags; + __entry->nf_ref = nf ? atomic_read(&nf->nf_ref) : 0; + __entry->nf_flags = nf ? nf->nf_flags : 0; + __entry->nf_may = nf ? nf->nf_may : 0; + __entry->nf_time = nf ? nf->nf_time : 0; + __entry->nf_file = nf ? nf->nf_file : NULL; + __entry->status = status; + ), + + TP_printk("hash=0x%x handle=%s may_flags=%s ref=%d nf_flags=%s nf_may=%s nf_time=%lu nf_file=0x%p status=%u", + __entry->hash, show_nf_fh(__entry->handle), + show_nf_may(__entry->may_flags), __entry->nf_ref, + show_nf_flags(__entry->nf_flags), + show_nf_may(__entry->nf_may), __entry->nf_time, + __entry->nf_file, be32_to_cpu(__entry->status)) +); #endif /* _NFSD_TRACE_H */ #undef TRACE_INCLUDE_PATH