summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2019-07-18 09:32:17 -0400
committerTrond Myklebust <trond.myklebust@hammerspace.com>2019-07-18 15:50:28 -0400
commitd5b9216fd5114be4ed98ca9c1ecc5f164cd8cf5e (patch)
treee81e74971e58837a9986c48cf38a2e6160a0265c
parent58bbeab425c6c5e318f5b6ae31d351331ddfb34b (diff)
pnfs/flexfiles: Add tracepoints for detecting pnfs fallback to MDS
Add tracepoints to allow debugging of the event chain leading to a pnfs fallback to doing I/O through the MDS. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
-rw-r--r--fs/nfs/flexfilelayout/flexfilelayout.c26
-rw-r--r--fs/nfs/nfs4trace.c8
-rw-r--r--fs/nfs/nfs4trace.h76
-rw-r--r--fs/nfs/pnfs.c2
-rw-r--r--include/linux/nfs4.h1
5 files changed, 112 insertions, 1 deletions
diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c
index bcff3bf5ae09..b04e20d28162 100644
--- a/fs/nfs/flexfilelayout/flexfilelayout.c
+++ b/fs/nfs/flexfilelayout/flexfilelayout.c
@@ -934,6 +934,10 @@ out_nolseg:
934 if (pgio->pg_error < 0) 934 if (pgio->pg_error < 0)
935 return; 935 return;
936out_mds: 936out_mds:
937 trace_pnfs_mds_fallback_pg_init_read(pgio->pg_inode,
938 0, NFS4_MAX_UINT64, IOMODE_READ,
939 NFS_I(pgio->pg_inode)->layout,
940 pgio->pg_lseg);
937 pnfs_put_lseg(pgio->pg_lseg); 941 pnfs_put_lseg(pgio->pg_lseg);
938 pgio->pg_lseg = NULL; 942 pgio->pg_lseg = NULL;
939 nfs_pageio_reset_read_mds(pgio); 943 nfs_pageio_reset_read_mds(pgio);
@@ -1000,6 +1004,10 @@ retry:
1000 return; 1004 return;
1001 1005
1002out_mds: 1006out_mds:
1007 trace_pnfs_mds_fallback_pg_init_write(pgio->pg_inode,
1008 0, NFS4_MAX_UINT64, IOMODE_RW,
1009 NFS_I(pgio->pg_inode)->layout,
1010 pgio->pg_lseg);
1003 pnfs_put_lseg(pgio->pg_lseg); 1011 pnfs_put_lseg(pgio->pg_lseg);
1004 pgio->pg_lseg = NULL; 1012 pgio->pg_lseg = NULL;
1005 nfs_pageio_reset_write_mds(pgio); 1013 nfs_pageio_reset_write_mds(pgio);
@@ -1026,6 +1034,10 @@ ff_layout_pg_get_mirror_count_write(struct nfs_pageio_descriptor *pgio,
1026 if (pgio->pg_lseg) 1034 if (pgio->pg_lseg)
1027 return FF_LAYOUT_MIRROR_COUNT(pgio->pg_lseg); 1035 return FF_LAYOUT_MIRROR_COUNT(pgio->pg_lseg);
1028 1036
1037 trace_pnfs_mds_fallback_pg_get_mirror_count(pgio->pg_inode,
1038 0, NFS4_MAX_UINT64, IOMODE_RW,
1039 NFS_I(pgio->pg_inode)->layout,
1040 pgio->pg_lseg);
1029 /* no lseg means that pnfs is not in use, so no mirroring here */ 1041 /* no lseg means that pnfs is not in use, so no mirroring here */
1030 nfs_pageio_reset_write_mds(pgio); 1042 nfs_pageio_reset_write_mds(pgio);
1031out: 1043out:
@@ -1075,6 +1087,10 @@ static void ff_layout_reset_write(struct nfs_pgio_header *hdr, bool retry_pnfs)
1075 hdr->args.count, 1087 hdr->args.count,
1076 (unsigned long long)hdr->args.offset); 1088 (unsigned long long)hdr->args.offset);
1077 1089
1090 trace_pnfs_mds_fallback_write_done(hdr->inode,
1091 hdr->args.offset, hdr->args.count,
1092 IOMODE_RW, NFS_I(hdr->inode)->layout,
1093 hdr->lseg);
1078 task->tk_status = pnfs_write_done_resend_to_mds(hdr); 1094 task->tk_status = pnfs_write_done_resend_to_mds(hdr);
1079 } 1095 }
1080} 1096}
@@ -1094,6 +1110,10 @@ static void ff_layout_reset_read(struct nfs_pgio_header *hdr)
1094 hdr->args.count, 1110 hdr->args.count,
1095 (unsigned long long)hdr->args.offset); 1111 (unsigned long long)hdr->args.offset);
1096 1112
1113 trace_pnfs_mds_fallback_read_done(hdr->inode,
1114 hdr->args.offset, hdr->args.count,
1115 IOMODE_READ, NFS_I(hdr->inode)->layout,
1116 hdr->lseg);
1097 task->tk_status = pnfs_read_done_resend_to_mds(hdr); 1117 task->tk_status = pnfs_read_done_resend_to_mds(hdr);
1098 } 1118 }
1099} 1119}
@@ -1827,6 +1847,9 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr)
1827out_failed: 1847out_failed:
1828 if (ff_layout_avoid_mds_available_ds(lseg)) 1848 if (ff_layout_avoid_mds_available_ds(lseg))
1829 return PNFS_TRY_AGAIN; 1849 return PNFS_TRY_AGAIN;
1850 trace_pnfs_mds_fallback_read_pagelist(hdr->inode,
1851 hdr->args.offset, hdr->args.count,
1852 IOMODE_READ, NFS_I(hdr->inode)->layout, lseg);
1830 return PNFS_NOT_ATTEMPTED; 1853 return PNFS_NOT_ATTEMPTED;
1831} 1854}
1832 1855
@@ -1892,6 +1915,9 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
1892out_failed: 1915out_failed:
1893 if (ff_layout_avoid_mds_available_ds(lseg)) 1916 if (ff_layout_avoid_mds_available_ds(lseg))
1894 return PNFS_TRY_AGAIN; 1917 return PNFS_TRY_AGAIN;
1918 trace_pnfs_mds_fallback_write_pagelist(hdr->inode,
1919 hdr->args.offset, hdr->args.count,
1920 IOMODE_RW, NFS_I(hdr->inode)->layout, lseg);
1895 return PNFS_NOT_ATTEMPTED; 1921 return PNFS_NOT_ATTEMPTED;
1896} 1922}
1897 1923
diff --git a/fs/nfs/nfs4trace.c b/fs/nfs/nfs4trace.c
index e9fb3e50a999..1a8f376b3f73 100644
--- a/fs/nfs/nfs4trace.c
+++ b/fs/nfs/nfs4trace.c
@@ -16,4 +16,12 @@
16EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_read); 16EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_read);
17EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_write); 17EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_write);
18EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_commit_ds); 18EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_commit_ds);
19
20EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_pg_init_read);
21EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_pg_init_write);
22EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_pg_get_mirror_count);
23EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_read_done);
24EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_write_done);
25EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_read_pagelist);
26EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_write_pagelist);
19#endif 27#endif
diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h
index d85f20945a2b..b2f395fa7350 100644
--- a/fs/nfs/nfs4trace.h
+++ b/fs/nfs/nfs4trace.h
@@ -1771,6 +1771,7 @@ TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_BLOCKED);
1771TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_INVALID_OPEN); 1771TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_INVALID_OPEN);
1772TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_RETRY); 1772TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_RETRY);
1773TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET); 1773TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET);
1774TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_EXIT);
1774 1775
1775#define show_pnfs_update_layout_reason(reason) \ 1776#define show_pnfs_update_layout_reason(reason) \
1776 __print_symbolic(reason, \ 1777 __print_symbolic(reason, \
@@ -1786,7 +1787,8 @@ TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET);
1786 { PNFS_UPDATE_LAYOUT_BLOCKED, "layouts blocked" }, \ 1787 { PNFS_UPDATE_LAYOUT_BLOCKED, "layouts blocked" }, \
1787 { PNFS_UPDATE_LAYOUT_INVALID_OPEN, "invalid open" }, \ 1788 { PNFS_UPDATE_LAYOUT_INVALID_OPEN, "invalid open" }, \
1788 { PNFS_UPDATE_LAYOUT_RETRY, "retrying" }, \ 1789 { PNFS_UPDATE_LAYOUT_RETRY, "retrying" }, \
1789 { PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET, "sent layoutget" }) 1790 { PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET, "sent layoutget" }, \
1791 { PNFS_UPDATE_LAYOUT_EXIT, "exit" })
1790 1792
1791TRACE_EVENT(pnfs_update_layout, 1793TRACE_EVENT(pnfs_update_layout,
1792 TP_PROTO(struct inode *inode, 1794 TP_PROTO(struct inode *inode,
@@ -1845,6 +1847,78 @@ TRACE_EVENT(pnfs_update_layout,
1845 ) 1847 )
1846); 1848);
1847 1849
1850DECLARE_EVENT_CLASS(pnfs_layout_event,
1851 TP_PROTO(struct inode *inode,
1852 loff_t pos,
1853 u64 count,
1854 enum pnfs_iomode iomode,
1855 struct pnfs_layout_hdr *lo,
1856 struct pnfs_layout_segment *lseg
1857 ),
1858 TP_ARGS(inode, pos, count, iomode, lo, lseg),
1859 TP_STRUCT__entry(
1860 __field(dev_t, dev)
1861 __field(u64, fileid)
1862 __field(u32, fhandle)
1863 __field(loff_t, pos)
1864 __field(u64, count)
1865 __field(enum pnfs_iomode, iomode)
1866 __field(int, layoutstateid_seq)
1867 __field(u32, layoutstateid_hash)
1868 __field(long, lseg)
1869 ),
1870 TP_fast_assign(
1871 __entry->dev = inode->i_sb->s_dev;
1872 __entry->fileid = NFS_FILEID(inode);
1873 __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode));
1874 __entry->pos = pos;
1875 __entry->count = count;
1876 __entry->iomode = iomode;
1877 if (lo != NULL) {
1878 __entry->layoutstateid_seq =
1879 be32_to_cpu(lo->plh_stateid.seqid);
1880 __entry->layoutstateid_hash =
1881 nfs_stateid_hash(&lo->plh_stateid);
1882 } else {
1883 __entry->layoutstateid_seq = 0;
1884 __entry->layoutstateid_hash = 0;
1885 }
1886 __entry->lseg = (long)lseg;
1887 ),
1888 TP_printk(
1889 "fileid=%02x:%02x:%llu fhandle=0x%08x "
1890 "iomode=%s pos=%llu count=%llu "
1891 "layoutstateid=%d:0x%08x lseg=0x%lx",
1892 MAJOR(__entry->dev), MINOR(__entry->dev),
1893 (unsigned long long)__entry->fileid,
1894 __entry->fhandle,
1895 show_pnfs_iomode(__entry->iomode),
1896 (unsigned long long)__entry->pos,
1897 (unsigned long long)__entry->count,
1898 __entry->layoutstateid_seq, __entry->layoutstateid_hash,
1899 __entry->lseg
1900 )
1901);
1902
1903#define DEFINE_PNFS_LAYOUT_EVENT(name) \
1904 DEFINE_EVENT(pnfs_layout_event, name, \
1905 TP_PROTO(struct inode *inode, \
1906 loff_t pos, \
1907 u64 count, \
1908 enum pnfs_iomode iomode, \
1909 struct pnfs_layout_hdr *lo, \
1910 struct pnfs_layout_segment *lseg \
1911 ), \
1912 TP_ARGS(inode, pos, count, iomode, lo, lseg))
1913
1914DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_pg_init_read);
1915DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_pg_init_write);
1916DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_pg_get_mirror_count);
1917DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_read_done);
1918DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_write_done);
1919DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_read_pagelist);
1920DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_write_pagelist);
1921
1848#endif /* CONFIG_NFS_V4_1 */ 1922#endif /* CONFIG_NFS_V4_1 */
1849 1923
1850#endif /* _TRACE_NFS4_H */ 1924#endif /* _TRACE_NFS4_H */
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 758917463700..75bd5b552ba4 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -2037,6 +2037,8 @@ lookup_again:
2037out_put_layout_hdr: 2037out_put_layout_hdr:
2038 if (first) 2038 if (first)
2039 pnfs_clear_first_layoutget(lo); 2039 pnfs_clear_first_layoutget(lo);
2040 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
2041 PNFS_UPDATE_LAYOUT_EXIT);
2040 pnfs_put_layout_hdr(lo); 2042 pnfs_put_layout_hdr(lo);
2041out: 2043out:
2042 dprintk("%s: inode %s/%llu pNFS layout segment %s for " 2044 dprintk("%s: inode %s/%llu pNFS layout segment %s for "
diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h
index 22494d170619..fd59904a282c 100644
--- a/include/linux/nfs4.h
+++ b/include/linux/nfs4.h
@@ -660,6 +660,7 @@ enum pnfs_update_layout_reason {
660 PNFS_UPDATE_LAYOUT_BLOCKED, 660 PNFS_UPDATE_LAYOUT_BLOCKED,
661 PNFS_UPDATE_LAYOUT_INVALID_OPEN, 661 PNFS_UPDATE_LAYOUT_INVALID_OPEN,
662 PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET, 662 PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET,
663 PNFS_UPDATE_LAYOUT_EXIT,
663}; 664};
664 665
665#define NFS4_OP_MAP_NUM_LONGS \ 666#define NFS4_OP_MAP_NUM_LONGS \