From: Heiko Carstens <hca@linux.ibm.com>
To: Matthew Rosato <mjrosato@linux.ibm.com>
Cc: iommu@lists.linux.dev, linux-s390@vger.kernel.org,
schnelle@linux.ibm.com, pmorel@linux.ibm.com,
borntraeger@linux.ibm.com, gor@linux.ibm.com,
gerald.schaefer@linux.ibm.com, agordeev@linux.ibm.com,
svens@linux.ibm.com, joro@8bytes.org, will@kernel.org,
robin.murphy@arm.com, jgg@nvidia.com,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] iommu/s390: Fix race with release_device ops
Date: Mon, 29 Aug 2022 13:03:25 +0200 [thread overview]
Message-ID: <Ywyc/WxFg3zawXL5@osiris> (raw)
In-Reply-To: <20220826194721.250123-1-mjrosato@linux.ibm.com>
On Fri, Aug 26, 2022 at 03:47:21PM -0400, Matthew Rosato wrote:
> With commit fa7e9ecc5e1c ("iommu/s390: Tolerate repeat attach_dev
> calls") s390-iommu is supposed to handle dynamic switching between IOMMU
> domains and the DMA API handling. However, this commit does not
> sufficiently handle the case where the device is released via a call
> to the release_device op as it may occur at the same time as an opposing
> attach_dev or detach_dev since the group mutex is not held over
> release_device. This was observed if the device is deconfigured during a
> small window during vfio-pci initialization and can result in WARNs and
> potential kernel panics.
>
> Handle this by tracking when the device is probed/released via
> dev_iommu_priv_set/get(). Ensure that once the device is released only
> release_device handles the re-init of the device DMA.
>
> Fixes: fa7e9ecc5e1c ("iommu/s390: Tolerate repeat attach_dev calls")
> Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
...
> + /* First check compatibility */
> + spin_lock_irqsave(&s390_domain->list_lock, flags);
> + /* First device defines the DMA range limits */
> + if (list_empty(&s390_domain->devices)) {
> + domain->geometry.aperture_start = zdev->start_dma;
> + domain->geometry.aperture_end = zdev->end_dma;
> + domain->geometry.force_aperture = true;
> + /* Allow only devices with identical DMA range limits */
> + } else if (domain->geometry.aperture_start != zdev->start_dma ||
> + domain->geometry.aperture_end != zdev->end_dma) {
> + rc = -EINVAL;
> + }
> + spin_unlock_irqrestore(&s390_domain->list_lock, flags);
...
> spin_lock_irqsave(&s390_domain->list_lock, flags);
> - /* First device defines the DMA range limits */
> - if (list_empty(&s390_domain->devices)) {
> - domain->geometry.aperture_start = zdev->start_dma;
> - domain->geometry.aperture_end = zdev->end_dma;
> - domain->geometry.force_aperture = true;
> - /* Allow only devices with identical DMA range limits */
> - } else if (domain->geometry.aperture_start != zdev->start_dma ||
> - domain->geometry.aperture_end != zdev->end_dma) {
> - rc = -EINVAL;
> - spin_unlock_irqrestore(&s390_domain->list_lock, flags);
> - goto out_restore;
> - }
> domain_device->zdev = zdev;
> - zdev->s390_domain = s390_domain;
> list_add(&domain_device->list, &s390_domain->devices);
> spin_unlock_irqrestore(&s390_domain->list_lock, flags);
Stupid question: but how is this not racy when the spinlock is
released between doing something that depends on an empty list and
actually adding to the list later, after the lock had been released?
> + mutex_lock(&zdev->dma_domain_lock);
> + dev_iommu_priv_set(dev, NULL);
> + mutex_unlock(&zdev->dma_domain_lock);
> + /* Make sure this device is removed from the domain list */
> domain = iommu_get_domain_for_dev(dev);
> if (domain)
> s390_iommu_detach_device(domain, dev);
> + /* Now ensure DMA is initialized from here */
> + mutex_lock(&zdev->dma_domain_lock);
> + if (zdev->s390_domain) {
> + zdev->s390_domain = NULL;
> + zpci_unregister_ioat(zdev, 0);
> + zpci_dma_init_device(zdev);
> + }
> + mutex_unlock(&zdev->dma_domain_lock);
Looking at the patch and this code it is also anything but obvious
which _data_ is actually protected by the mutex. Anyway.. just some
stupid comments while briefly looking at the patch :)
next prev parent reply other threads:[~2022-08-29 12:09 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-26 19:47 [PATCH v2] iommu/s390: Fix race with release_device ops Matthew Rosato
2022-08-29 9:24 ` Niklas Schnelle
2022-08-29 11:03 ` Heiko Carstens [this message]
2022-08-29 13:38 ` Matthew Rosato
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=Ywyc/WxFg3zawXL5@osiris \
--to=hca@linux.ibm.com \
--cc=agordeev@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=gerald.schaefer@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=joro@8bytes.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=mjrosato@linux.ibm.com \
--cc=pmorel@linux.ibm.com \
--cc=robin.murphy@arm.com \
--cc=schnelle@linux.ibm.com \
--cc=svens@linux.ibm.com \
--cc=will@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