diff options
author | Bob Peterson <rpeterso@redhat.com> | 2012-07-19 08:12:40 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2012-07-19 09:51:08 -0400 |
commit | 8e2e00473598dd5379d8408cb974dade000acafc (patch) | |
tree | 1f7bfdf0d07b6c0315bbd11ffee174742d66a459 /fs/gfs2/trace_gfs2.h | |
parent | 294f2ad5a545eb71d397623743ddd8201131bdad (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.h | 59 |
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 */ | ||
510 | TRACE_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 */ |