All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Gunthorpe <jgg@nvidia.com>
To: Matthew Wilcox <willy@infradead.org>, linux-fsdevel@vger.kernel.org
Cc: Nicolin Chen <nicolinc@nvidia.com>
Subject: xa_cmpxchg and XA_ZERO_ENTRY?
Date: Wed, 30 Oct 2024 10:15:13 -0300	[thread overview]
Message-ID: <20241030131513.GF6956@nvidia.com> (raw)

Hi Matthew,

Nicolin pointed this out and I was wondering what is the right thing.

For instance this:

	xa_init(&xa);
	ret = xa_reserve(&xa, 1, GFP_KERNEL);
	printk("xa_reserve() = %d\n", ret);
	old = xa_cmpxchg(&xa, 1, NULL, &xa, GFP_KERNEL);
	printk("xa_cmpxchg(NULL) = %llx\n", (u64)old);
	old = xa_load(&xa, 1);
	printk("xa_load() = %llx\n", (u64)old);

Prints out:

xa_reserve() = 0
xa_cmpxchg(NULL) = 0
xa_load() = 0

Meaning the cmpxchg failed because NULL is not stored in the entry due
to the xa_reserve(). So far so good.. So lets correct the code to:

	old = xa_cmpxchg(&xa, 1, XA_ZERO_ENTRY, &xa, GFP_KERNEL);

Then:

xa_reserve() = 0
xa_cmpxchg(XA_ZERO_ENTRY) = 0
xa_load() = ffffa969400d3e68

Ok now it succeed but returned NULL.. (noting NULL != old)

However, if we make an error and omit the xa_reserve step():

xa_cmpxchg(XA_ZERO_ENTRY) = 0
xa_load() = 0

Now it failed and still returned NULL..

So, you can't detect a failure from cmpxchg if old is NULL/ZERO? This
doesn't seem right.

At least I've already fallen in this trap:

static int ucma_destroy_private_ctx(struct ucma_context *ctx)
{
        WARN_ON(xa_cmpxchg(&ctx_table, ctx->id, XA_ZERO_ENTRY, NULL,
                           GFP_KERNEL) != NULL);

Which actually doesn't detect cmpxchg failure..

So what is the right thing here?

The general purpose of code like the above is to just validate that
the xa has not been corrupted, that the index we are storing to has
been reserved. Maybe we can't sleep or something.

Thanks,
Jason

             reply	other threads:[~2024-10-30 13:15 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-30 13:15 Jason Gunthorpe [this message]
2024-10-30 16:51 ` xa_cmpxchg and XA_ZERO_ENTRY? Matthew Wilcox
2024-10-30 17:21   ` Jason Gunthorpe

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=20241030131513.GF6956@nvidia.com \
    --to=jgg@nvidia.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=nicolinc@nvidia.com \
    --cc=willy@infradead.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.