aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/trace_gfs2.h
diff options
context:
space:
mode:
authorBob Peterson <rpeterso@redhat.com>2012-07-19 08:12:40 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2012-07-19 09:51:08 -0400
commit8e2e00473598dd5379d8408cb974dade000acafc (patch)
tree1f7bfdf0d07b6c0315bbd11ffee174742d66a459 /fs/gfs2/trace_gfs2.h
parent294f2ad5a545eb71d397623743ddd8201131bdad (diff)
GFS2: Reduce file fragmentation
This patch reduces GFS2 file fragmentation by pre-reserving blocks. The resulting improved on disk layout greatly speeds up operations in cases which would have resulted in interlaced allocation of blocks previously. A typical example of this is 10 parallel dd processes, each writing to a file in a common dirctory. The implementation uses an rbtree of reservations attached to each resource group (and each inode). Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/trace_gfs2.h')
-rw-r--r--fs/gfs2/trace_gfs2.h59
1 files changed, 57 insertions, 2 deletions
diff --git a/fs/gfs2/trace_gfs2.h b/fs/gfs2/trace_gfs2.h
index 1b8b81588199..a25c252fe412 100644
--- a/fs/gfs2/trace_gfs2.h
+++ b/fs/gfs2/trace_gfs2.h
@@ -14,6 +14,7 @@
14#include <linux/ktime.h> 14#include <linux/ktime.h>
15#include "incore.h" 15#include "incore.h"
16#include "glock.h" 16#include "glock.h"
17#include "rgrp.h"
17 18
18#define dlm_state_name(nn) { DLM_LOCK_##nn, #nn } 19#define dlm_state_name(nn) { DLM_LOCK_##nn, #nn }
19#define glock_trace_name(x) __print_symbolic(x, \ 20#define glock_trace_name(x) __print_symbolic(x, \
@@ -31,6 +32,17 @@
31 { GFS2_BLKST_DINODE, "dinode" }, \ 32 { GFS2_BLKST_DINODE, "dinode" }, \
32 { GFS2_BLKST_UNLINKED, "unlinked" }) 33 { GFS2_BLKST_UNLINKED, "unlinked" })
33 34
35#define TRACE_RS_DELETE 0
36#define TRACE_RS_TREEDEL 1
37#define TRACE_RS_INSERT 2
38#define TRACE_RS_CLAIM 3
39
40#define rs_func_name(x) __print_symbolic(x, \
41 { 0, "del " }, \
42 { 1, "tdel" }, \
43 { 2, "ins " }, \
44 { 3, "clm " })
45
34#define show_glock_flags(flags) __print_flags(flags, "", \ 46#define show_glock_flags(flags) __print_flags(flags, "", \
35 {(1UL << GLF_LOCK), "l" }, \ 47 {(1UL << GLF_LOCK), "l" }, \
36 {(1UL << GLF_DEMOTE), "D" }, \ 48 {(1UL << GLF_DEMOTE), "D" }, \
@@ -470,6 +482,7 @@ TRACE_EVENT(gfs2_block_alloc,
470 __field( u8, block_state ) 482 __field( u8, block_state )
471 __field( u64, rd_addr ) 483 __field( u64, rd_addr )
472 __field( u32, rd_free_clone ) 484 __field( u32, rd_free_clone )
485 __field( u32, rd_reserved )
473 ), 486 ),
474 487
475 TP_fast_assign( 488 TP_fast_assign(
@@ -480,16 +493,58 @@ TRACE_EVENT(gfs2_block_alloc,
480 __entry->block_state = block_state; 493 __entry->block_state = block_state;
481 __entry->rd_addr = rgd->rd_addr; 494 __entry->rd_addr = rgd->rd_addr;
482 __entry->rd_free_clone = rgd->rd_free_clone; 495 __entry->rd_free_clone = rgd->rd_free_clone;
496 __entry->rd_reserved = rgd->rd_reserved;
483 ), 497 ),
484 498
485 TP_printk("%u,%u bmap %llu alloc %llu/%lu %s rg:%llu rf:%u", 499 TP_printk("%u,%u bmap %llu alloc %llu/%lu %s rg:%llu rf:%u rr:%lu",
486 MAJOR(__entry->dev), MINOR(__entry->dev), 500 MAJOR(__entry->dev), MINOR(__entry->dev),
487 (unsigned long long)__entry->inum, 501 (unsigned long long)__entry->inum,
488 (unsigned long long)__entry->start, 502 (unsigned long long)__entry->start,
489 (unsigned long)__entry->len, 503 (unsigned long)__entry->len,
490 block_state_name(__entry->block_state), 504 block_state_name(__entry->block_state),
491 (unsigned long long)__entry->rd_addr, 505 (unsigned long long)__entry->rd_addr,
492 __entry->rd_free_clone) 506 __entry->rd_free_clone, (unsigned long)__entry->rd_reserved)
507);
508
509/* Keep track of multi-block reservations as they are allocated/freed */
510TRACE_EVENT(gfs2_rs,
511
512 TP_PROTO(const struct gfs2_inode *ip, const struct gfs2_blkreserv *rs,
513 u8 func),
514
515 TP_ARGS(ip, rs, func),
516
517 TP_STRUCT__entry(
518 __field( dev_t, dev )
519 __field( u64, rd_addr )
520 __field( u32, rd_free_clone )
521 __field( u32, rd_reserved )
522 __field( u64, inum )
523 __field( u64, start )
524 __field( u32, free )
525 __field( u8, func )
526 ),
527
528 TP_fast_assign(
529 __entry->dev = rs->rs_rgd ? rs->rs_rgd->rd_sbd->sd_vfs->s_dev : 0;
530 __entry->rd_addr = rs->rs_rgd ? rs->rs_rgd->rd_addr : 0;
531 __entry->rd_free_clone = rs->rs_rgd ? rs->rs_rgd->rd_free_clone : 0;
532 __entry->rd_reserved = rs->rs_rgd ? rs->rs_rgd->rd_reserved : 0;
533 __entry->inum = ip ? ip->i_no_addr : 0;
534 __entry->start = gfs2_rs_startblk(rs);
535 __entry->free = rs->rs_free;
536 __entry->func = func;
537 ),
538
539 TP_printk("%u,%u bmap %llu resrv %llu rg:%llu rf:%lu rr:%lu %s "
540 "f:%lu",
541 MAJOR(__entry->dev), MINOR(__entry->dev),
542 (unsigned long long)__entry->inum,
543 (unsigned long long)__entry->start,
544 (unsigned long long)__entry->rd_addr,
545 (unsigned long)__entry->rd_free_clone,
546 (unsigned long)__entry->rd_reserved,
547 rs_func_name(__entry->func), (unsigned long)__entry->free)
493); 548);
494 549
495#endif /* _TRACE_GFS2_H */ 550#endif /* _TRACE_GFS2_H */