From: Liu Bo <bo.li.liu@oracle.com>
To: David Sterba <dsterba@suse.com>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH 04/12] btrfs: change how delay_iput is tracked in btrfs_delalloc_work
Date: Thu, 3 Dec 2015 18:25:37 -0800 [thread overview]
Message-ID: <20151204022537.GH19589@localhost.localdomain> (raw)
In-Reply-To: <a4469a31e3b0cc55ebba9c3aee26cd5632743056.1449161602.git.dsterba@suse.com>
On Thu, Dec 03, 2015 at 05:56:32PM +0100, David Sterba wrote:
> The dellaloc work is not frequently used, the delayed status is once set
> and read so it looks quite safe to drop the member and store the status
> in the lowest bit of the inode pointer.
>
> Combined with the removal of 'wait' we got +2 objects per 4k slab.
>
> Signed-off-by: David Sterba <dsterba@suse.com>
> ---
> fs/btrfs/ctree.h | 5 ++++-
> fs/btrfs/inode.c | 11 +++++++++--
> 2 files changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
> index a61c53bce162..d5e250a65725 100644
> --- a/fs/btrfs/ctree.h
> +++ b/fs/btrfs/ctree.h
> @@ -3901,8 +3901,11 @@ void btrfs_extent_item_to_extent_map(struct inode *inode,
>
> /* inode.c */
> struct btrfs_delalloc_work {
> + /*
> + * Note: lowest bit of inode tracks if the iput is delayed,
> + * do not access the pointer directly.
> + */
> struct inode *inode;
> - int delay_iput;
> struct completion completion;
> struct list_head list;
> struct btrfs_work work;
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 15b29e879ffc..529a53b80ca0 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -9436,16 +9436,21 @@ static void btrfs_run_delalloc_work(struct btrfs_work *work)
> {
> struct btrfs_delalloc_work *delalloc_work;
> struct inode *inode;
> + int delay_iput;
>
> delalloc_work = container_of(work, struct btrfs_delalloc_work,
> work);
> inode = delalloc_work->inode;
> + /* Lowest bit of inode pointer tracks the delayed status */
> + delay_iput = ((unsigned long)inode & 1UL);
> + inode = (struct inode *)((unsigned long)inode & ~1UL);
> +
To be quite frankly, I don't like this, it's a pointer anyway, error-prone in a debugging view, instead would 'u8 delayed_iput' help?
Thanks,
-liubo
> filemap_flush(inode->i_mapping);
> if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT,
> &BTRFS_I(inode)->runtime_flags))
> filemap_flush(inode->i_mapping);
>
> - if (delalloc_work->delay_iput)
> + if (delay_iput)
> btrfs_add_delayed_iput(inode);
> else
> iput(inode);
> @@ -9464,7 +9469,9 @@ struct btrfs_delalloc_work *btrfs_alloc_delalloc_work(struct inode *inode,
> init_completion(&work->completion);
> INIT_LIST_HEAD(&work->list);
> work->inode = inode;
> - work->delay_iput = delay_iput;
> + /* Lowest bit of inode pointer tracks the delayed status */
> + if (delay_iput)
> + *((unsigned long *)work->inode) |= 1UL;
> WARN_ON_ONCE(!inode);
> btrfs_init_work(&work->work, btrfs_flush_delalloc_helper,
> btrfs_run_delalloc_work, NULL, NULL);
> --
> 2.6.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2015-12-04 2:25 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-03 16:56 [PULL][PATCH 00/12] Minor cleanups and code simplifications David Sterba
2015-12-03 16:56 ` [PATCH 01/12] btrfs: make btrfs_close_one_device static David Sterba
2015-12-03 16:56 ` [PATCH 02/12] btrfs: sink parameter wait to btrfs_alloc_delalloc_work David Sterba
2015-12-03 16:56 ` [PATCH 03/12] btrfs: remove wait from struct btrfs_delalloc_work David Sterba
2015-12-03 16:56 ` [PATCH 04/12] btrfs: change how delay_iput is tracked in btrfs_delalloc_work David Sterba
2015-12-04 2:25 ` Liu Bo [this message]
2015-12-04 12:36 ` David Sterba
2015-12-04 12:50 ` Holger Hoffstätte
2015-12-07 14:23 ` David Sterba
2015-12-04 13:08 ` Filipe Manana
2015-12-07 13:52 ` David Sterba
2015-12-03 16:56 ` [PATCH 05/12] btrfs: remove a trivial helper btrfs_set_buffer_uptodate David Sterba
2015-12-03 16:56 ` [PATCH 06/12] btrfs: make set_extent_buffer_uptodate return void David Sterba
2015-12-03 16:56 ` [PATCH 07/12] btrfs: make clear_extent_buffer_uptodate " David Sterba
2015-12-03 16:56 ` [PATCH 08/12] btrfs: make extent_clear_unlock_delalloc " David Sterba
2015-12-03 16:56 ` [PATCH 09/12] btrfs: make end_extent_writepage " David Sterba
2015-12-03 16:56 ` [PATCH 10/12] btrfs: make extent_range_clear_dirty_for_io " David Sterba
2015-12-03 16:56 ` [PATCH 11/12] btrfs: make extent_range_redirty_for_io " David Sterba
2015-12-03 16:56 ` [PATCH 12/12] btrfs: make set_range_writeback " David Sterba
2015-12-07 14:16 ` [PULL][PATCH 00/12] Minor cleanups and code simplifications David Sterba
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=20151204022537.GH19589@localhost.localdomain \
--to=bo.li.liu@oracle.com \
--cc=dsterba@suse.com \
--cc=linux-btrfs@vger.kernel.org \
/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.