From: "Roger Pau Monné" <roger.pau@citrix.com>
To: Stewart Hildebrand <stewart.hildebrand@amd.com>
Cc: xen-devel@lists.xenproject.org,
Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>,
Jan Beulich <jbeulich@suse.com>,
Andrew Cooper <andrew.cooper3@citrix.com>, Wei Liu <wl@xen.org>,
George Dunlap <george.dunlap@citrix.com>,
Julien Grall <julien@xen.org>,
Stefano Stabellini <sstabellini@kernel.org>,
Jun Nakajima <jun.nakajima@intel.com>,
Kevin Tian <kevin.tian@intel.com>, Paul Durrant <paul@xen.org>,
Volodymyr Babchuk <volodymyr_babchuk@epam.com>
Subject: Re: [PATCH v12.2 01/15] vpci: use per-domain PCI lock to protect vpci structure
Date: Fri, 19 Jan 2024 14:42:31 +0100 [thread overview]
Message-ID: <Zap8R5Q0wTPQ3lOP@macbook> (raw)
In-Reply-To: <20240115194309.45683-1-stewart.hildebrand@amd.com>
On Mon, Jan 15, 2024 at 02:43:08PM -0500, Stewart Hildebrand wrote:
> From: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
>
> Use the per-domain PCI read/write lock to protect the presence of the
> pci device vpci field. This lock can be used (and in a few cases is used
> right away) so that vpci removal can be performed while holding the lock
> in write mode. Previously such removal could race with vpci_read for
> example.
>
> When taking both d->pci_lock and pdev->vpci->lock, they should be
> taken in this exact order: d->pci_lock then pdev->vpci->lock to avoid
> possible deadlock situations.
>
> 1. Per-domain's pci_lock is used to protect pdev->vpci structure
> from being removed.
>
> 2. Writing the command register and ROM BAR register may trigger
> modify_bars to run, which in turn may access multiple pdevs while
> checking for the existing BAR's overlap. The overlapping check, if
> done under the read lock, requires vpci->lock to be acquired on both
> devices being compared, which may produce a deadlock. It is not
> possible to upgrade read lock to write lock in such a case. So, in
> order to prevent the deadlock, use d->pci_lock in write mode instead.
>
> All other code, which doesn't lead to pdev->vpci destruction and does
> not access multiple pdevs at the same time, can still use a
> combination of the read lock and pdev->vpci->lock.
>
> 3. Drop const qualifier where the new rwlock is used and this is
> appropriate.
>
> 4. Do not call process_pending_softirqs with any locks held. For that
> unlock prior the call and re-acquire the locks after. After
> re-acquiring the lock there is no need to check if pdev->vpci exists:
> - in apply_map because of the context it is called (no race condition
> possible)
> - for MSI/MSI-X debug code because it is called at the end of
> pdev->vpci access and no further access to pdev->vpci is made
>
> 5. Use d->pci_lock around for_each_pdev and pci_get_pdev_by_domain
> while accessing pdevs in vpci code.
>
> Suggested-by: Roger Pau Monné <roger.pau@citrix.com>
> Suggested-by: Jan Beulich <jbeulich@suse.com>
> Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
> Signed-off-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
> Signed-off-by: Stewart Hildebrand <stewart.hildebrand@amd.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Thanks, Roger.
next prev parent reply other threads:[~2024-01-19 13:42 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-09 21:51 [PATCH v12 00/15] PCI devices passthrough on Arm, part 3 Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 01/15] vpci: use per-domain PCI lock to protect vpci structure Stewart Hildebrand
2024-01-12 13:48 ` Roger Pau Monné
2024-01-12 17:54 ` Stewart Hildebrand
2024-01-12 18:14 ` [PATCH v12.1 " Stewart Hildebrand
2024-01-15 8:58 ` Jan Beulich
2024-01-15 15:42 ` Stewart Hildebrand
2024-01-15 8:53 ` [PATCH v12 " Roger Pau Monné
2024-01-15 15:08 ` Stewart Hildebrand
2024-01-15 19:43 ` [PATCH v12.2 " Stewart Hildebrand
2024-01-19 13:42 ` Roger Pau Monné [this message]
2024-01-23 14:26 ` Jan Beulich
2024-01-23 15:23 ` Roger Pau Monné
2024-01-24 8:56 ` Jan Beulich
2024-01-24 9:39 ` Roger Pau Monné
2024-01-23 14:29 ` Jan Beulich
2024-01-24 5:07 ` Stewart Hildebrand
2024-01-24 8:21 ` Roger Pau Monné
2024-01-24 20:21 ` Stewart Hildebrand
2024-01-24 8:50 ` Jan Beulich
2024-01-23 14:32 ` Jan Beulich
2024-01-23 15:07 ` Roger Pau Monné
2024-01-24 5:00 ` Stewart Hildebrand
2024-01-30 14:59 ` Stewart Hildebrand
2024-01-24 8:48 ` Jan Beulich
2024-01-24 9:24 ` Roger Pau Monné
2024-01-24 11:34 ` Jan Beulich
2024-01-24 17:51 ` Roger Pau Monné
2024-01-25 7:43 ` Jan Beulich
2024-01-25 9:05 ` Roger Pau Monné
2024-01-25 11:23 ` Jan Beulich
2024-01-25 12:33 ` Roger Pau Monné
2024-01-30 15:04 ` Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 02/15] vpci: restrict unhandled read/write operations for guests Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 03/15] vpci: add hooks for PCI device assign/de-assign Stewart Hildebrand
2024-01-23 14:36 ` Jan Beulich
2024-01-30 19:22 ` Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 04/15] vpci/header: rework exit path in init_header() Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 05/15] vpci/header: implement guest BAR register handlers Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 06/15] rangeset: add RANGESETF_no_print flag Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 07/15] rangeset: add rangeset_purge() function Stewart Hildebrand
2024-01-10 10:00 ` Jan Beulich
2024-01-09 21:51 ` [PATCH v12 08/15] vpci/header: handle p2m range sets per BAR Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 09/15] vpci/header: program p2m with guest BAR view Stewart Hildebrand
2024-01-12 15:06 ` Roger Pau Monné
2024-01-12 20:31 ` Stewart Hildebrand
2024-01-12 20:49 ` [PATCH v12.1 " Stewart Hildebrand
2024-01-15 9:07 ` [PATCH v12 " Jan Beulich
2024-01-15 19:03 ` Stewart Hildebrand
2024-01-15 19:44 ` [PATCH v12.2 " Stewart Hildebrand
2024-01-17 3:01 ` Stewart Hildebrand
2024-01-19 13:43 ` Roger Pau Monné
2024-01-19 14:28 ` [PATCH v12.3 " Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 10/15] vpci/header: emulate PCI_COMMAND register for guests Stewart Hildebrand
2024-01-25 15:43 ` Jan Beulich
2024-02-01 4:50 ` Stewart Hildebrand
2024-02-01 8:14 ` Jan Beulich
2024-01-09 21:51 ` [PATCH v12 11/15] vpci: add initial support for virtual PCI bus topology Stewart Hildebrand
2024-01-12 11:46 ` George Dunlap
2024-01-12 13:50 ` Stewart Hildebrand
2024-01-15 11:48 ` George Dunlap
2024-01-25 16:00 ` Jan Beulich
2024-02-02 3:30 ` Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 12/15] xen/arm: translate virtual PCI bus topology for guests Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 13/15] xen/arm: account IO handlers for emulated PCI MSI-X Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 14/15] xen/arm: vpci: permit access to guest vpci space Stewart Hildebrand
2024-01-17 3:03 ` Stewart Hildebrand
2024-01-09 21:51 ` [PATCH v12 15/15] arm/vpci: honor access size when returning an error Stewart Hildebrand
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=Zap8R5Q0wTPQ3lOP@macbook \
--to=roger.pau@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=george.dunlap@citrix.com \
--cc=jbeulich@suse.com \
--cc=julien@xen.org \
--cc=jun.nakajima@intel.com \
--cc=kevin.tian@intel.com \
--cc=oleksandr_andrushchenko@epam.com \
--cc=paul@xen.org \
--cc=sstabellini@kernel.org \
--cc=stewart.hildebrand@amd.com \
--cc=volodymyr_babchuk@epam.com \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.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.