From: "Roger Pau Monné" <roger.pau@citrix.com>
To: Oleksandr Andrushchenko <Oleksandr_Andrushchenko@epam.com>
Cc: "jbeulich@suse.com" <jbeulich@suse.com>,
"xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>,
"julien@xen.org" <julien@xen.org>,
"sstabellini@kernel.org" <sstabellini@kernel.org>,
Oleksandr Tyshchenko <Oleksandr_Tyshchenko@epam.com>,
Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>,
Artem Mygaiev <Artem_Mygaiev@epam.com>,
Bertrand Marquis <bertrand.marquis@arm.com>,
Rahul Singh <rahul.singh@arm.com>
Subject: Re: [PATCH v3 10/11] vpci: Add initial support for virtual PCI bus topology
Date: Wed, 3 Nov 2021 09:52:35 +0100 [thread overview]
Message-ID: <YYJN028YTy92TLca@Air-de-Roger> (raw)
In-Reply-To: <52b1533d-4aeb-29be-2611-9b50adea3f73@epam.com>
On Wed, Nov 03, 2021 at 06:34:16AM +0000, Oleksandr Andrushchenko wrote:
> Hi, Roger
>
> On 26.10.21 14:33, Roger Pau Monné wrote:
> > On Thu, Sep 30, 2021 at 10:52:22AM +0300, Oleksandr Andrushchenko wrote:
> >> diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h
> >> index 43b8a0817076..33033a3a8f8d 100644
> >> --- a/xen/include/xen/pci.h
> >> +++ b/xen/include/xen/pci.h
> >> @@ -137,6 +137,24 @@ struct pci_dev {
> >> struct vpci *vpci;
> >> };
> >>
> >> +#ifdef CONFIG_HAS_VPCI_GUEST_SUPPORT
> >> +struct vpci_dev {
> >> + struct list_head list;
> >> + /* Physical PCI device this virtual device is connected to. */
> >> + const struct pci_dev *pdev;
> >> + /* Virtual SBDF of the device. */
> >> + union {
> >> + struct {
> >> + uint8_t devfn;
> >> + uint8_t bus;
> >> + uint16_t seg;
> >> + };
> >> + pci_sbdf_t sbdf;
> >> + };
> >> + struct domain *domain;
> >> +};
> >> +#endif
> > I wonder whether this is strictly needed. Won't it be enough to store
> > the virtual (ie: guest) sbdf inside the existing vpci struct?
> >
> > It would avoid the overhead of the translation you do from pdev ->
> > vdev, and there doesn't seem to be anything relevant stored in
> > vpci_dev apart from the virtual sbdf.
> TL;DR It seems it might be needed from performance POV. If not implemented
> for every MMIO trap we use a global PCI lock, e.g. pcidevs_{lock|unlock}.
> Note: pcidevs' lock is a recursive lock
>
> There are 2 sources of access to virtual devices:
> 1. During initialization when we add, assign or de-assign a PCI device
> 2. At run-time when we trap configuration space access and need to
> translate virtual SBDF into physical SBDF
> 3. At least de-assign can run concurrently with MMIO handlers
>
> Now let's see which locks are in use while doing that.
>
> 1. No struct vpci_dev is used.
> 1.1. We remove the structure and just add pdev->vpci->guest_sbdf as you suggest
> 1.2. To protect virtual devices we use pcidevs_{lock|unlock}
> 1.3. Locking happens on system level
>
> 2. struct vpci_dev is used
> 2.1. We have a per-domain lock vdev_lock
> 2.2. Locking happens on per domain level
>
> To compare the two:
>
> 1. Without vpci_dev
> pros: much simpler code
> pros/cons: global lock is used during MMIO handling, but it is a recursive lock
>
> 2. With vpc_dev
> pros: per-domain locking
> cons: more code
>
> I have implemented the two methods and we need to decide
> which route we go.
We could always see about converting the pcidevs lock into a rw one if
it turns out there's too much contention. PCI config space accesses
shouldn't be that common or performance critical, so having some
contention might not be noticeable.
TBH I would start with the simpler solution (add guest_sbdf and use
pci lock) and move to something more complex once issues are
identified.
Regards, Roger.
next prev parent reply other threads:[~2021-11-03 8:53 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-30 7:52 [PATCH v3 00/11] PCI devices passthrough on Arm, part 3 Oleksandr Andrushchenko
2021-09-30 7:52 ` [PATCH v3 01/11] vpci: Make vpci registers removal a dedicated function Oleksandr Andrushchenko
2021-10-13 11:11 ` Roger Pau Monné
2021-10-27 9:12 ` Oleksandr Andrushchenko
2021-10-27 9:24 ` Roger Pau Monné
2021-10-27 9:41 ` Oleksandr Andrushchenko
2021-09-30 7:52 ` [PATCH v3 02/11] vpci: Add hooks for PCI device assign/de-assign Oleksandr Andrushchenko
2021-09-30 8:21 ` Jan Beulich
2021-09-30 8:45 ` Oleksandr Andrushchenko
2021-09-30 9:06 ` Jan Beulich
2021-09-30 9:21 ` Oleksandr Andrushchenko
2021-09-30 10:14 ` Jan Beulich
2021-09-30 10:30 ` Oleksandr Andrushchenko
2021-10-13 11:29 ` Roger Pau Monné
2021-10-13 12:47 ` Jan Beulich
2021-10-27 9:53 ` Oleksandr Andrushchenko
2021-09-30 7:52 ` [PATCH v3 03/11] vpci/header: Move register assignments from init_bars Oleksandr Andrushchenko
2021-10-13 13:51 ` Roger Pau Monné
2021-10-15 6:04 ` Jan Beulich
2021-10-25 14:28 ` Roger Pau Monné
2021-10-27 10:17 ` Oleksandr Andrushchenko
2021-10-27 11:59 ` Oleksandr Andrushchenko
2021-10-27 13:23 ` Roger Pau Monné
2021-10-27 14:06 ` Oleksandr Andrushchenko
2021-10-27 15:34 ` Roger Pau Monné
2021-09-30 7:52 ` [PATCH v3 04/11] vpci/header: Add and remove register handlers dynamically Oleksandr Andrushchenko
2021-10-01 13:26 ` Jan Beulich
2021-10-04 5:58 ` Oleksandr Andrushchenko
2021-10-07 7:22 ` Jan Beulich
2021-10-13 15:38 ` Roger Pau Monné
2021-10-15 6:09 ` Jan Beulich
2021-10-25 15:48 ` Roger Pau Monné
2021-11-01 9:18 ` Oleksandr Andrushchenko
2021-11-02 10:03 ` Roger Pau Monné
2021-11-02 10:29 ` Oleksandr Andrushchenko
2021-09-30 7:52 ` [PATCH v3 05/11] vpci/header: Implement guest BAR register handlers Oleksandr Andrushchenko
2021-10-01 13:31 ` Jan Beulich
2021-10-26 7:50 ` Roger Pau Monné
2021-10-26 8:09 ` Oleksandr Andrushchenko
2021-09-30 7:52 ` [PATCH v3 06/11] vpci/header: Handle p2m range sets per BAR Oleksandr Andrushchenko
2021-10-25 11:51 ` Oleksandr Andrushchenko
2021-10-26 9:40 ` Roger Pau Monné
2021-11-02 11:13 ` Jan Beulich
2021-10-26 9:08 ` Roger Pau Monné
2021-11-02 10:34 ` Oleksandr Andrushchenko
2021-09-30 7:52 ` [PATCH v3 07/11] vpci/header: program p2m with guest BAR view Oleksandr Andrushchenko
2021-10-01 13:38 ` Jan Beulich
2021-10-04 6:26 ` Oleksandr Andrushchenko
2021-10-26 10:35 ` Roger Pau Monné
2021-11-02 10:43 ` Oleksandr Andrushchenko
2021-09-30 7:52 ` [PATCH v3 08/11] vpci/header: Emulate PCI_COMMAND register for guests Oleksandr Andrushchenko
2021-10-26 10:52 ` Roger Pau Monné
2021-11-02 10:48 ` Oleksandr Andrushchenko
2021-11-02 11:19 ` Jan Beulich
2021-11-02 11:50 ` Roger Pau Monné
2021-11-02 13:54 ` Jan Beulich
2021-11-02 14:10 ` Oleksandr Andrushchenko
2021-11-03 8:53 ` Oleksandr Andrushchenko
2021-11-03 9:11 ` Jan Beulich
2021-11-03 9:18 ` Oleksandr Andrushchenko
2021-11-03 9:24 ` Jan Beulich
2021-11-03 9:30 ` Oleksandr Andrushchenko
2021-11-03 9:49 ` Jan Beulich
2021-11-03 10:24 ` Oleksandr Andrushchenko
2021-11-03 10:34 ` Jan Beulich
2021-11-03 10:36 ` Oleksandr Andrushchenko
2021-11-03 11:01 ` Roger Pau Monné
2021-11-03 11:02 ` Oleksandr Andrushchenko
2021-11-03 11:26 ` Roger Pau Monné
2021-11-03 11:34 ` Oleksandr Andrushchenko
2021-11-03 9:39 ` Roger Pau Monné
2021-11-03 9:50 ` Oleksandr Andrushchenko
2021-11-02 14:17 ` Julien Grall
2021-09-30 7:52 ` [PATCH v3 09/11] vpci/header: Reset the command register when adding devices Oleksandr Andrushchenko
2021-10-26 11:00 ` Roger Pau Monné
2021-11-02 11:11 ` Oleksandr Andrushchenko
2021-09-30 7:52 ` [PATCH v3 10/11] vpci: Add initial support for virtual PCI bus topology Oleksandr Andrushchenko
2021-09-30 8:51 ` Jan Beulich
2021-09-30 9:34 ` Oleksandr Andrushchenko
2021-09-30 10:23 ` Jan Beulich
2021-09-30 10:26 ` Oleksandr Andrushchenko
2021-10-26 11:33 ` Roger Pau Monné
2021-11-03 6:34 ` Oleksandr Andrushchenko
2021-11-03 8:41 ` Jan Beulich
2021-11-03 8:57 ` Oleksandr Andrushchenko
2021-11-03 8:52 ` Roger Pau Monné [this message]
2021-11-03 8:59 ` Oleksandr Andrushchenko
2021-09-30 7:52 ` [PATCH v3 11/11] xen/arm: Translate virtual PCI bus topology for guests Oleksandr Andrushchenko
2021-09-30 8:53 ` Jan Beulich
2021-09-30 9:35 ` Oleksandr Andrushchenko
2021-09-30 10:25 ` Jan Beulich
2021-09-30 16:57 ` Oleksandr Andrushchenko
2021-10-01 7:42 ` Jan Beulich
2021-10-01 7:57 ` Oleksandr Andrushchenko
2021-10-01 8:12 ` Jan Beulich
2021-10-18 18:32 ` Julien Grall
2021-10-26 13:30 ` Roger Pau Monné
2021-10-26 13:57 ` Oleksandr Andrushchenko
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=YYJN028YTy92TLca@Air-de-Roger \
--to=roger.pau@citrix.com \
--cc=Artem_Mygaiev@epam.com \
--cc=Oleksandr_Andrushchenko@epam.com \
--cc=Oleksandr_Tyshchenko@epam.com \
--cc=Volodymyr_Babchuk@epam.com \
--cc=bertrand.marquis@arm.com \
--cc=jbeulich@suse.com \
--cc=julien@xen.org \
--cc=rahul.singh@arm.com \
--cc=sstabellini@kernel.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.