aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ocfs2/cluster/masklog.c1
-rw-r--r--fs/ocfs2/cluster/masklog.h1
-rw-r--r--fs/ocfs2/ocfs2_trace.h116
-rw-r--r--fs/ocfs2/reservations.c57
4 files changed, 142 insertions, 33 deletions
diff --git a/fs/ocfs2/cluster/masklog.c b/fs/ocfs2/cluster/masklog.c
index ef140ab7dcf8..39f2a46810d1 100644
--- a/fs/ocfs2/cluster/masklog.c
+++ b/fs/ocfs2/cluster/masklog.c
@@ -104,7 +104,6 @@ static struct mlog_attribute mlog_attrs[MLOG_MAX_BITS] = {
104 define_mask(EXPORT), 104 define_mask(EXPORT),
105 define_mask(QUOTA), 105 define_mask(QUOTA),
106 define_mask(BASTS), 106 define_mask(BASTS),
107 define_mask(RESERVATIONS),
108 define_mask(CLUSTER), 107 define_mask(CLUSTER),
109 define_mask(ERROR), 108 define_mask(ERROR),
110 define_mask(NOTICE), 109 define_mask(NOTICE),
diff --git a/fs/ocfs2/cluster/masklog.h b/fs/ocfs2/cluster/masklog.h
index f574b167e8dc..c36b4d8d5aa9 100644
--- a/fs/ocfs2/cluster/masklog.h
+++ b/fs/ocfs2/cluster/masklog.h
@@ -106,7 +106,6 @@
106#define ML_EXPORT 0x0000000010000000ULL /* ocfs2 export operations */ 106#define ML_EXPORT 0x0000000010000000ULL /* ocfs2 export operations */
107#define ML_QUOTA 0x0000000040000000ULL /* ocfs2 quota operations */ 107#define ML_QUOTA 0x0000000040000000ULL /* ocfs2 quota operations */
108#define ML_BASTS 0x0000000100000000ULL /* dlmglue asts and basts */ 108#define ML_BASTS 0x0000000100000000ULL /* dlmglue asts and basts */
109#define ML_RESERVATIONS 0x0000000200000000ULL /* ocfs2 alloc reservations */
110#define ML_CLUSTER 0x0000000400000000ULL /* cluster stack */ 109#define ML_CLUSTER 0x0000000400000000ULL /* cluster stack */
111 110
112/* bits that are infrequently given and frequently matched in the high word */ 111/* bits that are infrequently given and frequently matched in the high word */
diff --git a/fs/ocfs2/ocfs2_trace.h b/fs/ocfs2/ocfs2_trace.h
index 0fc2840d6fb1..1c040fcbd6e7 100644
--- a/fs/ocfs2/ocfs2_trace.h
+++ b/fs/ocfs2/ocfs2_trace.h
@@ -1809,6 +1809,122 @@ DEFINE_OCFS2_ULL_UINT_UINT_EVENT(ocfs2_reflink_xattr_buckets);
1809DEFINE_OCFS2_ULL_UINT_EVENT(ocfs2_reflink_xattr_rec); 1809DEFINE_OCFS2_ULL_UINT_EVENT(ocfs2_reflink_xattr_rec);
1810 1810
1811/* End of trace events for fs/ocfs2/xattr.c. */ 1811/* End of trace events for fs/ocfs2/xattr.c. */
1812
1813/* Trace events for fs/ocfs2/reservations.c. */
1814
1815DEFINE_OCFS2_UINT_UINT_EVENT(ocfs2_resv_insert);
1816
1817DEFINE_OCFS2_ULL_UINT_UINT_UINT_EVENT(ocfs2_resmap_find_free_bits_begin);
1818
1819DEFINE_OCFS2_UINT_UINT_EVENT(ocfs2_resmap_find_free_bits_end);
1820
1821TRACE_EVENT(ocfs2_resv_find_window_begin,
1822 TP_PROTO(unsigned int r_start, unsigned int r_end, unsigned int goal,
1823 unsigned int wanted, int empty_root),
1824 TP_ARGS(r_start, r_end, goal, wanted, empty_root),
1825 TP_STRUCT__entry(
1826 __field(unsigned int, r_start)
1827 __field(unsigned int, r_end)
1828 __field(unsigned int, goal)
1829 __field(unsigned int, wanted)
1830 __field(int, empty_root)
1831 ),
1832 TP_fast_assign(
1833 __entry->r_start = r_start;
1834 __entry->r_end = r_end;
1835 __entry->goal = goal;
1836 __entry->wanted = wanted;
1837 __entry->empty_root = empty_root;
1838 ),
1839 TP_printk("%u %u %u %u %d", __entry->r_start, __entry->r_end,
1840 __entry->goal, __entry->wanted, __entry->empty_root)
1841);
1842
1843DEFINE_OCFS2_UINT_UINT_EVENT(ocfs2_resv_find_window_prev);
1844
1845DEFINE_OCFS2_INT_INT_EVENT(ocfs2_resv_find_window_next);
1846
1847DEFINE_OCFS2_UINT_UINT_UINT_EVENT(ocfs2_cannibalize_resv_begin);
1848
1849TRACE_EVENT(ocfs2_cannibalize_resv_end,
1850 TP_PROTO(unsigned int start, unsigned int end, unsigned int len,
1851 unsigned int last_start, unsigned int last_len),
1852 TP_ARGS(start, end, len, last_start, last_len),
1853 TP_STRUCT__entry(
1854 __field(unsigned int, start)
1855 __field(unsigned int, end)
1856 __field(unsigned int, len)
1857 __field(unsigned int, last_start)
1858 __field(unsigned int, last_len)
1859 ),
1860 TP_fast_assign(
1861 __entry->start = start;
1862 __entry->end = end;
1863 __entry->len = len;
1864 __entry->last_start = last_start;
1865 __entry->last_len = last_len;
1866 ),
1867 TP_printk("%u %u %u %u %u", __entry->start, __entry->end,
1868 __entry->len, __entry->last_start, __entry->last_len)
1869);
1870
1871DEFINE_OCFS2_UINT_UINT_EVENT(ocfs2_resmap_resv_bits);
1872
1873TRACE_EVENT(ocfs2_resmap_claimed_bits_begin,
1874 TP_PROTO(unsigned int cstart, unsigned int cend, unsigned int clen,
1875 unsigned int r_start, unsigned int r_end, unsigned int r_len,
1876 unsigned int last_start, unsigned int last_len),
1877 TP_ARGS(cstart, cend, clen, r_start, r_end,
1878 r_len, last_start, last_len),
1879 TP_STRUCT__entry(
1880 __field(unsigned int, cstart)
1881 __field(unsigned int, cend)
1882 __field(unsigned int, clen)
1883 __field(unsigned int, r_start)
1884 __field(unsigned int, r_end)
1885 __field(unsigned int, r_len)
1886 __field(unsigned int, last_start)
1887 __field(unsigned int, last_len)
1888 ),
1889 TP_fast_assign(
1890 __entry->cstart = cstart;
1891 __entry->cend = cend;
1892 __entry->clen = clen;
1893 __entry->r_start = r_start;
1894 __entry->r_end = r_end;
1895 __entry->r_len = r_len;
1896 __entry->last_start = last_start;
1897 __entry->last_len = last_len;
1898 ),
1899 TP_printk("%u %u %u %u %u %u %u %u",
1900 __entry->cstart, __entry->cend, __entry->clen,
1901 __entry->r_start, __entry->r_end, __entry->r_len,
1902 __entry->last_start, __entry->last_len)
1903);
1904
1905TRACE_EVENT(ocfs2_resmap_claimed_bits_end,
1906 TP_PROTO(unsigned int start, unsigned int end, unsigned int len,
1907 unsigned int last_start, unsigned int last_len),
1908 TP_ARGS(start, end, len, last_start, last_len),
1909 TP_STRUCT__entry(
1910 __field(unsigned int, start)
1911 __field(unsigned int, end)
1912 __field(unsigned int, len)
1913 __field(unsigned int, last_start)
1914 __field(unsigned int, last_len)
1915 ),
1916 TP_fast_assign(
1917 __entry->start = start;
1918 __entry->end = end;
1919 __entry->len = len;
1920 __entry->last_start = last_start;
1921 __entry->last_len = last_len;
1922 ),
1923 TP_printk("%u %u %u %u %u", __entry->start, __entry->end,
1924 __entry->len, __entry->last_start, __entry->last_len)
1925);
1926
1927/* End of trace events for fs/ocfs2/reservations.c. */
1812#endif /* _TRACE_OCFS2_H */ 1928#endif /* _TRACE_OCFS2_H */
1813 1929
1814/* This part must be outside protection */ 1930/* This part must be outside protection */
diff --git a/fs/ocfs2/reservations.c b/fs/ocfs2/reservations.c
index 3e78db361bc7..41ffd36c689c 100644
--- a/fs/ocfs2/reservations.c
+++ b/fs/ocfs2/reservations.c
@@ -30,10 +30,10 @@
30#include <linux/bitops.h> 30#include <linux/bitops.h>
31#include <linux/list.h> 31#include <linux/list.h>
32 32
33#define MLOG_MASK_PREFIX ML_RESERVATIONS
34#include <cluster/masklog.h> 33#include <cluster/masklog.h>
35 34
36#include "ocfs2.h" 35#include "ocfs2.h"
36#include "ocfs2_trace.h"
37 37
38#ifdef CONFIG_OCFS2_DEBUG_FS 38#ifdef CONFIG_OCFS2_DEBUG_FS
39#define OCFS2_CHECK_RESERVATIONS 39#define OCFS2_CHECK_RESERVATIONS
@@ -321,8 +321,7 @@ static void ocfs2_resv_insert(struct ocfs2_reservation_map *resmap,
321 321
322 assert_spin_locked(&resv_lock); 322 assert_spin_locked(&resv_lock);
323 323
324 mlog(0, "Insert reservation start: %u len: %u\n", new->r_start, 324 trace_ocfs2_resv_insert(new->r_start, new->r_len);
325 new->r_len);
326 325
327 while (*p) { 326 while (*p) {
328 parent = *p; 327 parent = *p;
@@ -423,8 +422,8 @@ static int ocfs2_resmap_find_free_bits(struct ocfs2_reservation_map *resmap,
423 unsigned int best_start, best_len = 0; 422 unsigned int best_start, best_len = 0;
424 int offset, start, found; 423 int offset, start, found;
425 424
426 mlog(0, "Find %u bits within range (%u, len %u) resmap len: %u\n", 425 trace_ocfs2_resmap_find_free_bits_begin(search_start, search_len,
427 wanted, search_start, search_len, resmap->m_bitmap_len); 426 wanted, resmap->m_bitmap_len);
428 427
429 found = best_start = best_len = 0; 428 found = best_start = best_len = 0;
430 429
@@ -463,7 +462,7 @@ static int ocfs2_resmap_find_free_bits(struct ocfs2_reservation_map *resmap,
463 *rlen = best_len; 462 *rlen = best_len;
464 *rstart = best_start; 463 *rstart = best_start;
465 464
466 mlog(0, "Found start: %u len: %u\n", best_start, best_len); 465 trace_ocfs2_resmap_find_free_bits_end(best_start, best_len);
467 466
468 return *rlen; 467 return *rlen;
469} 468}
@@ -487,9 +486,8 @@ static void __ocfs2_resv_find_window(struct ocfs2_reservation_map *resmap,
487 * - our window should be last in all reservations 486 * - our window should be last in all reservations
488 * - need to make sure we don't go past end of bitmap 487 * - need to make sure we don't go past end of bitmap
489 */ 488 */
490 489 trace_ocfs2_resv_find_window_begin(resv->r_start, ocfs2_resv_end(resv),
491 mlog(0, "resv start: %u resv end: %u goal: %u wanted: %u\n", 490 goal, wanted, RB_EMPTY_ROOT(root));
492 resv->r_start, ocfs2_resv_end(resv), goal, wanted);
493 491
494 assert_spin_locked(&resv_lock); 492 assert_spin_locked(&resv_lock);
495 493
@@ -498,9 +496,6 @@ static void __ocfs2_resv_find_window(struct ocfs2_reservation_map *resmap,
498 * Easiest case - empty tree. We can just take 496 * Easiest case - empty tree. We can just take
499 * whatever window of free bits we want. 497 * whatever window of free bits we want.
500 */ 498 */
501
502 mlog(0, "Empty root\n");
503
504 clen = ocfs2_resmap_find_free_bits(resmap, wanted, goal, 499 clen = ocfs2_resmap_find_free_bits(resmap, wanted, goal,
505 resmap->m_bitmap_len - goal, 500 resmap->m_bitmap_len - goal,
506 &cstart, &clen); 501 &cstart, &clen);
@@ -524,8 +519,6 @@ static void __ocfs2_resv_find_window(struct ocfs2_reservation_map *resmap,
524 prev_resv = ocfs2_find_resv_lhs(resmap, goal); 519 prev_resv = ocfs2_find_resv_lhs(resmap, goal);
525 520
526 if (prev_resv == NULL) { 521 if (prev_resv == NULL) {
527 mlog(0, "Goal on LHS of leftmost window\n");
528
529 /* 522 /*
530 * A NULL here means that the search code couldn't 523 * A NULL here means that the search code couldn't
531 * find a window that starts before goal. 524 * find a window that starts before goal.
@@ -570,13 +563,15 @@ static void __ocfs2_resv_find_window(struct ocfs2_reservation_map *resmap,
570 next_resv = NULL; 563 next_resv = NULL;
571 } 564 }
572 565
566 trace_ocfs2_resv_find_window_prev(prev_resv->r_start,
567 ocfs2_resv_end(prev_resv));
568
573 prev = &prev_resv->r_node; 569 prev = &prev_resv->r_node;
574 570
575 /* Now we do a linear search for a window, starting at 'prev_rsv' */ 571 /* Now we do a linear search for a window, starting at 'prev_rsv' */
576 while (1) { 572 while (1) {
577 next = rb_next(prev); 573 next = rb_next(prev);
578 if (next) { 574 if (next) {
579 mlog(0, "One more resv found in linear search\n");
580 next_resv = rb_entry(next, 575 next_resv = rb_entry(next,
581 struct ocfs2_alloc_reservation, 576 struct ocfs2_alloc_reservation,
582 r_node); 577 r_node);
@@ -585,7 +580,6 @@ static void __ocfs2_resv_find_window(struct ocfs2_reservation_map *resmap,
585 gap_end = next_resv->r_start - 1; 580 gap_end = next_resv->r_start - 1;
586 gap_len = gap_end - gap_start + 1; 581 gap_len = gap_end - gap_start + 1;
587 } else { 582 } else {
588 mlog(0, "No next node\n");
589 /* 583 /*
590 * We're at the rightmost edge of the 584 * We're at the rightmost edge of the
591 * tree. See if a reservation between this 585 * tree. See if a reservation between this
@@ -596,6 +590,8 @@ static void __ocfs2_resv_find_window(struct ocfs2_reservation_map *resmap,
596 gap_end = resmap->m_bitmap_len - 1; 590 gap_end = resmap->m_bitmap_len - 1;
597 } 591 }
598 592
593 trace_ocfs2_resv_find_window_next(next ? next_resv->r_start: -1,
594 next ? ocfs2_resv_end(next_resv) : -1);
599 /* 595 /*
600 * No need to check this gap if we have already found 596 * No need to check this gap if we have already found
601 * a larger region of free bits. 597 * a larger region of free bits.
@@ -654,8 +650,9 @@ static void ocfs2_cannibalize_resv(struct ocfs2_reservation_map *resmap,
654 lru_resv = list_first_entry(&resmap->m_lru, 650 lru_resv = list_first_entry(&resmap->m_lru,
655 struct ocfs2_alloc_reservation, r_lru); 651 struct ocfs2_alloc_reservation, r_lru);
656 652
657 mlog(0, "lru resv: start: %u len: %u end: %u\n", lru_resv->r_start, 653 trace_ocfs2_cannibalize_resv_begin(lru_resv->r_start,
658 lru_resv->r_len, ocfs2_resv_end(lru_resv)); 654 lru_resv->r_len,
655 ocfs2_resv_end(lru_resv));
659 656
660 /* 657 /*
661 * Cannibalize (some or all) of the target reservation and 658 * Cannibalize (some or all) of the target reservation and
@@ -684,10 +681,9 @@ static void ocfs2_cannibalize_resv(struct ocfs2_reservation_map *resmap,
684 resv->r_len = shrink; 681 resv->r_len = shrink;
685 } 682 }
686 683
687 mlog(0, "Reservation now looks like: r_start: %u r_end: %u " 684 trace_ocfs2_cannibalize_resv_end(resv->r_start, ocfs2_resv_end(resv),
688 "r_len: %u r_last_start: %u r_last_len: %u\n", 685 resv->r_len, resv->r_last_start,
689 resv->r_start, ocfs2_resv_end(resv), resv->r_len, 686 resv->r_last_len);
690 resv->r_last_start, resv->r_last_len);
691 687
692 ocfs2_resv_insert(resmap, resv); 688 ocfs2_resv_insert(resmap, resv);
693} 689}
@@ -748,7 +744,6 @@ int ocfs2_resmap_resv_bits(struct ocfs2_reservation_map *resmap,
748 if ((resv->r_flags & OCFS2_RESV_FLAG_TMP) || wanted < *clen) 744 if ((resv->r_flags & OCFS2_RESV_FLAG_TMP) || wanted < *clen)
749 wanted = *clen; 745 wanted = *clen;
750 746
751 mlog(0, "empty reservation, find new window\n");
752 /* 747 /*
753 * Try to get a window here. If it works, we must fall 748 * Try to get a window here. If it works, we must fall
754 * through and test the bitmap . This avoids some 749 * through and test the bitmap . This avoids some
@@ -757,6 +752,7 @@ int ocfs2_resmap_resv_bits(struct ocfs2_reservation_map *resmap,
757 * that inode. 752 * that inode.
758 */ 753 */
759 ocfs2_resv_find_window(resmap, resv, wanted); 754 ocfs2_resv_find_window(resmap, resv, wanted);
755 trace_ocfs2_resmap_resv_bits(resv->r_start, resv->r_len);
760 } 756 }
761 757
762 BUG_ON(ocfs2_resv_empty(resv)); 758 BUG_ON(ocfs2_resv_empty(resv));
@@ -813,10 +809,10 @@ void ocfs2_resmap_claimed_bits(struct ocfs2_reservation_map *resmap,
813 809
814 spin_lock(&resv_lock); 810 spin_lock(&resv_lock);
815 811
816 mlog(0, "claim bits: cstart: %u cend: %u clen: %u r_start: %u " 812 trace_ocfs2_resmap_claimed_bits_begin(cstart, cend, clen, resv->r_start,
817 "r_end: %u r_len: %u, r_last_start: %u r_last_len: %u\n", 813 ocfs2_resv_end(resv), resv->r_len,
818 cstart, cend, clen, resv->r_start, ocfs2_resv_end(resv), 814 resv->r_last_start,
819 resv->r_len, resv->r_last_start, resv->r_last_len); 815 resv->r_last_len);
820 816
821 BUG_ON(cstart < resv->r_start); 817 BUG_ON(cstart < resv->r_start);
822 BUG_ON(cstart > ocfs2_resv_end(resv)); 818 BUG_ON(cstart > ocfs2_resv_end(resv));
@@ -833,10 +829,9 @@ void ocfs2_resmap_claimed_bits(struct ocfs2_reservation_map *resmap,
833 if (!ocfs2_resv_empty(resv)) 829 if (!ocfs2_resv_empty(resv))
834 ocfs2_resv_mark_lru(resmap, resv); 830 ocfs2_resv_mark_lru(resmap, resv);
835 831
836 mlog(0, "Reservation now looks like: r_start: %u r_end: %u " 832 trace_ocfs2_resmap_claimed_bits_end(resv->r_start, ocfs2_resv_end(resv),
837 "r_len: %u r_last_start: %u r_last_len: %u\n", 833 resv->r_len, resv->r_last_start,
838 resv->r_start, ocfs2_resv_end(resv), resv->r_len, 834 resv->r_last_len);
839 resv->r_last_start, resv->r_last_len);
840 835
841 ocfs2_check_resmap(resmap); 836 ocfs2_check_resmap(resmap);
842 837