Message ID | 166750697425.1646.11770177003223505657.stgit@klimt.1015granger.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | A couple of tracepoint updates | expand |
On Thu, 2022-11-03 at 16:22 -0400, Chuck Lever wrote: > Now that we have trace_nfsd_file_closing, all we really need to > capture is when an external caller has requested a close/sync. > > Signed-off-by: Chuck Lever <chuck.lever@oracle.com> > --- > fs/nfsd/filecache.c | 17 ++++++----------- > fs/nfsd/trace.h | 45 ++++++++++++++++----------------------------- > 2 files changed, 22 insertions(+), 40 deletions(-) > > diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c > index cf1a8f1d1349..7be62af4bfb7 100644 > --- a/fs/nfsd/filecache.c > +++ b/fs/nfsd/filecache.c > @@ -706,14 +706,13 @@ static struct shrinker nfsd_file_shrinker = { > * The nfsd_file objects on the list will be unhashed, and each will have a > * reference taken. > */ > -static unsigned int > +static void > __nfsd_file_close_inode(struct inode *inode, struct list_head *dispose) > { > struct nfsd_file_lookup_key key = { > .type = NFSD_FILE_KEY_INODE, > .inode = inode, > }; > - unsigned int count = 0; > struct nfsd_file *nf; > > rcu_read_lock(); > @@ -723,11 +722,9 @@ __nfsd_file_close_inode(struct inode *inode, struct list_head *dispose) > if (!nf) > break; > > - if (nfsd_file_unhash_and_queue(nf, dispose)) > - count++; > + nfsd_file_unhash_and_queue(nf, dispose); > } while (1); > rcu_read_unlock(); > - return count; > } > > /** > @@ -742,11 +739,9 @@ static void > nfsd_file_close_inode(struct inode *inode) > { > struct nfsd_file *nf, *tmp; > - unsigned int count; > LIST_HEAD(dispose); > > - count = __nfsd_file_close_inode(inode, &dispose); > - trace_nfsd_file_close_inode(inode, count); > + __nfsd_file_close_inode(inode, &dispose); > list_for_each_entry_safe(nf, tmp, &dispose, nf_lru) { > trace_nfsd_file_closing(nf); > if (!refcount_dec_and_test(&nf->nf_ref)) > @@ -765,11 +760,11 @@ void > nfsd_file_close_inode_sync(struct inode *inode) > { > struct nfsd_file *nf; > - unsigned int count; > LIST_HEAD(dispose); > > - count = __nfsd_file_close_inode(inode, &dispose); > - trace_nfsd_file_close_inode(inode, count); > + trace_nfsd_file_close(inode); With this change we lose the count of entries on the list. That info is not particularly helpful, but maybe we ought to consider a tracepoint in unhash_and_queue that records whether a file we found in the hash got queued? It might be nice to have a way to detect cases where we close a nfsd_file but the refcount was >1 or 0, so we don't end up queueing it to the list. > + > + __nfsd_file_close_inode(inode, &dispose); > while (!list_empty(&dispose)) { > nf = list_first_entry(&dispose, struct nfsd_file, nf_lru); > list_del_init(&nf->nf_lru); > diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h > index e41007807b7e..ef01ecd3eec6 100644 > --- a/fs/nfsd/trace.h > +++ b/fs/nfsd/trace.h > @@ -1099,35 +1099,6 @@ TRACE_EVENT(nfsd_file_open, > __entry->nf_file) > ) > > -DECLARE_EVENT_CLASS(nfsd_file_search_class, > - TP_PROTO( > - const struct inode *inode, > - unsigned int count > - ), > - TP_ARGS(inode, count), > - TP_STRUCT__entry( > - __field(const struct inode *, inode) > - __field(unsigned int, count) > - ), > - TP_fast_assign( > - __entry->inode = inode; > - __entry->count = count; > - ), > - TP_printk("inode=%p count=%u", > - __entry->inode, __entry->count) > -); > - > -#define DEFINE_NFSD_FILE_SEARCH_EVENT(name) \ > -DEFINE_EVENT(nfsd_file_search_class, name, \ > - TP_PROTO( \ > - const struct inode *inode, \ > - unsigned int count \ > - ), \ > - TP_ARGS(inode, count)) > - > -DEFINE_NFSD_FILE_SEARCH_EVENT(nfsd_file_close_inode_sync); > -DEFINE_NFSD_FILE_SEARCH_EVENT(nfsd_file_close_inode); > - > TRACE_EVENT(nfsd_file_is_cached, > TP_PROTO( > const struct inode *inode, > @@ -1238,6 +1209,22 @@ DEFINE_EVENT(nfsd_file_lruwalk_class, name, \ > DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_gc_removed); > DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_shrinker_removed); > > +TRACE_EVENT(nfsd_file_close, > + TP_PROTO( > + const struct inode *inode > + ), > + TP_ARGS(inode), > + TP_STRUCT__entry( > + __field(const void *, inode) > + ), > + TP_fast_assign( > + __entry->inode = inode; > + ), > + TP_printk("inode=%p", > + __entry->inode > + ) > +); > + > TRACE_EVENT(nfsd_file_fsync, > TP_PROTO( > const struct nfsd_file *nf, > >
> On Nov 4, 2022, at 8:44 AM, Jeff Layton <jlayton@poochiereds.net> wrote: > > On Thu, 2022-11-03 at 16:22 -0400, Chuck Lever wrote: >> Now that we have trace_nfsd_file_closing, all we really need to >> capture is when an external caller has requested a close/sync. >> >> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> >> --- >> fs/nfsd/filecache.c | 17 ++++++----------- >> fs/nfsd/trace.h | 45 ++++++++++++++++----------------------------- >> 2 files changed, 22 insertions(+), 40 deletions(-) >> >> diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c >> index cf1a8f1d1349..7be62af4bfb7 100644 >> --- a/fs/nfsd/filecache.c >> +++ b/fs/nfsd/filecache.c >> @@ -706,14 +706,13 @@ static struct shrinker nfsd_file_shrinker = { >> * The nfsd_file objects on the list will be unhashed, and each will have a >> * reference taken. >> */ >> -static unsigned int >> +static void >> __nfsd_file_close_inode(struct inode *inode, struct list_head *dispose) >> { >> struct nfsd_file_lookup_key key = { >> .type = NFSD_FILE_KEY_INODE, >> .inode = inode, >> }; >> - unsigned int count = 0; >> struct nfsd_file *nf; >> >> rcu_read_lock(); >> @@ -723,11 +722,9 @@ __nfsd_file_close_inode(struct inode *inode, struct list_head *dispose) >> if (!nf) >> break; >> >> - if (nfsd_file_unhash_and_queue(nf, dispose)) >> - count++; >> + nfsd_file_unhash_and_queue(nf, dispose); >> } while (1); >> rcu_read_unlock(); >> - return count; >> } >> >> /** >> @@ -742,11 +739,9 @@ static void >> nfsd_file_close_inode(struct inode *inode) >> { >> struct nfsd_file *nf, *tmp; >> - unsigned int count; >> LIST_HEAD(dispose); >> >> - count = __nfsd_file_close_inode(inode, &dispose); >> - trace_nfsd_file_close_inode(inode, count); >> + __nfsd_file_close_inode(inode, &dispose); >> list_for_each_entry_safe(nf, tmp, &dispose, nf_lru) { >> trace_nfsd_file_closing(nf); >> if (!refcount_dec_and_test(&nf->nf_ref)) >> @@ -765,11 +760,11 @@ void >> nfsd_file_close_inode_sync(struct inode *inode) >> { >> struct nfsd_file *nf; >> - unsigned int count; >> LIST_HEAD(dispose); >> >> - count = __nfsd_file_close_inode(inode, &dispose); >> - trace_nfsd_file_close_inode(inode, count); >> + trace_nfsd_file_close(inode); > > With this change we lose the count of entries on the list. That info is > not particularly helpful, but maybe we ought to consider a tracepoint in > unhash_and_queue that records whether a file we found in the hash got > queued? It might be nice to have a way to detect cases where we close a > nfsd_file but the refcount was >1 or 0, so we don't end up queueing it > to the list. Would that be an exception case, or an error? I'm assuming the former. No objection if you'd like to add that as part of a follow-on series. >> + >> + __nfsd_file_close_inode(inode, &dispose); >> while (!list_empty(&dispose)) { >> nf = list_first_entry(&dispose, struct nfsd_file, nf_lru); >> list_del_init(&nf->nf_lru); >> diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h >> index e41007807b7e..ef01ecd3eec6 100644 >> --- a/fs/nfsd/trace.h >> +++ b/fs/nfsd/trace.h >> @@ -1099,35 +1099,6 @@ TRACE_EVENT(nfsd_file_open, >> __entry->nf_file) >> ) >> >> -DECLARE_EVENT_CLASS(nfsd_file_search_class, >> - TP_PROTO( >> - const struct inode *inode, >> - unsigned int count >> - ), >> - TP_ARGS(inode, count), >> - TP_STRUCT__entry( >> - __field(const struct inode *, inode) >> - __field(unsigned int, count) >> - ), >> - TP_fast_assign( >> - __entry->inode = inode; >> - __entry->count = count; >> - ), >> - TP_printk("inode=%p count=%u", >> - __entry->inode, __entry->count) >> -); >> - >> -#define DEFINE_NFSD_FILE_SEARCH_EVENT(name) \ >> -DEFINE_EVENT(nfsd_file_search_class, name, \ >> - TP_PROTO( \ >> - const struct inode *inode, \ >> - unsigned int count \ >> - ), \ >> - TP_ARGS(inode, count)) >> - >> -DEFINE_NFSD_FILE_SEARCH_EVENT(nfsd_file_close_inode_sync); >> -DEFINE_NFSD_FILE_SEARCH_EVENT(nfsd_file_close_inode); >> - >> TRACE_EVENT(nfsd_file_is_cached, >> TP_PROTO( >> const struct inode *inode, >> @@ -1238,6 +1209,22 @@ DEFINE_EVENT(nfsd_file_lruwalk_class, name, \ >> DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_gc_removed); >> DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_shrinker_removed); >> >> +TRACE_EVENT(nfsd_file_close, >> + TP_PROTO( >> + const struct inode *inode >> + ), >> + TP_ARGS(inode), >> + TP_STRUCT__entry( >> + __field(const void *, inode) >> + ), >> + TP_fast_assign( >> + __entry->inode = inode; >> + ), >> + TP_printk("inode=%p", >> + __entry->inode >> + ) >> +); >> + >> TRACE_EVENT(nfsd_file_fsync, >> TP_PROTO( >> const struct nfsd_file *nf, >> >> > > -- > Jeff Layton <jlayton@poochiereds.net> -- Chuck Lever
diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c index cf1a8f1d1349..7be62af4bfb7 100644 --- a/fs/nfsd/filecache.c +++ b/fs/nfsd/filecache.c @@ -706,14 +706,13 @@ static struct shrinker nfsd_file_shrinker = { * The nfsd_file objects on the list will be unhashed, and each will have a * reference taken. */ -static unsigned int +static void __nfsd_file_close_inode(struct inode *inode, struct list_head *dispose) { struct nfsd_file_lookup_key key = { .type = NFSD_FILE_KEY_INODE, .inode = inode, }; - unsigned int count = 0; struct nfsd_file *nf; rcu_read_lock(); @@ -723,11 +722,9 @@ __nfsd_file_close_inode(struct inode *inode, struct list_head *dispose) if (!nf) break; - if (nfsd_file_unhash_and_queue(nf, dispose)) - count++; + nfsd_file_unhash_and_queue(nf, dispose); } while (1); rcu_read_unlock(); - return count; } /** @@ -742,11 +739,9 @@ static void nfsd_file_close_inode(struct inode *inode) { struct nfsd_file *nf, *tmp; - unsigned int count; LIST_HEAD(dispose); - count = __nfsd_file_close_inode(inode, &dispose); - trace_nfsd_file_close_inode(inode, count); + __nfsd_file_close_inode(inode, &dispose); list_for_each_entry_safe(nf, tmp, &dispose, nf_lru) { trace_nfsd_file_closing(nf); if (!refcount_dec_and_test(&nf->nf_ref)) @@ -765,11 +760,11 @@ void nfsd_file_close_inode_sync(struct inode *inode) { struct nfsd_file *nf; - unsigned int count; LIST_HEAD(dispose); - count = __nfsd_file_close_inode(inode, &dispose); - trace_nfsd_file_close_inode(inode, count); + trace_nfsd_file_close(inode); + + __nfsd_file_close_inode(inode, &dispose); while (!list_empty(&dispose)) { nf = list_first_entry(&dispose, struct nfsd_file, nf_lru); list_del_init(&nf->nf_lru); diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h index e41007807b7e..ef01ecd3eec6 100644 --- a/fs/nfsd/trace.h +++ b/fs/nfsd/trace.h @@ -1099,35 +1099,6 @@ TRACE_EVENT(nfsd_file_open, __entry->nf_file) ) -DECLARE_EVENT_CLASS(nfsd_file_search_class, - TP_PROTO( - const struct inode *inode, - unsigned int count - ), - TP_ARGS(inode, count), - TP_STRUCT__entry( - __field(const struct inode *, inode) - __field(unsigned int, count) - ), - TP_fast_assign( - __entry->inode = inode; - __entry->count = count; - ), - TP_printk("inode=%p count=%u", - __entry->inode, __entry->count) -); - -#define DEFINE_NFSD_FILE_SEARCH_EVENT(name) \ -DEFINE_EVENT(nfsd_file_search_class, name, \ - TP_PROTO( \ - const struct inode *inode, \ - unsigned int count \ - ), \ - TP_ARGS(inode, count)) - -DEFINE_NFSD_FILE_SEARCH_EVENT(nfsd_file_close_inode_sync); -DEFINE_NFSD_FILE_SEARCH_EVENT(nfsd_file_close_inode); - TRACE_EVENT(nfsd_file_is_cached, TP_PROTO( const struct inode *inode, @@ -1238,6 +1209,22 @@ DEFINE_EVENT(nfsd_file_lruwalk_class, name, \ DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_gc_removed); DEFINE_NFSD_FILE_LRUWALK_EVENT(nfsd_file_shrinker_removed); +TRACE_EVENT(nfsd_file_close, + TP_PROTO( + const struct inode *inode + ), + TP_ARGS(inode), + TP_STRUCT__entry( + __field(const void *, inode) + ), + TP_fast_assign( + __entry->inode = inode; + ), + TP_printk("inode=%p", + __entry->inode + ) +); + TRACE_EVENT(nfsd_file_fsync, TP_PROTO( const struct nfsd_file *nf,
Now that we have trace_nfsd_file_closing, all we really need to capture is when an external caller has requested a close/sync. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> --- fs/nfsd/filecache.c | 17 ++++++----------- fs/nfsd/trace.h | 45 ++++++++++++++++----------------------------- 2 files changed, 22 insertions(+), 40 deletions(-)