From: Fengguang Wu <fengguang.wu@intel.com>
To: Tejun Heo <tj@kernel.org>
Cc: axboe@kernel.dk, linux-kernel@vger.kernel.org, chavey@google.com,
Jan Kara <jack@suse.cz>,
linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 5/5] writeback: add more tracepoints
Date: Sat, 12 Jan 2013 11:17:02 +0800 [thread overview]
Message-ID: <20130112031702.GA10024@localhost> (raw)
In-Reply-To: <1357938397-5413-6-git-send-email-tj@kernel.org>
Patch looks good to me. But CC more people for review.
On Fri, Jan 11, 2013 at 01:06:37PM -0800, Tejun Heo wrote:
> Add tracepoints for page dirtying, writeback_single_inode start, inode
> dirtying and writeback. For the latter two inode events, a pair of
> events are defined to denote start and end of the operations (the
> starting one has _start suffix and the one w/o suffix happens after
> the operation is complete). These inode ops are FS specific and can
> be non-trivial and having enclosing tracepoints is useful for external
> tracers.
>
> This is part of tracepoint additions to improve visiblity into
> dirtying / writeback operations for io tracer and userland.
>
> v2: writeback_dirty_inode[_start] TPs may be called for files on
> pseudo FSes w/ unregistered bdi. Check whether bdi->dev is %NULL
> before dereferencing.
>
> v3: buffer dirtying moved to a block TP.
>
> Signed-off-by: Tejun Heo <tj@kernel.org>
> ---
> fs/fs-writeback.c | 16 +++++-
> include/trace/events/writeback.h | 116 +++++++++++++++++++++++++++++++++++++++
> mm/page-writeback.c | 2 +
> 3 files changed, 132 insertions(+), 2 deletions(-)
>
> diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
> index 310972b..359494e 100644
> --- a/fs/fs-writeback.c
> +++ b/fs/fs-writeback.c
> @@ -318,8 +318,14 @@ static void queue_io(struct bdi_writeback *wb, struct wb_writeback_work *work)
>
> static int write_inode(struct inode *inode, struct writeback_control *wbc)
> {
> - if (inode->i_sb->s_op->write_inode && !is_bad_inode(inode))
> - return inode->i_sb->s_op->write_inode(inode, wbc);
> + int ret;
> +
> + if (inode->i_sb->s_op->write_inode && !is_bad_inode(inode)) {
> + trace_writeback_write_inode_start(inode, wbc);
> + ret = inode->i_sb->s_op->write_inode(inode, wbc);
> + trace_writeback_write_inode(inode, wbc);
> + return ret;
> + }
> return 0;
> }
>
> @@ -450,6 +456,8 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
>
> WARN_ON(!(inode->i_state & I_SYNC));
>
> + trace_writeback_single_inode_start(inode, wbc, nr_to_write);
> +
> ret = do_writepages(mapping, wbc);
>
> /*
> @@ -1150,8 +1158,12 @@ void __mark_inode_dirty(struct inode *inode, int flags)
> * dirty the inode itself
> */
> if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) {
> + trace_writeback_dirty_inode_start(inode, flags);
> +
> if (sb->s_op->dirty_inode)
> sb->s_op->dirty_inode(inode, flags);
> +
> + trace_writeback_dirty_inode(inode, flags);
> }
>
> /*
> diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h
> index b453d92..6a16fd2 100644
> --- a/include/trace/events/writeback.h
> +++ b/include/trace/events/writeback.h
> @@ -32,6 +32,115 @@
>
> struct wb_writeback_work;
>
> +TRACE_EVENT(writeback_dirty_page,
> +
> + TP_PROTO(struct page *page, struct address_space *mapping),
> +
> + TP_ARGS(page, mapping),
> +
> + TP_STRUCT__entry (
> + __array(char, name, 32)
> + __field(unsigned long, ino)
> + __field(pgoff_t, index)
> + ),
> +
> + TP_fast_assign(
> + strncpy(__entry->name,
> + mapping ? dev_name(mapping->backing_dev_info->dev) : "(unknown)", 32);
> + __entry->ino = mapping ? mapping->host->i_ino : 0;
> + __entry->index = page->index;
> + ),
> +
> + TP_printk("bdi %s: ino=%lu index=%lu",
> + __entry->name,
> + __entry->ino,
> + __entry->index
> + )
> +);
> +
> +DECLARE_EVENT_CLASS(writeback_dirty_inode_template,
> +
> + TP_PROTO(struct inode *inode, int flags),
> +
> + TP_ARGS(inode, flags),
> +
> + TP_STRUCT__entry (
> + __array(char, name, 32)
> + __field(unsigned long, ino)
> + __field(unsigned long, flags)
> + ),
> +
> + TP_fast_assign(
> + struct backing_dev_info *bdi = inode->i_mapping->backing_dev_info;
> +
> + /* may be called for files on pseudo FSes w/ unregistered bdi */
> + strncpy(__entry->name,
> + bdi->dev ? dev_name(bdi->dev) : "(unknown)", 32);
> + __entry->ino = inode->i_ino;
> + __entry->flags = flags;
> + ),
> +
> + TP_printk("bdi %s: ino=%lu flags=%s",
> + __entry->name,
> + __entry->ino,
> + show_inode_state(__entry->flags)
> + )
> +);
> +
> +DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode_start,
> +
> + TP_PROTO(struct inode *inode, int flags),
> +
> + TP_ARGS(inode, flags)
> +);
> +
> +DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode,
> +
> + TP_PROTO(struct inode *inode, int flags),
> +
> + TP_ARGS(inode, flags)
> +);
> +
> +DECLARE_EVENT_CLASS(writeback_write_inode_template,
> +
> + TP_PROTO(struct inode *inode, struct writeback_control *wbc),
> +
> + TP_ARGS(inode, wbc),
> +
> + TP_STRUCT__entry (
> + __array(char, name, 32)
> + __field(unsigned long, ino)
> + __field(int, sync_mode)
> + ),
> +
> + TP_fast_assign(
> + strncpy(__entry->name,
> + dev_name(inode->i_mapping->backing_dev_info->dev), 32);
> + __entry->ino = inode->i_ino;
> + __entry->sync_mode = wbc->sync_mode;
> + ),
> +
> + TP_printk("bdi %s: ino=%lu sync_mode=%d",
> + __entry->name,
> + __entry->ino,
> + __entry->sync_mode
> + )
> +);
> +
> +DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode_start,
> +
> + TP_PROTO(struct inode *inode, struct writeback_control *wbc),
> +
> + TP_ARGS(inode, wbc)
> +);
> +
> +DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode,
> +
> + TP_PROTO(struct inode *inode, struct writeback_control *wbc),
> +
> + TP_ARGS(inode, wbc)
> +);
> +
> DECLARE_EVENT_CLASS(writeback_work_class,
> TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work),
> TP_ARGS(bdi, work),
> @@ -479,6 +588,13 @@ DECLARE_EVENT_CLASS(writeback_single_inode_template,
> )
> );
>
> +DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode_start,
> + TP_PROTO(struct inode *inode,
> + struct writeback_control *wbc,
> + unsigned long nr_to_write),
> + TP_ARGS(inode, wbc, nr_to_write)
> +);
> +
> DEFINE_EVENT(writeback_single_inode_template, writeback_single_inode,
> TP_PROTO(struct inode *inode,
> struct writeback_control *wbc,
> diff --git a/mm/page-writeback.c b/mm/page-writeback.c
> index 0713bfb..3734cef 100644
> --- a/mm/page-writeback.c
> +++ b/mm/page-writeback.c
> @@ -1982,6 +1982,8 @@ int __set_page_dirty_no_writeback(struct page *page)
> */
> void account_page_dirtied(struct page *page, struct address_space *mapping)
> {
> + trace_writeback_dirty_page(page, mapping);
> +
> if (mapping_cap_account_dirty(mapping)) {
> __inc_zone_page_state(page, NR_FILE_DIRTY);
> __inc_zone_page_state(page, NR_DIRTIED);
> --
> 1.8.0.2
next prev parent reply other threads:[~2013-01-12 3:17 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-11 21:06 [PATCHSET] block: improve tracepoints, take#2 Tejun Heo
2013-01-11 21:06 ` [PATCH 1/5] block: add missing block_bio_complete() tracepoint Tejun Heo
2013-01-11 21:06 ` [PATCH 2/5] block: add @req to bio_{front|back}_merge tracepoints Tejun Heo
2013-01-11 21:06 ` [PATCH 3/5] buffer: make touch_buffer() an exported function Tejun Heo
2013-01-11 21:06 ` [PATCH 4/5] block: add block_{touch|dirty}_buffer tracepoint Tejun Heo
2013-01-11 21:06 ` [PATCH 5/5] writeback: add more tracepoints Tejun Heo
2013-01-12 3:17 ` Fengguang Wu [this message]
2013-01-14 13:57 ` Jan Kara
2013-01-14 14:02 ` [PATCHSET] block: improve tracepoints, take#2 Jens Axboe
2013-01-14 17:43 ` Tejun Heo
2013-01-14 18:22 ` [PATCH] writeback: mark sysctl vm.block_dump for removal Tejun Heo
2013-01-14 19:00 ` Jan Kara
2013-01-15 16:28 ` [PATCH v2] " Tejun Heo
2013-01-16 2:07 ` Jan Kara
2013-01-16 2:53 ` Fengguang Wu
-- strict thread matches above, loose matches on Subject: below --
2013-01-09 16:45 [PATCHSET] block: improve tracepoints Tejun Heo
2013-01-09 16:45 ` [PATCH 5/5] writeback: add more tracepoints Tejun Heo
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=20130112031702.GA10024@localhost \
--to=fengguang.wu@intel.com \
--cc=axboe@kernel.dk \
--cc=chavey@google.com \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tj@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.