From: Jason Gunthorpe <jgg@nvidia.com>
To: Leon Romanovsky <leon@kernel.org>
Cc: Aharon Landau <aharonl@nvidia.com>,
linux-rdma@vger.kernel.org, netdev@vger.kernel.org,
Saeed Mahameed <saeedm@nvidia.com>
Subject: Re: [PATCH rdma-next 2/5] RDMA/mlx5: Replace cache list with Xarray
Date: Wed, 8 Jun 2022 08:01:44 -0300 [thread overview]
Message-ID: <20220608110144.GA796320@nvidia.com> (raw)
In-Reply-To: <b743b4b025c5553a24a0642474583fb3de8bf0de.1654601897.git.leonro@nvidia.com>
On Tue, Jun 07, 2022 at 02:40:12PM +0300, Leon Romanovsky wrote:
> +static int push_reserve_mkey(struct mlx5_cache_ent *ent, bool limit_pendings)
> +{
> + unsigned long to_reserve;
> + void *old;
> + int err;
> +
> + xa_lock_irq(&ent->mkeys);
> + while (true) {
> + if (limit_pendings &&
> + (ent->reserved - ent->stored) > MAX_PENDING_REG_MR) {
> + err = -EAGAIN;
> + goto err;
> + }
> +
> + to_reserve = ent->reserved;
> + old = __xa_cmpxchg(&ent->mkeys, to_reserve, NULL, XA_ZERO_ENTRY,
> + GFP_KERNEL);
> +
> + if (xa_is_err(old)) {
> + err = xa_err(old);
> + goto err;
> + }
> +
> + /*
> + * __xa_cmpxchg() might drop the lock, thus ent->reserved can
> + * change.
> + */
> + if (to_reserve != ent->reserved) {
> + if (to_reserve > ent->reserved)
> + __xa_erase(&ent->mkeys, to_reserve);
> + continue;
> + }
> +
> + /*
> + * If old != NULL to_reserve cannot be equal to ent->reserved.
> + */
> + WARN_ON(old);
> +
> + ent->reserved++;
> + break;
> + }
> + xa_unlock_irq(&ent->mkeys);
> + return 0;
> +
> +err:
> + xa_unlock_irq(&ent->mkeys);
> + return err;
> +}
So, I looked at this for a good long time and I think we can replace
it with this version:
static int push_mkey(struct mlx5_cache_ent *ent, bool limit_pendings,
void *to_store)
{
XA_STATE(xas, &ent->mkeys, 0);
void *curr;
xa_lock_irq(&ent->mkeys);
if (limit_pendings &&
(ent->reserved - ent->stored) > MAX_PENDING_REG_MR) {
xa_unlock_irq(&ent->mkeys);
return -EAGAIN;
}
while (1) {
/*
* This is cmpxchg (NULL, XA_ZERO_ENTRY) however this version
* doesn't transparently unlock. Instead we set the xas index to
* the current value of reserved every iteration.
*/
xas_set(&xas, ent->reserved);
curr = xas_load(&xas);
if (!curr) {
if (to_store && ent->stored == ent->reserved)
xas_store(&xas, to_store);
else
xas_store(&xas, XA_ZERO_ENTRY);
if (xas_valid(&xas)) {
ent->reserved++;
if (to_store) {
if (ent->stored != ent->reserved)
__xa_store(&ent->mkeys,
ent->stored,
to_store,
GFP_KERNEL);
ent->stored++;
}
}
}
xa_unlock_irq(&ent->mkeys);
/*
* Notice xas_nomem() must always be called as it cleans
* up any cached allocation.
*/
if (!xas_nomem(&xas, GFP_KERNEL))
break;
xa_lock_irq(&ent->mkeys);
}
if (xas_error(&xas))
return xas_error(&xas);
if (WARN_ON(curr))
return -EINVAL;
return 0;
}
Which can do either reserve or a store and is a little more direct as
to how it works
Which allows this:
> if (mr->mmkey.cache_ent) {
> xa_lock_irq(&mr->mmkey.cache_ent->mkeys);
> mr->mmkey.cache_ent->in_use--;
> xa_unlock_irq(&mr->mmkey.cache_ent->mkeys);
>
> if (mlx5r_umr_revoke_mr(mr) ||
> push_reserve_mkey(mr->mmkey.cache_ent, false))
>
To just call
push_mkey((mr->mmkey.cache_ent, false, mr->mmkey.key)
And with some locking shuffling avoid a lot of lock/unlocking/xarray
cycles on the common path of just appending to an xarray with no
reservation.
But I didn't notice anything wrong with this series, it does look good.
Thanks,
Jason
next prev parent reply other threads:[~2022-06-08 11:01 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-07 11:40 [PATCH rdma-next 0/5] MR cache cleanup Leon Romanovsky
2022-06-07 11:40 ` [PATCH rdma-next 1/5] RDMA/mlx5: Replace ent->lock with xa_lock Leon Romanovsky
2022-06-07 11:40 ` [PATCH rdma-next 2/5] RDMA/mlx5: Replace cache list with Xarray Leon Romanovsky
2022-06-08 11:01 ` Jason Gunthorpe [this message]
[not found] ` <cb340692-422a-8485-cbf2-766b3e327d0e@nvidia.com>
2022-06-08 15:08 ` Jason Gunthorpe
2022-06-07 11:40 ` [PATCH rdma-next 3/5] RDMA/mlx5: Store the number of in_use cache mkeys instead of total_mrs Leon Romanovsky
2022-06-07 11:40 ` [PATCH rdma-next 4/5] RDMA/mlx5: Store in the cache mkeys instead of mrs Leon Romanovsky
2022-06-07 11:40 ` [PATCH mlx5-next 5/5] RDMA/mlx5: Rename the mkey cache variables and functions Leon Romanovsky
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=20220608110144.GA796320@nvidia.com \
--to=jgg@nvidia.com \
--cc=aharonl@nvidia.com \
--cc=leon@kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=saeedm@nvidia.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.