diff options
author | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-07-18 09:32:17 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-07-18 15:50:28 -0400 |
commit | d5b9216fd5114be4ed98ca9c1ecc5f164cd8cf5e (patch) | |
tree | e81e74971e58837a9986c48cf38a2e6160a0265c | |
parent | 58bbeab425c6c5e318f5b6ae31d351331ddfb34b (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.c | 26 | ||||
-rw-r--r-- | fs/nfs/nfs4trace.c | 8 | ||||
-rw-r--r-- | fs/nfs/nfs4trace.h | 76 | ||||
-rw-r--r-- | fs/nfs/pnfs.c | 2 | ||||
-rw-r--r-- | include/linux/nfs4.h | 1 |
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; |
936 | out_mds: | 936 | out_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 | ||
1002 | out_mds: | 1006 | out_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); |
1031 | out: | 1043 | out: |
@@ -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) | |||
1827 | out_failed: | 1847 | out_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) | |||
1892 | out_failed: | 1915 | out_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 @@ | |||
16 | EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_read); | 16 | EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_read); |
17 | EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_write); | 17 | EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_write); |
18 | EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_commit_ds); | 18 | EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_commit_ds); |
19 | |||
20 | EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_pg_init_read); | ||
21 | EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_pg_init_write); | ||
22 | EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_pg_get_mirror_count); | ||
23 | EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_read_done); | ||
24 | EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_write_done); | ||
25 | EXPORT_TRACEPOINT_SYMBOL_GPL(pnfs_mds_fallback_read_pagelist); | ||
26 | EXPORT_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); | |||
1771 | TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_INVALID_OPEN); | 1771 | TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_INVALID_OPEN); |
1772 | TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_RETRY); | 1772 | TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_RETRY); |
1773 | TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET); | 1773 | TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET); |
1774 | TRACE_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 | ||
1791 | TRACE_EVENT(pnfs_update_layout, | 1793 | TRACE_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 | ||
1850 | DECLARE_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 | |||
1914 | DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_pg_init_read); | ||
1915 | DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_pg_init_write); | ||
1916 | DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_pg_get_mirror_count); | ||
1917 | DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_read_done); | ||
1918 | DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_write_done); | ||
1919 | DEFINE_PNFS_LAYOUT_EVENT(pnfs_mds_fallback_read_pagelist); | ||
1920 | DEFINE_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: | |||
2037 | out_put_layout_hdr: | 2037 | out_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); |
2041 | out: | 2043 | out: |
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 \ |