From: Dave Chinner <david@fromorbit.com>
To: sandeen@redhat.com
Cc: xfs <linux-xfs@vger.kernel.org>, "Darrick J. Wong" <djwong@kernel.org>
Subject: Re: [PATCH V3 RFC] xfsprogs: remove stubbed-out kernel functions out from xfs_shared.h
Date: Fri, 5 Nov 2021 09:38:23 +1100 [thread overview]
Message-ID: <20211104223823.GF449541@dread.disaster.area> (raw)
In-Reply-To: <fa2fe2c5-645b-6263-3493-b59b4d096488@redhat.com>
On Thu, Nov 04, 2021 at 12:15:04PM -0500, Eric Sandeen wrote:
> Remove these kernel stubs by #ifdeffing code instead.
>
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
>
> Dave preferred #ifdefs over stubs, and this is what I came up with.
>
> Honestly, I think this is worse, and will lead to more libxfs-sync pain
> unless we're willing to scatter #ifdefs around the kernel code as well,
> but I figured I'd put this out there for discussion.
>
> diff --git a/libxfs/xfs_ag.c b/libxfs/xfs_ag.c
> index 9eda6eba..c01986f7 100644
> --- a/libxfs/xfs_ag.c
> +++ b/libxfs/xfs_ag.c
> @@ -170,7 +170,9 @@ __xfs_free_perag(
> {
> struct xfs_perag *pag = container_of(head, struct xfs_perag, rcu_head);
> +#ifdef __KERNEL__
> ASSERT(!delayed_work_pending(&pag->pag_blockgc_work));
> +#endif /* __KERNEL__ */
> ASSERT(atomic_read(&pag->pag_ref) == 0);
> kmem_free(pag);
> }
> @@ -192,9 +194,11 @@ xfs_free_perag(
> ASSERT(pag);
> ASSERT(atomic_read(&pag->pag_ref) == 0);
> +#ifdef __KERNEL__
> cancel_delayed_work_sync(&pag->pag_blockgc_work);
> xfs_iunlink_destroy(pag);
> xfs_buf_hash_destroy(pag);
> +#endif /* __KERNEL__ */
> call_rcu(&pag->rcu_head, __xfs_free_perag);
> }
These can be stubbed in libxfs_priv.h as we do with all other kernel
functions we don't use:
#define delayed_work_pending(a) ((void)0)
#define cancel_delayed_work_sync(a) ((void)0)
#define xfs_iunlink_destroy(a) ((void)0)
#define xfs_buf_hash_destroy(a) ((void)0)
That is the normal way we avoid needing these ifdef KERNEL clauses
in the libxfs C code.
> @@ -246,6 +250,7 @@ xfs_initialize_perag(
> spin_unlock(&mp->m_perag_lock);
> radix_tree_preload_end();
> +#ifdef __KERNEL__
> /* Place kernel structure only init below this point. */
> spin_lock_init(&pag->pag_ici_lock);
> spin_lock_init(&pag->pagb_lock);
> @@ -267,6 +272,7 @@ xfs_initialize_perag(
> /* first new pag is fully initialized */
> if (first_initialised == NULLAGNUMBER)
> first_initialised = index;
> +#endif /* __KERNEL__ */
> }
endif is in the wrong place - it needs to be before the
first_initialised checks because that is necessary for error
unwinding.
> index = xfs_set_inode_alloc(mp, agcount);
> @@ -277,10 +283,12 @@ xfs_initialize_perag(
> mp->m_ag_prealloc_blocks = xfs_prealloc_blocks(mp);
> return 0;
> +#ifdef __KERNEL__
> out_hash_destroy:
> xfs_buf_hash_destroy(pag);
> out_remove_pag:
> radix_tree_delete(&mp->m_perag_tree, index);
> +#endif /* __KERNEL__ */
> out_free_pag:
> kmem_free(pag);
> out_unwind_new_pags:
Again, stubbing out the functions like so:
#define xfs_buf_hash_init(a) ((void)0)
#define xfs_unlink_init(a) ((void)0)
means that the conditional init code doesn't need to be ifdef'd out
and so the error unwinding doesn't need to be ifdef'd out, either.
And, FWIW, you missed the xfs_buf_hash_destroy/xfs_iunlink_destroy
calls in the unwinding code....
> diff --git a/libxfs/xfs_ag.h b/libxfs/xfs_ag.h
> index 4c6f9045..dda1303e 100644
> --- a/libxfs/xfs_ag.h
> +++ b/libxfs/xfs_ag.h
> @@ -64,6 +64,9 @@ struct xfs_perag {
> /* Blocks reserved for the reverse mapping btree. */
> struct xfs_ag_resv pag_rmapbt_resv;
> + /* for rcu-safe freeing */
> + struct rcu_head rcu_head;
> +
> /* -- kernel only structures below this line -- */
> /*
Moving the rcu_head needs to be done in a separate patch, as that
needs to be done on the kernel side, too. When this change went into
the kernel, we didn't have userspace RCU so it was considered a
kernel only structure....
With those changes, we end up with some new stubs in libxfs_priv.h
and two places where we need #ifdef __KERNEL__ in xfs_ag.[ch]. Most
of the mess in this patch goes away....
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
next prev parent reply other threads:[~2021-11-04 22:38 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-04 2:21 [PATCH] xfsprogs: move stubbed-out kernel functions out of xfs_shared.h Eric Sandeen
2021-11-04 2:28 ` Darrick J. Wong
2021-11-04 2:55 ` Eric Sandeen
2021-11-04 2:59 ` [PATCH V2] " Eric Sandeen
2021-11-04 3:14 ` Darrick J. Wong
2021-11-04 3:33 ` Eric Sandeen
2021-11-04 17:15 ` [PATCH V3 RFC] xfsprogs: remove stubbed-out kernel functions out from xfs_shared.h Eric Sandeen
2021-11-04 19:08 ` Darrick J. Wong
2021-11-04 22:38 ` Dave Chinner [this message]
2021-11-05 16:40 ` Eric Sandeen
2021-11-07 22:58 ` 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=20211104223823.GF449541@dread.disaster.area \
--to=david@fromorbit.com \
--cc=djwong@kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox