From: Jason Gunthorpe <jgg@nvidia.com>
To: Bob Pearson <rpearsonhpe@gmail.com>
Cc: zyjzyj2000@gmail.com, linux-rdma@vger.kernel.org
Subject: Re: [PATCH for-next] RDMA/rxe: Convert spinlock to memory barrier
Date: Fri, 28 Oct 2022 14:28:54 -0300 [thread overview]
Message-ID: <Y1wRVlJS76Onp2vm@nvidia.com> (raw)
In-Reply-To: <20221006163859.84266-1-rpearsonhpe@gmail.com>
On Thu, Oct 06, 2022 at 11:39:00AM -0500, Bob Pearson wrote:
> Currently the rxe driver takes a spinlock to safely pass a
> control variable from a verbs API to a tasklet. A release/acquire
> memory barrier pair can accomplish the same thing with less effort.
The only reason it seems like this is because it is already completely
wrong. Everyone time I see one of these 'is dying' things it is just a
racy mess.
The code that sets it to true is rushing toward freeing the memory.
Meaning if you observe it to be true, you are almost certainly about
to UAF it.
You can see how silly it is because the tasklet itself, while sitting
on the scheduling queue, is holding a reference to the struct rxe_cq -
so is_dying is totally pointless.
The proper way to use something like 'is_dying' is part of the tasklet
shutdown sequence.
First you prevent new calls to tasklet_schedule(), then you flush and
kill the tasklet. is_dying is an appropriate way to prevent new calls,
when wrapped around tasklet_schedule() under a lock.
Please send a patch properly managing to clean up the tasklets for the
cq, not this.
Jason
>
> Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
> ---
> drivers/infiniband/sw/rxe/rxe_cq.c | 15 ++++-----------
> 1 file changed, 4 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/infiniband/sw/rxe/rxe_cq.c b/drivers/infiniband/sw/rxe/rxe_cq.c
> index b1a0ab3cd4bd..76534bc66cb6 100644
> --- a/drivers/infiniband/sw/rxe/rxe_cq.c
> +++ b/drivers/infiniband/sw/rxe/rxe_cq.c
> @@ -42,14 +42,10 @@ int rxe_cq_chk_attr(struct rxe_dev *rxe, struct rxe_cq *cq,
> static void rxe_send_complete(struct tasklet_struct *t)
> {
> struct rxe_cq *cq = from_tasklet(cq, t, comp_task);
> - unsigned long flags;
>
> - spin_lock_irqsave(&cq->cq_lock, flags);
> - if (cq->is_dying) {
> - spin_unlock_irqrestore(&cq->cq_lock, flags);
> + /* pairs with rxe_cq_disable */
> + if (smp_load_acquire(&cq->is_dying))
> return;
> - }
> - spin_unlock_irqrestore(&cq->cq_lock, flags);
>
> cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context);
> }
> @@ -143,11 +139,8 @@ int rxe_cq_post(struct rxe_cq *cq, struct rxe_cqe *cqe, int solicited)
>
> void rxe_cq_disable(struct rxe_cq *cq)
> {
> - unsigned long flags;
> -
> - spin_lock_irqsave(&cq->cq_lock, flags);
> - cq->is_dying = true;
> - spin_unlock_irqrestore(&cq->cq_lock, flags);
> + /* pairs with rxe_send_complete */
> + smp_store_release(&cq->is_dying, true);
> }
>
> void rxe_cq_cleanup(struct rxe_pool_elem *elem)
>
> base-commit: cbdae01d8b517b81ed271981395fee8ebd08ba7d
prev parent reply other threads:[~2022-10-28 17:29 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-06 16:39 [PATCH for-next] RDMA/rxe: Convert spinlock to memory barrier Bob Pearson
2022-10-28 17:28 ` Jason Gunthorpe [this message]
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=Y1wRVlJS76Onp2vm@nvidia.com \
--to=jgg@nvidia.com \
--cc=linux-rdma@vger.kernel.org \
--cc=rpearsonhpe@gmail.com \
--cc=zyjzyj2000@gmail.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