From: Thomas Gleixner <tglx@linutronix.de>
To: David Laight <David.Laight@ACULAB.COM>,
Jason Gunthorpe <jgg@nvidia.com>,
Bjorn Helgaas <bhelgaas@google.com>,
Christoph Hellwig <hch@infradead.org>,
"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>
Subject: Re: PCIe cycle sequence when updating the msi-x table
Date: Fri, 07 Apr 2023 21:55:41 +0200 [thread overview]
Message-ID: <87edovtqki.ffs@tglx> (raw)
In-Reply-To: <b2d1bb86ea4642d2aa01ebd9d3d7a77e@AcuMS.aculab.com>
On Fri, Apr 07 2023 at 16:17, David Laight wrote:
> The function that updates the MSI-X table currently reads:
>
> Now I'm not 100% sure about the cycle ordering rules.
> I've not got the spec here, and I recall it isn't that easy to
> understand.
> I can't remember whether reads are allowed to overtake writes
> (to different addresses).
> I do remember that reading back the same address was needed to
> flush the cpu store buffer on some space cpus.
> So it might be that the final readl() won't actually flush
> the write to the mask register.
> (The same readback of 'the wrong' address also happens elsewhere.)
It's guaranteed that all writes to a device have reached the device
before a read from the same device which comes after the writes is
issued. The write and read addresses do not matter.
> But there is a bigger problem.
> As the comment says writing the address/data while an entry is
> unmasked must be avoided (because a mixture of the old and new
> values could easily by used for the PCIe write cycle).
>
> But it is also quite likely that that hardware checks the masked
> bit before/after reading the address+data.
>
> So masking the interrupt immediately before the update and/or
> unmasking immediately after could also cause issues.
No it does not, because the writes are strictly ordered.
So the devices gets:
1) write to control register with MASKBIT set
2) write to LOWER_ADDRESS
3) write to UPPER_ADDRESS
4) write to ENTRY_DATA
5) write to control register with MASKBIT cleared
#1 disables the vector and the device is not allowed to use the msg data
from the table entry until the mask bit is cleared again.
If the device gets that wrong then that's a bug in the device and not a
kernel problem.
Thanks,
tglx
next prev parent reply other threads:[~2023-04-07 19:56 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-07 16:17 PCIe cycle sequence when updating the msi-x table David Laight
2023-04-07 19:55 ` Thomas Gleixner [this message]
2023-04-07 22:06 ` David Laight
2023-04-10 6:50 ` Thomas Gleixner
2023-04-10 12:16 ` David Laight
2023-04-10 17:25 ` Thomas Gleixner
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=87edovtqki.ffs@tglx \
--to=tglx@linutronix.de \
--cc=David.Laight@ACULAB.COM \
--cc=bhelgaas@google.com \
--cc=hch@infradead.org \
--cc=jgg@nvidia.com \
--cc=linux-pci@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox