Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Jeff Layton and committed by
Trond Myklebust
9a4bf31d 9759b0fb

+102 -6
+56
fs/nfs/nfs4trace.h
··· 1442 1442 DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_layoutreturn); 1443 1443 DEFINE_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 + 1459 + TRACE_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 1501 #endif /* CONFIG_NFS_V4_1 */ 1446 1502 1447 1503 #endif /* _TRACE_NFS4_H */
+32 -6
fs/nfs/pnfs.c
··· 1520 1520 struct pnfs_layout_segment *lseg = NULL; 1521 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 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 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 1538 goto out; 1539 + } 1531 1540 1532 1541 lookup_again: 1533 1542 first = false; ··· 1544 1535 lo = pnfs_find_alloc_layout(ino, ctx, gfp_flags); 1545 1536 if (lo == NULL) { 1546 1537 spin_unlock(&ino->i_lock); 1538 + trace_pnfs_update_layout(ino, pos, count, iomode, lseg, 1539 + PNFS_UPDATE_LAYOUT_NOMEM); 1547 1540 goto out; 1548 1541 } 1549 1542 1550 1543 /* Do we even need to bother with this? */ 1551 1544 if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) { 1545 + trace_pnfs_update_layout(ino, pos, count, iomode, lseg, 1546 + PNFS_UPDATE_LAYOUT_BULK_RECALL); 1552 1547 dprintk("%s matches recall, use MDS\n", __func__); 1553 1548 goto out_unlock; 1554 1549 } 1555 1550 1556 1551 /* if LAYOUTGET already failed once we don't try again */ 1557 1552 if (pnfs_layout_io_test_failed(lo, iomode) && 1558 - !pnfs_should_retry_layoutget(lo)) 1553 + !pnfs_should_retry_layoutget(lo)) { 1554 + trace_pnfs_update_layout(ino, pos, count, iomode, lseg, 1555 + PNFS_UPDATE_LAYOUT_IO_TEST_FAIL); 1559 1556 goto out_unlock; 1557 + } 1560 1558 1561 1559 first = list_empty(&lo->plh_segs); 1562 1560 if (first) { ··· 1583 1567 * already exists 1584 1568 */ 1585 1569 lseg = pnfs_find_lseg(lo, &arg); 1586 - if (lseg) 1570 + if (lseg) { 1571 + trace_pnfs_update_layout(ino, pos, count, iomode, lseg, 1572 + PNFS_UPDATE_LAYOUT_FOUND_CACHED); 1587 1573 goto out_unlock; 1574 + } 1588 1575 } 1589 1576 1590 1577 /* ··· 1604 1585 dprintk("%s retrying\n", __func__); 1605 1586 goto lookup_again; 1606 1587 } 1588 + trace_pnfs_update_layout(ino, pos, count, iomode, lseg, 1589 + PNFS_UPDATE_LAYOUT_RETURN); 1607 1590 goto out_put_layout_hdr; 1608 1591 } 1609 1592 1610 - if (pnfs_layoutgets_blocked(lo)) 1593 + if (pnfs_layoutgets_blocked(lo)) { 1594 + trace_pnfs_update_layout(ino, pos, count, iomode, lseg, 1595 + PNFS_UPDATE_LAYOUT_BLOCKED); 1611 1596 goto out_unlock; 1597 + } 1612 1598 atomic_inc(&lo->plh_outstanding); 1613 1599 spin_unlock(&ino->i_lock); 1614 1600 ··· 1638 1614 lseg = send_layoutget(lo, ctx, &arg, gfp_flags); 1639 1615 pnfs_clear_retry_layoutget(lo); 1640 1616 atomic_dec(&lo->plh_outstanding); 1617 + trace_pnfs_update_layout(ino, pos, count, iomode, lseg, 1618 + PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET); 1641 1619 out_put_layout_hdr: 1642 1620 if (first) 1643 1621 pnfs_clear_first_layoutget(lo);
+14
include/linux/nfs4.h
··· 592 592 NFS4_CONTENT_HOLE = 1, 593 593 }; 594 594 595 + enum 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 609 #endif