All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen@redhat.com>
To: "Theodore Ts'o" <tytso@mit.edu>
Cc: linux-ext4@vger.kernel.org, Andreas Dilger <adilger@sun.com>,
	Alex Tomas <bzzz@sun.com>
Subject: Re: [PATCH, RFC -V2 1/4] ext4: Add configurable run-time mballoc debugging
Date: Sun, 09 Aug 2009 22:42:17 -0500	[thread overview]
Message-ID: <4A7F9719.1030209@redhat.com> (raw)
In-Reply-To: <1249874635-24250-2-git-send-email-tytso@mit.edu>

Theodore Ts'o wrote:
> Allow mballoc debugging to be enabled at run-time instead of just at
> compile time.
> 
> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
> ---
>  fs/ext4/Kconfig   |    9 ++++++
>  fs/ext4/mballoc.c |   81 ++++++++++++++++++++++++++++++++++++++--------------
>  fs/ext4/mballoc.h |   16 ++++++++--
>  3 files changed, 80 insertions(+), 26 deletions(-)

This looks fine to me, though is there any reason to add the debug
verbosity level at this point, when it's all just "1?"

If you're going to do that I suppose I'd suggest some #defines that
give an idea of the expected range... at least low/medium/high... will
our debug go to 11?  ;)

-Eric

> diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig
> index 1523046..d5c0ea2 100644
> --- a/fs/ext4/Kconfig
> +++ b/fs/ext4/Kconfig
> @@ -77,3 +77,12 @@ config EXT4_FS_SECURITY
>  
>  	  If you are not using a security module that requires using
>  	  extended attributes for file security labels, say N.
> +
> +config EXT4_DEBUG
> +	bool "EXT4 debugging support"
> +	depends on EXT4_FS
> +	help
> +	  Enables run-time debugging support for the ext4 filesystem.
> +
> +	  If you select Y here, then you will be able to turn on debugging
> +	  with a command such as "echo 1 > /sys/kernel/debug/ext4/mballoc-debug"
> diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
> index 68cde59..2c81240 100644
> --- a/fs/ext4/mballoc.c
> +++ b/fs/ext4/mballoc.c
> @@ -22,6 +22,7 @@
>   */
>  
>  #include "mballoc.h"
> +#include <linux/debugfs.h>
>  #include <trace/events/ext4.h>
>  
>  /*
> @@ -743,7 +744,7 @@ static int ext4_mb_init_cache(struct page *page, char *incore)
>  	char *data;
>  	char *bitmap;
>  
> -	mb_debug("init page %lu\n", page->index);
> +	mb_debug(1, "init page %lu\n", page->index);
>  
>  	inode = page->mapping->host;
>  	sb = inode->i_sb;
> @@ -822,7 +823,7 @@ static int ext4_mb_init_cache(struct page *page, char *incore)
>  		set_bitmap_uptodate(bh[i]);
>  		bh[i]->b_end_io = end_buffer_read_sync;
>  		submit_bh(READ, bh[i]);
> -		mb_debug("read bitmap for group %u\n", first_group + i);
> +		mb_debug(1, "read bitmap for group %u\n", first_group + i);
>  	}
>  
>  	/* wait for I/O completion */
> @@ -862,7 +863,7 @@ static int ext4_mb_init_cache(struct page *page, char *incore)
>  		if ((first_block + i) & 1) {
>  			/* this is block of buddy */
>  			BUG_ON(incore == NULL);
> -			mb_debug("put buddy for group %u in page %lu/%x\n",
> +			mb_debug(1, "put buddy for group %u in page %lu/%x\n",
>  				group, page->index, i * blocksize);
>  			grinfo = ext4_get_group_info(sb, group);
>  			grinfo->bb_fragments = 0;
> @@ -878,7 +879,7 @@ static int ext4_mb_init_cache(struct page *page, char *incore)
>  		} else {
>  			/* this is block of bitmap */
>  			BUG_ON(incore != NULL);
> -			mb_debug("put bitmap for group %u in page %lu/%x\n",
> +			mb_debug(1, "put bitmap for group %u in page %lu/%x\n",
>  				group, page->index, i * blocksize);
>  
>  			/* see comments in ext4_mb_put_pa() */
> @@ -922,7 +923,7 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
>  	struct ext4_sb_info *sbi = EXT4_SB(sb);
>  	struct inode *inode = sbi->s_buddy_cache;
>  
> -	mb_debug("load group %u\n", group);
> +	mb_debug(1, "load group %u\n", group);
>  
>  	blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize;
>  	grp = ext4_get_group_info(sb, group);
> @@ -1851,7 +1852,7 @@ int ext4_mb_init_group(struct super_block *sb, ext4_group_t group)
>  	struct inode *inode = sbi->s_buddy_cache;
>  	struct page *page = NULL, *bitmap_page = NULL;
>  
> -	mb_debug("init group %u\n", group);
> +	mb_debug(1, "init group %u\n", group);
>  	blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize;
>  	this_grp = ext4_get_group_info(sb, group);
>  	/*
> @@ -2739,7 +2740,7 @@ static void ext4_mb_cleanup_pa(struct ext4_group_info *grp)
>  		kmem_cache_free(ext4_pspace_cachep, pa);
>  	}
>  	if (count)
> -		mb_debug("mballoc: %u PAs left\n", count);
> +		mb_debug(1, "mballoc: %u PAs left\n", count);
>  
>  }
>  
> @@ -2820,7 +2821,7 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn)
>  	list_for_each_safe(l, ltmp, &txn->t_private_list) {
>  		entry = list_entry(l, struct ext4_free_data, list);
>  
> -		mb_debug("gonna free %u blocks in group %u (0x%p):",
> +		mb_debug(1, "gonna free %u blocks in group %u (0x%p):",
>  			 entry->count, entry->group, entry);
>  
>  		err = ext4_mb_load_buddy(sb, entry->group, &e4b);
> @@ -2855,9 +2856,43 @@ static void release_blocks_on_commit(journal_t *journal, transaction_t *txn)
>  		ext4_mb_release_desc(&e4b);
>  	}
>  
> -	mb_debug("freed %u blocks in %u structures\n", count, count2);
> +	mb_debug(1, "freed %u blocks in %u structures\n", count, count2);
>  }
>  
> +#ifdef CONFIG_EXT4_DEBUG
> +u8 mb_enable_debug __read_mostly;
> +
> +static struct dentry *debugfs_dir;
> +static struct dentry *debugfs_debug;
> +
> +static void __init ext4_create_debugfs_entry(void)
> +{
> +	debugfs_dir = debugfs_create_dir("ext4", NULL);
> +	if (debugfs_dir)
> +		debugfs_debug = debugfs_create_u8("mballoc-debug",
> +						  S_IRUGO | S_IWUSR,
> +						  debugfs_dir,
> +						  &mb_enable_debug);
> +}
> +
> +static void __exit ext4_remove_debugfs_entry(void)
> +{
> +	debugfs_remove(debugfs_debug);
> +	debugfs_remove(debugfs_dir);
> +}
> +
> +#else
> +
> +static void __init ext4_create_debugfs_entry(void)
> +{
> +}
> +
> +static void __exit ext4_remove_debugfs_entry(void)
> +{
> +}
> +
> +#endif
> +
>  int __init init_ext4_mballoc(void)
>  {
>  	ext4_pspace_cachep =
> @@ -2885,6 +2920,7 @@ int __init init_ext4_mballoc(void)
>  		kmem_cache_destroy(ext4_ac_cachep);
>  		return -ENOMEM;
>  	}
> +	ext4_create_debugfs_entry();
>  	return 0;
>  }
>  
> @@ -2898,6 +2934,7 @@ void exit_ext4_mballoc(void)
>  	kmem_cache_destroy(ext4_pspace_cachep);
>  	kmem_cache_destroy(ext4_ac_cachep);
>  	kmem_cache_destroy(ext4_free_ext_cachep);
> +	ext4_remove_debugfs_entry();
>  }
>  
>  
> @@ -3042,7 +3079,7 @@ static void ext4_mb_normalize_group_request(struct ext4_allocation_context *ac)
>  		ac->ac_g_ex.fe_len = EXT4_SB(sb)->s_stripe;
>  	else
>  		ac->ac_g_ex.fe_len = EXT4_SB(sb)->s_mb_group_prealloc;
> -	mb_debug("#%u: goal %u blocks for locality group\n",
> +	mb_debug(1, "#%u: goal %u blocks for locality group\n",
>  		current->pid, ac->ac_g_ex.fe_len);
>  }
>  
> @@ -3232,7 +3269,7 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac,
>  		ac->ac_flags |= EXT4_MB_HINT_TRY_GOAL;
>  	}
>  
> -	mb_debug("goal: %u(was %u) blocks at %u\n", (unsigned) size,
> +	mb_debug(1, "goal: %u(was %u) blocks at %u\n", (unsigned) size,
>  		(unsigned) orig_size, (unsigned) start);
>  }
>  
> @@ -3281,7 +3318,7 @@ static void ext4_mb_use_inode_pa(struct ext4_allocation_context *ac,
>  	BUG_ON(pa->pa_free < len);
>  	pa->pa_free -= len;
>  
> -	mb_debug("use %llu/%u from inode pa %p\n", start, len, pa);
> +	mb_debug(1, "use %llu/%u from inode pa %p\n", start, len, pa);
>  }
>  
>  /*
> @@ -3305,7 +3342,7 @@ static void ext4_mb_use_group_pa(struct ext4_allocation_context *ac,
>  	 * in on-disk bitmap -- see ext4_mb_release_context()
>  	 * Other CPUs are prevented from allocating from this pa by lg_mutex
>  	 */
> -	mb_debug("use %u/%u from group pa %p\n", pa->pa_lstart-len, len, pa);
> +	mb_debug(1, "use %u/%u from group pa %p\n", pa->pa_lstart-len, len, pa);
>  }
>  
>  /*
> @@ -3484,7 +3521,7 @@ void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap,
>  		preallocated += len;
>  		count++;
>  	}
> -	mb_debug("prellocated %u for group %u\n", preallocated, group);
> +	mb_debug(1, "prellocated %u for group %u\n", preallocated, group);
>  }
>  
>  static void ext4_mb_pa_callback(struct rcu_head *head)
> @@ -3619,7 +3656,7 @@ ext4_mb_new_inode_pa(struct ext4_allocation_context *ac)
>  	pa->pa_deleted = 0;
>  	pa->pa_type = MB_INODE_PA;
>  
> -	mb_debug("new inode pa %p: %llu/%u for %u\n", pa,
> +	mb_debug(1, "new inode pa %p: %llu/%u for %u\n", pa,
>  			pa->pa_pstart, pa->pa_len, pa->pa_lstart);
>  	trace_ext4_mb_new_inode_pa(ac, pa);
>  
> @@ -3679,7 +3716,7 @@ ext4_mb_new_group_pa(struct ext4_allocation_context *ac)
>  	pa->pa_deleted = 0;
>  	pa->pa_type = MB_GROUP_PA;
>  
> -	mb_debug("new group pa %p: %llu/%u for %u\n", pa,
> +	mb_debug(1, "new group pa %p: %llu/%u for %u\n", pa,
>  			pa->pa_pstart, pa->pa_len, pa->pa_lstart);
>  	trace_ext4_mb_new_group_pa(ac, pa);
>  
> @@ -3758,7 +3795,7 @@ ext4_mb_release_inode_pa(struct ext4_buddy *e4b, struct buffer_head *bitmap_bh,
>  		next = mb_find_next_bit(bitmap_bh->b_data, end, bit);
>  		start = group * EXT4_BLOCKS_PER_GROUP(sb) + bit +
>  				le32_to_cpu(sbi->s_es->s_first_data_block);
> -		mb_debug("    free preallocated %u/%u in group %u\n",
> +		mb_debug(1, "    free preallocated %u/%u in group %u\n",
>  				(unsigned) start, (unsigned) next - bit,
>  				(unsigned) group);
>  		free += next - bit;
> @@ -3849,7 +3886,7 @@ ext4_mb_discard_group_preallocations(struct super_block *sb,
>  	int busy = 0;
>  	int free = 0;
>  
> -	mb_debug("discard preallocation for group %u\n", group);
> +	mb_debug(1, "discard preallocation for group %u\n", group);
>  
>  	if (list_empty(&grp->bb_prealloc_list))
>  		return 0;
> @@ -3973,7 +4010,7 @@ void ext4_discard_preallocations(struct inode *inode)
>  		return;
>  	}
>  
> -	mb_debug("discard preallocation for inode %lu\n", inode->i_ino);
> +	mb_debug(1, "discard preallocation for inode %lu\n", inode->i_ino);
>  	trace_ext4_discard_preallocations(inode);
>  
>  	INIT_LIST_HEAD(&list);
> @@ -4078,7 +4115,7 @@ static void ext4_mb_return_to_preallocation(struct inode *inode,
>  {
>  	BUG_ON(!list_empty(&EXT4_I(inode)->i_prealloc_list));
>  }
> -#ifdef MB_DEBUG
> +#ifdef CONFIG_EXT4_DEBUG
>  static void ext4_mb_show_ac(struct ext4_allocation_context *ac)
>  {
>  	struct super_block *sb = ac->ac_sb;
> @@ -4227,7 +4264,7 @@ ext4_mb_initialize_context(struct ext4_allocation_context *ac,
>  	 * locality group. this is a policy, actually */
>  	ext4_mb_group_or_file(ac);
>  
> -	mb_debug("init ac: %u blocks @ %u, goal %u, flags %x, 2^%d, "
> +	mb_debug(1, "init ac: %u blocks @ %u, goal %u, flags %x, 2^%d, "
>  			"left: %u/%u, right %u/%u to %swritable\n",
>  			(unsigned) ar->len, (unsigned) ar->logical,
>  			(unsigned) ar->goal, ac->ac_flags, ac->ac_2order,
> @@ -4249,7 +4286,7 @@ ext4_mb_discard_lg_preallocations(struct super_block *sb,
>  	struct ext4_prealloc_space *pa, *tmp;
>  	struct ext4_allocation_context *ac;
>  
> -	mb_debug("discard locality group preallocation\n");
> +	mb_debug(1, "discard locality group preallocation\n");
>  
>  	INIT_LIST_HEAD(&discard_list);
>  	ac = kmem_cache_alloc(ext4_ac_cachep, GFP_NOFS);
> diff --git a/fs/ext4/mballoc.h b/fs/ext4/mballoc.h
> index c96bb19..28abb02 100644
> --- a/fs/ext4/mballoc.h
> +++ b/fs/ext4/mballoc.h
> @@ -37,11 +37,19 @@
>  
>  /*
>   */
> -#define MB_DEBUG__
> -#ifdef MB_DEBUG
> -#define mb_debug(fmt, a...)	printk(fmt, ##a)
> +#ifdef CONFIG_EXT4_DEBUG
> +extern u8 mb_enable_debug;
> +
> +#define mb_debug(n, fmt, a...)	                                        \
> +	do {								\
> +		if ((n) <= mb_enable_debug) {		        	\
> +			printk (KERN_DEBUG "(%s, %d): %s: ",		\
> +				__FILE__, __LINE__, __func__);		\
> +			printk (fmt, ## a);				\
> +		}							\
> +	} while (0)
>  #else
> -#define mb_debug(fmt, a...)
> +#define mb_debug(n, fmt, a...)
>  #endif
>  
>  /*


  reply	other threads:[~2009-08-10  3:42 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-08-10  3:23 [PATCH, RFC -V2 0/4] mballoc patches for ext4 Theodore Ts'o
2009-08-10  3:23 ` [PATCH, RFC -V2 1/4] ext4: Add configurable run-time mballoc debugging Theodore Ts'o
2009-08-10  3:42   ` Eric Sandeen [this message]
2009-08-10 20:23     ` Theodore Tso
2009-08-11 18:15   ` Xiang Wang
2009-08-11 18:53     ` Theodore Tso
2009-08-10  3:23 ` [PATCH, RFC -V2 2/4] ext4: Display the mballoc flags in mb_history in hex instead of decimal Theodore Ts'o
2009-08-10  3:44   ` Eric Sandeen
2009-08-10  3:23 ` [PATCH, RFC -V2 3/4] ext4: Fix bugs in mballoc's stream allocation mode Theodore Ts'o
2009-08-20  7:22   ` Aneesh Kumar K.V
2009-08-20 18:20     ` Theodore Tso
2009-08-10  3:23 ` [PATCH, RFC -V2 4/4] ext4: Avoid group preallocation for closed files Theodore Ts'o
2009-08-20  6:40   ` Aneesh Kumar K.V
2009-08-21  2:45     ` Theodore Tso
2009-08-21 12:23       ` Theodore Tso

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A7F9719.1030209@redhat.com \
    --to=sandeen@redhat.com \
    --cc=adilger@sun.com \
    --cc=bzzz@sun.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.