[Cluster-devel] [GFS2 Patch][TRY 2] GFS2: Add rgrp information to block_alloc trace point

Steven Whitehouse swhiteho at redhat.com
Fri May 11 09:56:47 UTC 2012


Hi,

Now in the -nmw git tree. Thanks,

Steve.

On Wed, 2012-05-09 at 12:11 -0400, Bob Peterson wrote:
> Hi,
> 
> This is a second attempt at a patch that adds rgrp information to the
> block allocation trace point for GFS2. As suggested, the patch was
> modified to list the rgrp information _after_ the fields that exist today.
> 
> Again, the reason for this patch is to allow us to trace and debug
> problems with the block reservations patch, which is still in the works.
> We can debug problems with reservations if we can see what block allocations
> result from the block reservations. It may also be handy in figuring out
> if there are problems in rgrp free space accounting. In other words,
> we can use it to track the rgrp and its free space along side the allocations
> that are taking place.
> 
> Regards,
> 
> Bob Peterson
> Red Hat File Systems
> 
> Signed-off-by: Bob Peterson <rpeterso at redhat.com> 
> ---
> Author: Bob Peterson <rpeterso at redhat.com>
> Date:   Thu Apr 12 08:32:45 2012 -0500
> 
> GFS2: Add rgrp information to block_alloc trace point
> 
> This patch adds resource group information to the block allocation
> trace point for GFS2. This makes it easier to debug problems with
> resource groups, such as management of the number of free blocks.
> 
> diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
> index 645c16f..f74fb9b 100644
> --- a/fs/gfs2/rgrp.c
> +++ b/fs/gfs2/rgrp.c
> @@ -1556,7 +1556,7 @@ int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *nblocks,
>  				  ip->i_inode.i_gid);
>  
>  	rgd->rd_free_clone -= *nblocks;
> -	trace_gfs2_block_alloc(ip, block, *nblocks,
> +	trace_gfs2_block_alloc(ip, rgd, block, *nblocks,
>  			       dinode ? GFS2_BLKST_DINODE : GFS2_BLKST_USED);
>  	*bn = block;
>  	return 0;
> @@ -1583,7 +1583,7 @@ void __gfs2_free_blocks(struct gfs2_inode *ip, u64 bstart, u32 blen, int meta)
>  	rgd = rgblk_free(sdp, bstart, blen, GFS2_BLKST_FREE);
>  	if (!rgd)
>  		return;
> -	trace_gfs2_block_alloc(ip, bstart, blen, GFS2_BLKST_FREE);
> +	trace_gfs2_block_alloc(ip, rgd, bstart, blen, GFS2_BLKST_FREE);
>  	rgd->rd_free += blen;
>  	rgd->rd_flags &= ~GFS2_RGF_TRIMMED;
>  	gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1);
> @@ -1621,7 +1621,7 @@ void gfs2_unlink_di(struct inode *inode)
>  	rgd = rgblk_free(sdp, blkno, 1, GFS2_BLKST_UNLINKED);
>  	if (!rgd)
>  		return;
> -	trace_gfs2_block_alloc(ip, blkno, 1, GFS2_BLKST_UNLINKED);
> +	trace_gfs2_block_alloc(ip, rgd, blkno, 1, GFS2_BLKST_UNLINKED);
>  	gfs2_trans_add_bh(rgd->rd_gl, rgd->rd_bits[0].bi_bh, 1);
>  	gfs2_rgrp_out(rgd, rgd->rd_bits[0].bi_bh->b_data);
>  }
> @@ -1651,7 +1651,7 @@ static void gfs2_free_uninit_di(struct gfs2_rgrpd *rgd, u64 blkno)
>  void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip)
>  {
>  	gfs2_free_uninit_di(rgd, ip->i_no_addr);
> -	trace_gfs2_block_alloc(ip, ip->i_no_addr, 1, GFS2_BLKST_FREE);
> +	trace_gfs2_block_alloc(ip, rgd, ip->i_no_addr, 1, GFS2_BLKST_FREE);
>  	gfs2_quota_change(ip, -1, ip->i_inode.i_uid, ip->i_inode.i_gid);
>  	gfs2_meta_wipe(ip, ip->i_no_addr, 1);
>  }
> diff --git a/fs/gfs2/trace_gfs2.h b/fs/gfs2/trace_gfs2.h
> index dfa89cd..1b8b815 100644
> --- a/fs/gfs2/trace_gfs2.h
> +++ b/fs/gfs2/trace_gfs2.h
> @@ -457,10 +457,10 @@ TRACE_EVENT(gfs2_bmap,
>  /* Keep track of blocks as they are allocated/freed */
>  TRACE_EVENT(gfs2_block_alloc,
>  
> -	TP_PROTO(const struct gfs2_inode *ip, u64 block, unsigned len,
> -		u8 block_state),
> +	TP_PROTO(const struct gfs2_inode *ip, struct gfs2_rgrpd *rgd,
> +		 u64 block, unsigned len, u8 block_state),
>  
> -	TP_ARGS(ip, block, len, block_state),
> +	TP_ARGS(ip, rgd, block, len, block_state),
>  
>  	TP_STRUCT__entry(
>  		__field(        dev_t,  dev                     )
> @@ -468,6 +468,8 @@ TRACE_EVENT(gfs2_block_alloc,
>  		__field(	u64,	inum			)
>  		__field(	u32,	len			)
>  		__field(	u8,	block_state		)
> +		__field(        u64,	rd_addr			)
> +		__field(        u32,	rd_free_clone		)
>  	),
>  
>  	TP_fast_assign(
> @@ -476,14 +478,18 @@ TRACE_EVENT(gfs2_block_alloc,
>  		__entry->inum		= ip->i_no_addr;
>  		__entry->len		= len;
>  		__entry->block_state	= block_state;
> +		__entry->rd_addr	= rgd->rd_addr;
> +		__entry->rd_free_clone	= rgd->rd_free_clone;
>  	),
>  
> -	TP_printk("%u,%u bmap %llu alloc %llu/%lu %s",
> +	TP_printk("%u,%u bmap %llu alloc %llu/%lu %s rg:%llu rf:%u",
>  		  MAJOR(__entry->dev), MINOR(__entry->dev),
>  		  (unsigned long long)__entry->inum,
>  		  (unsigned long long)__entry->start,
>  		  (unsigned long)__entry->len,
> -		  block_state_name(__entry->block_state))
> +		  block_state_name(__entry->block_state),
> +		  (unsigned long long)__entry->rd_addr,
> +		  __entry->rd_free_clone)
>  );
>  
>  #endif /* _TRACE_GFS2_H */
> 





More information about the Cluster-devel mailing list