On Tue, Oct 15, 2019 at 05:43:41PM +0200, Christoph Hellwig wrote: > Lift the xfs code for tracing address space operations to the iomap > layer. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Looks ok, Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --D > --- > fs/iomap/Makefile | 16 ++++++++------ > fs/iomap/buffered-io.c | 5 +++++ > fs/iomap/trace.c | 12 +++++++++++ > fs/iomap/trace.h | 49 ++++++++++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_aops.c | 2 -- > fs/xfs/xfs_trace.h | 26 ---------------------- > 6 files changed, 75 insertions(+), 35 deletions(-) > create mode 100644 fs/iomap/trace.c > create mode 100644 fs/iomap/trace.h > > diff --git a/fs/iomap/Makefile b/fs/iomap/Makefile > index 93cd11938bf5..eef2722d93a1 100644 > --- a/fs/iomap/Makefile > +++ b/fs/iomap/Makefile > @@ -3,13 +3,15 @@ > # Copyright (c) 2019 Oracle. > # All Rights Reserved. > # > -obj-$(CONFIG_FS_IOMAP) += iomap.o > > -iomap-y += \ > - apply.o \ > - buffered-io.o \ > - direct-io.o \ > - fiemap.o \ > - seek.o > +ccflags-y += -I $(srctree)/$(src) # needed for trace events > + > +obj-$(CONFIG_FS_IOMAP) += iomap.o > > +iomap-y += trace.o \ > + apply.o \ > + buffered-io.o \ > + direct-io.o \ > + fiemap.o \ > + seek.o > iomap-$(CONFIG_SWAP) += swapfile.o > diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c > index 181ee8477aad..d1620c3f2a4c 100644 > --- a/fs/iomap/buffered-io.c > +++ b/fs/iomap/buffered-io.c > @@ -16,6 +16,7 @@ > #include <linux/bio.h> > #include <linux/sched/signal.h> > #include <linux/migrate.h> > +#include "trace.h" > > #include "../internal.h" > > @@ -301,6 +302,8 @@ iomap_readpage(struct page *page, const struct iomap_ops *ops) > unsigned poff; > loff_t ret; > > + trace_iomap_readpage(page->mapping->host, 1); > + > for (poff = 0; poff < PAGE_SIZE; poff += ret) { > ret = iomap_apply(inode, page_offset(page) + poff, > PAGE_SIZE - poff, 0, ops, &ctx, > @@ -397,6 +400,8 @@ iomap_readpages(struct address_space *mapping, struct list_head *pages, > loff_t last = page_offset(list_entry(pages->next, struct page, lru)); > loff_t length = last - pos + PAGE_SIZE, ret = 0; > > + trace_iomap_readpages(mapping->host, nr_pages); > + > while (length > 0) { > ret = iomap_apply(mapping->host, pos, length, 0, ops, > &ctx, iomap_readpages_actor); > diff --git a/fs/iomap/trace.c b/fs/iomap/trace.c > new file mode 100644 > index 000000000000..63ce9f0ce4dc > --- /dev/null > +++ b/fs/iomap/trace.c > @@ -0,0 +1,12 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (c) 2019, Christoph Hellwig > + */ > +#include <linux/iomap.h> > + > +/* > + * We include this last to have the helpers above available for the trace > + * event implementations. > + */ > +#define CREATE_TRACE_POINTS > +#include "trace.h" > diff --git a/fs/iomap/trace.h b/fs/iomap/trace.h > new file mode 100644 > index 000000000000..3900de1d871d > --- /dev/null > +++ b/fs/iomap/trace.h > @@ -0,0 +1,49 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (c) 2009-2019, Christoph Hellwig > + * > + * NOTE: none of these tracepoints shall be consider a stable kernel ABI > + * as they can change at any time. > + */ > +#undef TRACE_SYSTEM > +#define TRACE_SYSTEM iomap > + > +#if !defined(_IOMAP_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) > +#define _IOMAP_TRACE_H > + > +#include <linux/tracepoint.h> > + > +struct inode; > + > +DECLARE_EVENT_CLASS(iomap_readpage_class, > + TP_PROTO(struct inode *inode, int nr_pages), > + TP_ARGS(inode, nr_pages), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(u64, ino) > + __field(int, nr_pages) > + ), > + TP_fast_assign( > + __entry->dev = inode->i_sb->s_dev; > + __entry->ino = inode->i_ino; > + __entry->nr_pages = nr_pages; > + ), > + TP_printk("dev %d:%d ino 0x%llx nr_pages %d", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->ino, > + __entry->nr_pages) > +) > + > +#define DEFINE_READPAGE_EVENT(name) \ > +DEFINE_EVENT(iomap_readpage_class, name, \ > + TP_PROTO(struct inode *inode, int nr_pages), \ > + TP_ARGS(inode, nr_pages)) > +DEFINE_READPAGE_EVENT(iomap_readpage); > +DEFINE_READPAGE_EVENT(iomap_readpages); > + > +#endif /* _IOMAP_TRACE_H */ > + > +#undef TRACE_INCLUDE_PATH > +#define TRACE_INCLUDE_PATH . > +#define TRACE_INCLUDE_FILE trace > +#include <trace/define_trace.h> > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 00fe40b35f72..e2033b070f4a 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1184,7 +1184,6 @@ xfs_vm_readpage( > struct file *unused, > struct page *page) > { > - trace_xfs_vm_readpage(page->mapping->host, 1); > return iomap_readpage(page, &xfs_iomap_ops); > } > > @@ -1195,7 +1194,6 @@ xfs_vm_readpages( > struct list_head *pages, > unsigned nr_pages) > { > - trace_xfs_vm_readpages(mapping->host, nr_pages); > return iomap_readpages(mapping, pages, nr_pages, &xfs_iomap_ops); > } > > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index eaae275ed430..eae4b29c174e 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -1197,32 +1197,6 @@ DEFINE_PAGE_EVENT(xfs_writepage); > DEFINE_PAGE_EVENT(xfs_releasepage); > DEFINE_PAGE_EVENT(xfs_invalidatepage); > > -DECLARE_EVENT_CLASS(xfs_readpage_class, > - TP_PROTO(struct inode *inode, int nr_pages), > - TP_ARGS(inode, nr_pages), > - TP_STRUCT__entry( > - __field(dev_t, dev) > - __field(xfs_ino_t, ino) > - __field(int, nr_pages) > - ), > - TP_fast_assign( > - __entry->dev = inode->i_sb->s_dev; > - __entry->ino = inode->i_ino; > - __entry->nr_pages = nr_pages; > - ), > - TP_printk("dev %d:%d ino 0x%llx nr_pages %d", > - MAJOR(__entry->dev), MINOR(__entry->dev), > - __entry->ino, > - __entry->nr_pages) > -) > - > -#define DEFINE_READPAGE_EVENT(name) \ > -DEFINE_EVENT(xfs_readpage_class, name, \ > - TP_PROTO(struct inode *inode, int nr_pages), \ > - TP_ARGS(inode, nr_pages)) > -DEFINE_READPAGE_EVENT(xfs_vm_readpage); > -DEFINE_READPAGE_EVENT(xfs_vm_readpages); > - > DECLARE_EVENT_CLASS(xfs_imap_class, > TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count, > int whichfork, struct xfs_bmbt_irec *irec), > -- > 2.20.1 >