All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jeff Layton <jlayton@poochiereds.net>
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	[thread overview]
Message-ID: <1438809216-4846-14-git-send-email-jeff.layton@primarydata.com> (raw)
In-Reply-To: <1438809216-4846-1-git-send-email-jeff.layton@primarydata.com>

Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
---
 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 <linux/tracepoint.h>
 
 #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
-- 
2.4.3


  parent reply	other threads:[~2015-08-05 21:13 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-30 13:52 [PATCH 0/9] nfsd: open file caching for v2/3 Jeff Layton
2015-07-30 13:52 ` [PATCH] nfsd: do nfs4_check_fh in nfs4_check_file instead of nfs4_check_olstateid Jeff Layton
2015-07-30 13:53   ` Jeff Layton
2015-07-30 15:51   ` Christoph Hellwig
2015-07-30 16:20     ` Jeff Layton
2015-07-30 16:34       ` Christoph Hellwig
2015-07-30 13:52 ` [PATCH 1/9] nfsd: include linux/nfs4.h in export.h Jeff Layton
2015-07-30 13:52 ` [PATCH 2/9] nfsd: move some file caching helpers to a common header Jeff Layton
2015-07-30 13:52 ` [PATCH 3/9] nfsd: convert laundry_wq to something less nfsd4 specific Jeff Layton
2015-07-31 21:32   ` J. Bruce Fields
2015-07-31 22:27     ` Jeff Layton
2015-07-30 13:52 ` [PATCH 4/9] nfsd: add a new struct file caching facility to nfsd Jeff Layton
2015-07-30 13:52 ` [PATCH 5/9] nfsd: hook up nfsd_write to the new nfsd_file cache Jeff Layton
2015-07-30 13:52 ` [PATCH 6/9] nfsd: hook up nfsd_read to the " Jeff Layton
2015-07-30 13:52 ` [PATCH 7/9] sunrpc: add a new cache_detail operation for when a cache is flushed Jeff Layton
2015-07-30 13:52 ` [PATCH 8/9] nfsd: add a ->flush routine to svc_export_cache Jeff Layton
2015-07-30 13:52 ` [PATCH 9/9] nfsd: allow the file cache expire time to be tunable Jeff Layton
2015-08-05 21:13 ` [PATCH v2 00/18] nfsd: open file caching for v2/3 Jeff Layton
2015-08-05 21:13   ` [PATCH v2 01/18] nfsd: include linux/nfs4.h in export.h Jeff Layton
2015-08-09  7:12     ` Christoph Hellwig
2015-08-05 21:13   ` [PATCH v2 02/18] nfsd: move some file caching helpers to a common header Jeff Layton
2015-08-07 15:25     ` Kinglong Mee
2015-08-07 17:07       ` Jeff Layton
2015-08-09  7:12     ` Christoph Hellwig
2015-08-05 21:13   ` [PATCH v2 03/18] nfsd: convert laundry_wq to something less nfsd4 specific Jeff Layton
2015-08-07 15:26     ` Kinglong Mee
2015-08-07 17:12       ` Jeff Layton
2015-08-09  7:14     ` Christoph Hellwig
2015-08-09 11:11       ` Jeff Layton
2015-08-10  8:26         ` Christoph Hellwig
2015-08-10 11:23           ` Jeff Layton
2015-08-10 12:10             ` Christoph Hellwig
2015-08-10 12:14               ` Jeff Layton
2015-08-10 14:33                 ` J. Bruce Fields
2015-08-05 21:13   ` [PATCH v2 04/18] nfsd: add a new struct file caching facility to nfsd Jeff Layton
2015-08-07 15:28     ` Kinglong Mee
2015-08-07 17:18       ` Jeff Layton
2015-08-08  0:14         ` Kinglong Mee
2015-08-08 10:36           ` Jeff Layton
2015-08-10 11:36             ` Kinglong Mee
2015-08-09  7:17     ` Christoph Hellwig
2015-08-09 11:19       ` Jeff Layton
2015-08-10  8:28         ` Christoph Hellwig
2015-08-10 11:31           ` Jeff Layton
2015-08-05 21:13   ` [PATCH v2 05/18] nfsd: hook up nfsd_write to the new nfsd_file cache Jeff Layton
2015-08-05 21:13   ` [PATCH v2 06/18] nfsd: hook up nfsd_read to the " Jeff Layton
2015-08-07 15:29     ` Kinglong Mee
2015-08-07 17:26       ` Jeff Layton
2015-08-08  0:19         ` Kinglong Mee
2015-08-05 21:13   ` [PATCH v2 07/18] sunrpc: add a new cache_detail operation for when a cache is flushed Jeff Layton
2015-08-05 21:13   ` [PATCH v2 08/18] nfsd: add a ->flush routine to svc_export_cache Jeff Layton
2015-08-05 21:13   ` [PATCH v2 09/18] nfsd: allow the file cache expire time to be tunable Jeff Layton
2015-08-05 21:13   ` [PATCH v2 10/18] nfsd: handle NFSD_MAY_NOT_BREAK_LEASE in open file cache Jeff Layton
2015-08-05 21:13   ` [PATCH v2 11/18] nfsd: hook nfsd_commit up to the nfsd_file cache Jeff Layton
2015-08-05 21:13   ` [PATCH v2 12/18] nfsd: move include of state.h from trace.c to trace.h Jeff Layton
2015-08-09  7:18     ` Christoph Hellwig
2015-08-05 21:13   ` Jeff Layton [this message]
2015-08-05 21:13   ` [PATCH v2 14/18] nfsd: have _fh_update take a knfsd_fh instead of a svc_fh Jeff Layton
2015-08-09  7:21     ` Christoph Hellwig
2015-08-05 21:13   ` [PATCH v2 15/18] nfsd: have set_version_and_fsid_type take a knfsd_fh instead of svc_fh Jeff Layton
2015-08-09  7:21     ` Christoph Hellwig
2015-08-05 21:13   ` [PATCH v2 16/18] nfsd: add a fh_compose_shallow Jeff Layton
2015-08-07 15:33     ` Kinglong Mee
2015-08-07 17:56       ` Jeff Layton
2015-08-07 18:24         ` Jeff Layton
2015-08-08  0:27           ` Kinglong Mee
2015-08-08 10:38             ` Jeff Layton
2015-08-05 21:13   ` [PATCH v2 17/18] nfsd: close cached files prior to a REMOVE or RENAME that would replace target Jeff Layton
2015-08-05 21:13   ` [PATCH v2 18/18] nfsd: call flush_delayed_fput from nfsd_file_close_fh Jeff Layton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1438809216-4846-14-git-send-email-jeff.layton@primarydata.com \
    --to=jlayton@poochiereds.net \
    --cc=bfields@fieldses.org \
    --cc=linux-nfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.