From: Dave Chinner <david@fromorbit.com>
To: Christoph Hellwig <hch@infradead.org>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH 0/4] XFS: replace the mount inode list with radix tree traversals V2
Date: Thu, 24 Jul 2008 00:30:09 +1000 [thread overview]
Message-ID: <20080723143009.GM6761@disturbed> (raw)
In-Reply-To: <20080723071748.GA25807@infradead.org>
On Wed, Jul 23, 2008 at 03:17:48AM -0400, Christoph Hellwig wrote:
> On Wed, Jul 23, 2008 at 10:41:09AM +1000, Dave Chinner wrote:
> > The list of all inodes on a mount is superfluous. We can traverse
> > all inodes now by walking the per-AG inode radix trees without
> > needing a separate list. This enables us to remove a bunch of
> > complex list traversal code and remove another two pointers from
> > the xfs_inode.
> >
> > Also, by replacing the sync traversal with an ascending inode
> > number traversal, we will issue better inode I/O patterns for
> > writeback triggered by xfssyncd or unmount.
>
> All patches looks good to me. Well, minus the xfsidbg issue in 4
> which would be a merge blocker for that patch.
Compile tested version of the xfsidbg code. I have no kdb enabled
machines to test it on, so this is as good as I can do right
now.
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
Kill the idbg users of the mount inode list and
replace with radix tree walks.
Signed-off-by: Dave Chinner <david@fromorbit.com>
---
fs/xfs/xfsidbg.c | 124 +++++++++++++++++++++++++++++++++----------------------
1 file changed, 76 insertions(+), 48 deletions(-)
Index: linux-2.6-xfs/fs/xfs/xfsidbg.c
===================================================================
--- linux-2.6-xfs.orig/fs/xfs/xfsidbg.c 2008-07-24 00:20:26.886167169 +1000
+++ linux-2.6-xfs/fs/xfs/xfsidbg.c 2008-07-24 00:20:39.950162171 +1000
@@ -5734,20 +5734,27 @@ xfsidbg_xiclogtrace(xlog_in_core_t *iclo
static void
xfsidbg_xinodes(xfs_mount_t *mp)
{
- xfs_inode_t *ip;
+ int i;
kdb_printf("xfs_mount at 0x%p\n", mp);
- ip = mp->m_inodes;
- if (ip != NULL) {
+ for (i = 0; i < mp->m_sb.sb_agcount; i++) {
+ xfs_perag_t *pag = &mp->m_perag[i];
+ xfs_inode_t *ip = NULL;
+ int first_index = 0;
+ int nr_found;
+
+ if (!pag->pag_ici_init)
+ continue;
do {
- if (ip->i_mount == NULL) {
- ip = ip->i_mnext;
- continue;
- }
+ nr_found = radix_tree_gang_lookup(&pag->pag_ici_root,
+ (void**)&ip, first_index, 1);
+ if (!nr_found)
+ break;
+ /* update the index for the next lookup */
+ first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1);
kdb_printf("\n");
xfsidbg_xnode(ip);
- ip = ip->i_mnext;
- } while (ip != mp->m_inodes);
+ } while (nr_found);
}
kdb_printf("\nEnd of Inodes\n");
}
@@ -5755,23 +5762,30 @@ xfsidbg_xinodes(xfs_mount_t *mp)
static void
xfsidbg_delayed_blocks(xfs_mount_t *mp)
{
- xfs_inode_t *ip;
unsigned int total = 0;
unsigned int icount = 0;
+ int i;
- ip = mp->m_inodes;
- if (ip != NULL) {
+ for (i = 0; i < mp->m_sb.sb_agcount; i++) {
+ xfs_perag_t *pag = &mp->m_perag[i];
+ xfs_inode_t *ip = NULL;
+ int first_index = 0;
+ int nr_found;
+
+ if (!pag->pag_ici_init)
+ continue;
do {
- if (ip->i_mount == NULL) {
- ip = ip->i_mnext;
- continue;
- }
+ nr_found = radix_tree_gang_lookup(&pag->pag_ici_root,
+ (void**)&ip, first_index, 1);
+ if (!nr_found)
+ break;
+ /* update the index for the next lookup */
+ first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1);
if (ip->i_delayed_blks) {
total += ip->i_delayed_blks;
icount++;
}
- ip = ip->i_mnext;
- } while (ip != mp->m_inodes);
+ } while (nr_found);
}
kdb_printf("delayed blocks total: %d in %d inodes\n", total, icount);
}
@@ -5779,21 +5793,28 @@ xfsidbg_delayed_blocks(xfs_mount_t *mp)
static void
xfsidbg_xinodes_quiesce(xfs_mount_t *mp)
{
- xfs_inode_t *ip;
+ int i;
kdb_printf("xfs_mount at 0x%p\n", mp);
- ip = mp->m_inodes;
- if (ip != NULL) {
+ for (i = 0; i < mp->m_sb.sb_agcount; i++) {
+ xfs_perag_t *pag = &mp->m_perag[i];
+ xfs_inode_t *ip = NULL;
+ int first_index = 0;
+ int nr_found;
+
+ if (!pag->pag_ici_init)
+ continue;
do {
- if (ip->i_mount == NULL) {
- ip = ip->i_mnext;
- continue;
- }
+ nr_found = radix_tree_gang_lookup(&pag->pag_ici_root,
+ (void**)&ip, first_index, 1);
+ if (!nr_found)
+ break;
+ /* update the index for the next lookup */
+ first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1);
if (!(ip->i_flags & XFS_IQUIESCE)) {
kdb_printf("ip 0x%p not quiesced\n", ip);
}
- ip = ip->i_mnext;
- } while (ip != mp->m_inodes);
+ } while (nr_found);
}
kdb_printf("\nEnd of Inodes\n");
}
@@ -6319,8 +6340,8 @@ xfsidbg_xmount(xfs_mount_t *mp)
mp->m_rtdev_targp ? mp->m_rtdev_targp->bt_dev : 0);
kdb_printf("bsize %d agfrotor %d xfs_rotorstep %d agirotor %d\n",
mp->m_bsize, mp->m_agfrotor, xfs_rotorstep, mp->m_agirotor);
- kdb_printf("inodes 0x%p ilock 0x%p ireclaims 0x%x\n",
- mp->m_inodes, &mp->m_ilock, mp->m_ireclaims);
+ kdb_printf("ilock 0x%p ireclaims 0x%x\n",
+ &mp->m_ilock, mp->m_ireclaims);
kdb_printf("readio_log 0x%x readio_blocks 0x%x ",
mp->m_readio_log, mp->m_readio_blocks);
kdb_printf("writeio_log 0x%x writeio_blocks 0x%x\n",
@@ -6409,11 +6430,7 @@ xfsidbg_xnode(xfs_inode_t *ip)
NULL
};
- kdb_printf("mount 0x%p mnext 0x%p mprev 0x%p vnode 0x%p \n",
- ip->i_mount,
- ip->i_mnext,
- ip->i_mprev,
- XFS_ITOV_NULL(ip));
+ kdb_printf("mount 0x%p vnode 0x%p \n", ip->i_mount, XFS_ITOV_NULL(ip));
kdb_printf("dev %x ino %s\n",
ip->i_mount->m_ddev_targp->bt_dev,
xfs_fmtino(ip->i_ino, ip->i_mount));
@@ -6614,22 +6631,33 @@ xfsidbg_xqm_dquot(xfs_dquot_t *dqp)
static void
xfsidbg_xqm_dqattached_inos(xfs_mount_t *mp)
{
- xfs_inode_t *ip;
- int n = 0;
+ int i, n = 0;
- ip = mp->m_inodes;
- do {
- if (ip->i_mount == NULL) {
- ip = ip->i_mnext;
+ kdb_printf("xfs_mount at 0x%p\n", mp);
+ for (i = 0; i < mp->m_sb.sb_agcount; i++) {
+ xfs_perag_t *pag = &mp->m_perag[i];
+ xfs_inode_t *ip = NULL;
+ int first_index = 0;
+ int nr_found;
+
+ if (!pag->pag_ici_init)
continue;
- }
- if (ip->i_udquot || ip->i_gdquot) {
- n++;
- kdb_printf("inode = 0x%p, ino %d: udq 0x%p, gdq 0x%p\n",
- ip, (int)ip->i_ino, ip->i_udquot, ip->i_gdquot);
- }
- ip = ip->i_mnext;
- } while (ip != mp->m_inodes);
+ do {
+ nr_found = radix_tree_gang_lookup(&pag->pag_ici_root,
+ (void**)&ip, first_index, 1);
+ if (!nr_found)
+ break;
+ /* update the index for the next lookup */
+ first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1);
+ if (ip->i_udquot || ip->i_gdquot) {
+ n++;
+ kdb_printf("inode = 0x%p, ino %d: udq 0x%p, gdq 0x%p\n",
+ ip, (int)ip->i_ino, ip->i_udquot, ip->i_gdquot);
+ }
+ kdb_printf("\n");
+ xfsidbg_xnode(ip);
+ } while (nr_found);
+ }
kdb_printf("\nNumber of inodes with dquots attached: %d\n", n);
}
next prev parent reply other threads:[~2008-07-23 14:29 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-23 0:41 [PATCH 0/4] XFS: replace the mount inode list with radix tree traversals V2 Dave Chinner
2008-07-23 0:41 ` [PATCH 1/4] XFS: Remove xfs_iflush_all and clean up xfs_finish_reclaim_all() V2 Dave Chinner
2008-07-23 0:41 ` [PATCH 2/4] XFS: Use the inode tree for finding dirty inodes V2 Dave Chinner
2008-07-23 0:41 ` [PATCH 3/4] XFS: Traverse inode trees when releasing dquots V2 Dave Chinner
2008-07-23 0:41 ` [PATCH 4/4] XFS: remove the mount inode list Dave Chinner
2008-07-23 20:46 ` Christoph Hellwig
2008-07-23 2:23 ` [PATCH 0/4] XFS: replace the mount inode list with radix tree traversals V2 Mark Goodwin
2008-07-23 4:33 ` Dave Chinner
2008-07-23 7:17 ` Christoph Hellwig
2008-07-23 14:30 ` Dave Chinner [this message]
[not found] ` <20080811140850.GA12521@infradead.org>
2008-08-12 0:19 ` Dave Chinner
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=20080723143009.GM6761@disturbed \
--to=david@fromorbit.com \
--cc=hch@infradead.org \
--cc=xfs@oss.sgi.com \
/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.