aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Layton <jlayton@poochiereds.net>2015-12-10 10:41:58 -0500
committerTrond Myklebust <trond.myklebust@primarydata.com>2015-12-28 09:57:14 -0500
commit9a4bf31d05a801e2358d96f69b39fb8ce2c69dd8 (patch)
treec132b620128e2035a56baa9b3314d0aaf909647b
parent9759b0fb1d202e6bc9bdab10612189abc9389df8 (diff)
nfs: add new tracepoint for pnfs_update_layout
pnfs_update_layout is really the "nexus" of layout handling. If it returns NULL then we end up going through the MDS. This patch adds some tracepoints to that function that allow us to determine the cause when we end up going through the MDS unexpectedly. Signed-off-by: Jeff Layton <jeff.layton@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r--fs/nfs/nfs4trace.h56
-rw-r--r--fs/nfs/pnfs.c38
-rw-r--r--include/linux/nfs4.h14
3 files changed, 102 insertions, 6 deletions
diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h
index 8704372ac38f..238925c1aafd 100644
--- a/fs/nfs/nfs4trace.h
+++ b/fs/nfs/nfs4trace.h
@@ -1442,6 +1442,62 @@ DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_layoutcommit);
1442DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_layoutreturn); 1442DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_layoutreturn);
1443DEFINE_NFS4_INODE_EVENT(nfs4_layoutreturn_on_close); 1443DEFINE_NFS4_INODE_EVENT(nfs4_layoutreturn_on_close);
1444 1444
1445#define show_pnfs_update_layout_reason(reason) \
1446 __print_symbolic(reason, \
1447 { PNFS_UPDATE_LAYOUT_UNKNOWN, "unknown" }, \
1448 { PNFS_UPDATE_LAYOUT_NO_PNFS, "no pnfs" }, \
1449 { PNFS_UPDATE_LAYOUT_RD_ZEROLEN, "read+zerolen" }, \
1450 { PNFS_UPDATE_LAYOUT_MDSTHRESH, "mdsthresh" }, \
1451 { PNFS_UPDATE_LAYOUT_NOMEM, "nomem" }, \
1452 { PNFS_UPDATE_LAYOUT_BULK_RECALL, "bulk recall" }, \
1453 { PNFS_UPDATE_LAYOUT_IO_TEST_FAIL, "io test fail" }, \
1454 { PNFS_UPDATE_LAYOUT_FOUND_CACHED, "found cached" }, \
1455 { PNFS_UPDATE_LAYOUT_RETURN, "layoutreturn" }, \
1456 { PNFS_UPDATE_LAYOUT_BLOCKED, "layouts blocked" }, \
1457 { PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET, "sent layoutget" })
1458
1459TRACE_EVENT(pnfs_update_layout,
1460 TP_PROTO(struct inode *inode,
1461 loff_t pos,
1462 u64 count,
1463 enum pnfs_iomode iomode,
1464 struct pnfs_layout_segment *lseg,
1465 enum pnfs_update_layout_reason reason
1466 ),
1467 TP_ARGS(inode, pos, count, iomode, lseg, reason),
1468 TP_STRUCT__entry(
1469 __field(dev_t, dev)
1470 __field(u64, fileid)
1471 __field(u32, fhandle)
1472 __field(loff_t, pos)
1473 __field(u64, count)
1474 __field(enum pnfs_iomode, iomode)
1475 __field(struct pnfs_layout_segment *, lseg)
1476 __field(enum pnfs_update_layout_reason, reason)
1477 ),
1478 TP_fast_assign(
1479 __entry->dev = inode->i_sb->s_dev;
1480 __entry->fileid = NFS_FILEID(inode);
1481 __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode));
1482 __entry->pos = pos;
1483 __entry->count = count;
1484 __entry->iomode = iomode;
1485 __entry->lseg = lseg;
1486 __entry->reason = reason;
1487 ),
1488 TP_printk(
1489 "fileid=%02x:%02x:%llu fhandle=0x%08x "
1490 "iomode=%s pos=%llu count=%llu lseg=%p (%s)",
1491 MAJOR(__entry->dev), MINOR(__entry->dev),
1492 (unsigned long long)__entry->fileid,
1493 __entry->fhandle,
1494 show_pnfs_iomode(__entry->iomode),
1495 (unsigned long long)__entry->pos,
1496 (unsigned long long)__entry->count, __entry->lseg,
1497 show_pnfs_update_layout_reason(__entry->reason)
1498 )
1499);
1500
1445#endif /* CONFIG_NFS_V4_1 */ 1501#endif /* CONFIG_NFS_V4_1 */
1446 1502
1447#endif /* _TRACE_NFS4_H */ 1503#endif /* _TRACE_NFS4_H */
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index bec0384499f7..1489065bb051 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1520,14 +1520,23 @@ pnfs_update_layout(struct inode *ino,
1520 struct pnfs_layout_segment *lseg = NULL; 1520 struct pnfs_layout_segment *lseg = NULL;
1521 bool first; 1521 bool first;
1522 1522
1523 if (!pnfs_enabled_sb(NFS_SERVER(ino))) 1523 if (!pnfs_enabled_sb(NFS_SERVER(ino))) {
1524 trace_pnfs_update_layout(ino, pos, count, iomode, lseg,
1525 PNFS_UPDATE_LAYOUT_NO_PNFS);
1524 goto out; 1526 goto out;
1527 }
1525 1528
1526 if (iomode == IOMODE_READ && i_size_read(ino) == 0) 1529 if (iomode == IOMODE_READ && i_size_read(ino) == 0) {
1530 trace_pnfs_update_layout(ino, pos, count, iomode, lseg,
1531 PNFS_UPDATE_LAYOUT_RD_ZEROLEN);
1527 goto out; 1532 goto out;
1533 }
1528 1534
1529 if (pnfs_within_mdsthreshold(ctx, ino, iomode)) 1535 if (pnfs_within_mdsthreshold(ctx, ino, iomode)) {
1536 trace_pnfs_update_layout(ino, pos, count, iomode, lseg,
1537 PNFS_UPDATE_LAYOUT_MDSTHRESH);
1530 goto out; 1538 goto out;
1539 }
1531 1540
1532lookup_again: 1541lookup_again:
1533 first = false; 1542 first = false;
@@ -1535,19 +1544,26 @@ lookup_again:
1535 lo = pnfs_find_alloc_layout(ino, ctx, gfp_flags); 1544 lo = pnfs_find_alloc_layout(ino, ctx, gfp_flags);
1536 if (lo == NULL) { 1545 if (lo == NULL) {
1537 spin_unlock(&ino->i_lock); 1546 spin_unlock(&ino->i_lock);
1547 trace_pnfs_update_layout(ino, pos, count, iomode, lseg,
1548 PNFS_UPDATE_LAYOUT_NOMEM);
1538 goto out; 1549 goto out;
1539 } 1550 }
1540 1551
1541 /* Do we even need to bother with this? */ 1552 /* Do we even need to bother with this? */
1542 if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) { 1553 if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) {
1554 trace_pnfs_update_layout(ino, pos, count, iomode, lseg,
1555 PNFS_UPDATE_LAYOUT_BULK_RECALL);
1543 dprintk("%s matches recall, use MDS\n", __func__); 1556 dprintk("%s matches recall, use MDS\n", __func__);
1544 goto out_unlock; 1557 goto out_unlock;
1545 } 1558 }
1546 1559
1547 /* if LAYOUTGET already failed once we don't try again */ 1560 /* if LAYOUTGET already failed once we don't try again */
1548 if (pnfs_layout_io_test_failed(lo, iomode) && 1561 if (pnfs_layout_io_test_failed(lo, iomode) &&
1549 !pnfs_should_retry_layoutget(lo)) 1562 !pnfs_should_retry_layoutget(lo)) {
1563 trace_pnfs_update_layout(ino, pos, count, iomode, lseg,
1564 PNFS_UPDATE_LAYOUT_IO_TEST_FAIL);
1550 goto out_unlock; 1565 goto out_unlock;
1566 }
1551 1567
1552 first = list_empty(&lo->plh_segs); 1568 first = list_empty(&lo->plh_segs);
1553 if (first) { 1569 if (first) {
@@ -1567,8 +1583,11 @@ lookup_again:
1567 * already exists 1583 * already exists
1568 */ 1584 */
1569 lseg = pnfs_find_lseg(lo, &arg); 1585 lseg = pnfs_find_lseg(lo, &arg);
1570 if (lseg) 1586 if (lseg) {
1587 trace_pnfs_update_layout(ino, pos, count, iomode, lseg,
1588 PNFS_UPDATE_LAYOUT_FOUND_CACHED);
1571 goto out_unlock; 1589 goto out_unlock;
1590 }
1572 } 1591 }
1573 1592
1574 /* 1593 /*
@@ -1585,11 +1604,16 @@ lookup_again:
1585 dprintk("%s retrying\n", __func__); 1604 dprintk("%s retrying\n", __func__);
1586 goto lookup_again; 1605 goto lookup_again;
1587 } 1606 }
1607 trace_pnfs_update_layout(ino, pos, count, iomode, lseg,
1608 PNFS_UPDATE_LAYOUT_RETURN);
1588 goto out_put_layout_hdr; 1609 goto out_put_layout_hdr;
1589 } 1610 }
1590 1611
1591 if (pnfs_layoutgets_blocked(lo)) 1612 if (pnfs_layoutgets_blocked(lo)) {
1613 trace_pnfs_update_layout(ino, pos, count, iomode, lseg,
1614 PNFS_UPDATE_LAYOUT_BLOCKED);
1592 goto out_unlock; 1615 goto out_unlock;
1616 }
1593 atomic_inc(&lo->plh_outstanding); 1617 atomic_inc(&lo->plh_outstanding);
1594 spin_unlock(&ino->i_lock); 1618 spin_unlock(&ino->i_lock);
1595 1619
@@ -1614,6 +1638,8 @@ lookup_again:
1614 lseg = send_layoutget(lo, ctx, &arg, gfp_flags); 1638 lseg = send_layoutget(lo, ctx, &arg, gfp_flags);
1615 pnfs_clear_retry_layoutget(lo); 1639 pnfs_clear_retry_layoutget(lo);
1616 atomic_dec(&lo->plh_outstanding); 1640 atomic_dec(&lo->plh_outstanding);
1641 trace_pnfs_update_layout(ino, pos, count, iomode, lseg,
1642 PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET);
1617out_put_layout_hdr: 1643out_put_layout_hdr:
1618 if (first) 1644 if (first)
1619 pnfs_clear_first_layoutget(lo); 1645 pnfs_clear_first_layoutget(lo);
diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h
index e7e78537aea2..0e30f2c5ff49 100644
--- a/include/linux/nfs4.h
+++ b/include/linux/nfs4.h
@@ -592,4 +592,18 @@ enum data_content4 {
592 NFS4_CONTENT_HOLE = 1, 592 NFS4_CONTENT_HOLE = 1,
593}; 593};
594 594
595enum pnfs_update_layout_reason {
596 PNFS_UPDATE_LAYOUT_UNKNOWN = 0,
597 PNFS_UPDATE_LAYOUT_NO_PNFS,
598 PNFS_UPDATE_LAYOUT_RD_ZEROLEN,
599 PNFS_UPDATE_LAYOUT_MDSTHRESH,
600 PNFS_UPDATE_LAYOUT_NOMEM,
601 PNFS_UPDATE_LAYOUT_BULK_RECALL,
602 PNFS_UPDATE_LAYOUT_IO_TEST_FAIL,
603 PNFS_UPDATE_LAYOUT_FOUND_CACHED,
604 PNFS_UPDATE_LAYOUT_RETURN,
605 PNFS_UPDATE_LAYOUT_BLOCKED,
606 PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET,
607};
608
595#endif 609#endif