Skip to content

Commit d5b9216

Browse files
author
Trond Myklebust
committed
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 <[email protected]>
1 parent 58bbeab commit d5b9216

File tree

5 files changed

+112
-1
lines changed

5 files changed

+112
-1
lines changed

fs/nfs/flexfilelayout/flexfilelayout.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,10 @@ ff_layout_pg_init_read(struct nfs_pageio_descriptor *pgio,
934934
if (pgio->pg_error < 0)
935935
return;
936936
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);
937941
pnfs_put_lseg(pgio->pg_lseg);
938942
pgio->pg_lseg = NULL;
939943
nfs_pageio_reset_read_mds(pgio);
@@ -1000,6 +1004,10 @@ ff_layout_pg_init_write(struct nfs_pageio_descriptor *pgio,
10001004
return;
10011005

10021006
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);
10031011
pnfs_put_lseg(pgio->pg_lseg);
10041012
pgio->pg_lseg = NULL;
10051013
nfs_pageio_reset_write_mds(pgio);
@@ -1026,6 +1034,10 @@ ff_layout_pg_get_mirror_count_write(struct nfs_pageio_descriptor *pgio,
10261034
if (pgio->pg_lseg)
10271035
return FF_LAYOUT_MIRROR_COUNT(pgio->pg_lseg);
10281036

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);
10291041
/* no lseg means that pnfs is not in use, so no mirroring here */
10301042
nfs_pageio_reset_write_mds(pgio);
10311043
out:
@@ -1075,6 +1087,10 @@ static void ff_layout_reset_write(struct nfs_pgio_header *hdr, bool retry_pnfs)
10751087
hdr->args.count,
10761088
(unsigned long long)hdr->args.offset);
10771089

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);
10781094
task->tk_status = pnfs_write_done_resend_to_mds(hdr);
10791095
}
10801096
}
@@ -1094,6 +1110,10 @@ static void ff_layout_reset_read(struct nfs_pgio_header *hdr)
10941110
hdr->args.count,
10951111
(unsigned long long)hdr->args.offset);
10961112

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);
10971117
task->tk_status = pnfs_read_done_resend_to_mds(hdr);
10981118
}
10991119
}
@@ -1827,6 +1847,9 @@ ff_layout_read_pagelist(struct nfs_pgio_header *hdr)
18271847
out_failed:
18281848
if (ff_layout_avoid_mds_available_ds(lseg))
18291849
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);
18301853
return PNFS_NOT_ATTEMPTED;
18311854
}
18321855

@@ -1892,6 +1915,9 @@ ff_layout_write_pagelist(struct nfs_pgio_header *hdr, int sync)
18921915
out_failed:
18931916
if (ff_layout_avoid_mds_available_ds(lseg))
18941917
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);
18951921
return PNFS_NOT_ATTEMPTED;
18961922
}
18971923

fs/nfs/nfs4trace.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,12 @@
1616
EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_read);
1717
EXPORT_TRACEPOINT_SYMBOL_GPL(nfs4_pnfs_write);
1818
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);
1927
#endif

fs/nfs/nfs4trace.h

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1771,6 +1771,7 @@ TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_BLOCKED);
17711771
TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_INVALID_OPEN);
17721772
TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_RETRY);
17731773
TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET);
1774+
TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_EXIT);
17741775

17751776
#define show_pnfs_update_layout_reason(reason) \
17761777
__print_symbolic(reason, \
@@ -1786,7 +1787,8 @@ TRACE_DEFINE_ENUM(PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET);
17861787
{ PNFS_UPDATE_LAYOUT_BLOCKED, "layouts blocked" }, \
17871788
{ PNFS_UPDATE_LAYOUT_INVALID_OPEN, "invalid open" }, \
17881789
{ 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" })
17901792

17911793
TRACE_EVENT(pnfs_update_layout,
17921794
TP_PROTO(struct inode *inode,
@@ -1845,6 +1847,78 @@ TRACE_EVENT(pnfs_update_layout,
18451847
)
18461848
);
18471849

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+
18481922
#endif /* CONFIG_NFS_V4_1 */
18491923

18501924
#endif /* _TRACE_NFS4_H */

fs/nfs/pnfs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,6 +2037,8 @@ pnfs_update_layout(struct inode *ino,
20372037
out_put_layout_hdr:
20382038
if (first)
20392039
pnfs_clear_first_layoutget(lo);
2040+
trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
2041+
PNFS_UPDATE_LAYOUT_EXIT);
20402042
pnfs_put_layout_hdr(lo);
20412043
out:
20422044
dprintk("%s: inode %s/%llu pNFS layout segment %s for "

include/linux/nfs4.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,7 @@ enum pnfs_update_layout_reason {
660660
PNFS_UPDATE_LAYOUT_BLOCKED,
661661
PNFS_UPDATE_LAYOUT_INVALID_OPEN,
662662
PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET,
663+
PNFS_UPDATE_LAYOUT_EXIT,
663664
};
664665

665666
#define NFS4_OP_MAP_NUM_LONGS \

0 commit comments

Comments
 (0)