[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 07/11] vpci/header: program p2m with guest BAR view
- To: Oleksandr Andrushchenko <andr2000@xxxxxxxxx>
- From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
- Date: Tue, 26 Oct 2021 12:35:54 +0200
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
- Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=0Vmesls1fMP5JrkhPFpoWML/guw/Cs719OE1dAa1P7g=; b=lbO6TuRPHX6ZubjI9f6MO6kcQQdjefW1X9I+9+4h9VuJg43VQImWtUKGh4d4PXS4vhJR67UeXf8cZipWe/rChdkteJlEodv8kyCc2UWFJ+O3ZH9MstYGkJiurlydCHzCIBMOHjONUxk5DgdXi9RHQQYxmujoxAOwdcnMaJmdDqgtbzpJnXyIQS18mecth9LApqROZYVWt0+IApEq3ewltaX2yzebYRbUpgge6T+0evy1e/jnw/84+QogJu2ddehlmVy7FPt6kQ130dTcGh3oPT539FsdaL8g5PxqRlXBw3/0J41osBY8YYPaJwWX0xwnHwY8T54Q4AvCnIrhnPj1Cw==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ja7DKWaYVs2Y8i9A8VXVqlmNAeJiNxgk20NYwiEy7n/Zxu+qQfw9OQMfZo+VnsvX4O1G0AFqzOm9AJaRetsN5oDcaIdrLzgwnuEmlegmcpAx+VR/XE/xNjiKqbb/gGql/u8FD707P2A0mIxJ9XNKe710VAH24XX9WkFtiz/cx5mx2VabU8dvX1cwzf7TYYj7EcXZQtETOSBahnvA/1kxNZCi+n0zNbmpuN4h0YRH4ZJFBlTztAmJRKSfr7DkXCjpHAHKi8ydztXM5lRJeyBierI/OxYYN6OticWkwxJDvVyb+IYQj+8Q2nxV+9d8t3Z16nYTgYh9bW52Xvg+eQDflw==
- Authentication-results: esa5.hc3370-68.iphmx.com; dkim=pass (signature verified) header.i=@citrix.onmicrosoft.com
- Cc: <xen-devel@xxxxxxxxxxxxxxxxxxxx>, <julien@xxxxxxx>, <sstabellini@xxxxxxxxxx>, <oleksandr_tyshchenko@xxxxxxxx>, <volodymyr_babchuk@xxxxxxxx>, <Artem_Mygaiev@xxxxxxxx>, <jbeulich@xxxxxxxx>, <bertrand.marquis@xxxxxxx>, <rahul.singh@xxxxxxx>, Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx>
- Delivery-date: Tue, 26 Oct 2021 10:36:11 +0000
- Ironport-data: A9a23:rKInWaKCQ45qdlUoFE+R85MlxSXFcZb7ZxGr2PjKsXjdYENS1WMDn 2BMXG7UbvqCZWWkLYtwO4638U5S6pbcmIVnGVBlqX01Q3x08seUXt7xwmUcns+xwm8vaGo9s q3yv/GZdJhcokcxIn5BC5C5xZVG/fjgqoHUVaiUZUideSc+EH140Eo5xbZj6mJVqYPR7z2l6 IuaT/L3YDdJ6xYsWo7Dw/vewP/HlK2aVAIw5jTSV9gS1LPtvyB94KYkDbOwNxPFrrx8RYZWc QphIIaRpQs19z91Yj+sfy2SnkciGtY+NiDW4pZatjTLbrGvaUXe345iXMfwZ3u7hB2KluAv2 osdtaCQVDkVFILwqNwhdhdXRnQW0a1uoNcrIFC6uM2XiUbHb2Ht07NlC0Re0Y8wo7gtRzsUr LpBdW5LPkvra+GemdpXTsF2gcsuNo/zNZ43sXB81zDJS/0hRPgvRo2XuIEChW1g3qiiG978Z cREcjNtYi3fekJqAk9LDKg9vfWn0yyXnzpw9wvO+PtfD3Lo5A573aXpMdHVUseXXsgTlUGdz krv5Xj0ByY/JdOWyDeb2n+0j+qJliT+MKoYGaek7PdsjBuWz3YKFRwNfVKhpL+yjUvWc9VbJ k8P8ywit5878kCxU8L9VB21pn2DlhMEUt8WGOo/gCmXw6rJ50CCB24LThZIctlgv8gzLRQ00 VuOk8LsFCZYurSfQnKA9Z+ZtTq3fyMSKAcqdSICCAcI/dTniIUylQ7UCMZuFravid/4Ei22x CqFxAA3gbkJ15ZTj420+FnGh3SnoZ2hZgwo4gTaWEq14wU/Y5SqD6Sv7VXY9v9GIJyuUkiav HMEls6d68gDFZiI0ieKRY0lB6q17vyINDndh19HHJQ78TmpvXm5cuhtDCpWfRkzdJxeIHmwP RGV6Vg5CIJv0GWCbqZHPZDvW8QW7bXeKf7KasDsUv9Abc0kHOOYxx1GaUmV1mHrtUEjl6AjJ JuWGfqR4WYm5bdPl2XuGb9MuVM/7mVnnzmLHMGkp/iy+ePGPCb9dFsTDLeZggnVBou/qwLJ7 80XCcKOzxhOOAEVSniKqdBNRbzmwH5SOHwXlyC1XrLcSuaFMDt4YxM0/V/GU9c995m5bs+So hmAtrZwkTITf0HvJwSQcWxEY7jyR5t5pn9TFXVyZgvxiyh6MNf/vfZ3m34LkV4Pr7QL8BKJZ 6NdJ5Xo7gpnE2yvF8shgWnV89U5KUXDafOmNCu5ejkvF6OMtCSSkuIIijDHrXFUZgLu7JNWi +T5imvzHMpSLyw/XZ2+QK/+kDuMUY01xbsas73geYIIJi0BMeFCdkTMsxPAC5tcdUmanWDKi V3+7NVxjbClnrLZOeLh3Mish4yoD/F/DgxdGWza5qyxLi7U4iyoxooobQpCVWm1uLrc9Prwa ONL4ev7NfFbzl9Gv5AlS+RgzL4k5suprLhfl1w2EHLOZlWtK7VhPnjZgpUf6vwTnudU6VmsR 0aC2thGIrHVasnrJ0EceVg+ZeOZ2PBKxjSLtaYpIF/37TNc9aacVRkAJAGFjSFQdeMnMI4sz eo7ltQR7giz1kgjPtqc13gG/GWQNH0QFa4gs8hCUoPsjwMqzHBEYIDdVXCqsM3eNY0UPxBzc DGOhafEi7BN/Wb4ciI+RSrXwO5QpZUSoxQWnlUMEEuEx4jejfgt0RwPrTluFlZJzg9K2v5YM 3RwMxEnPr2H+jpliZQRX22oHA0dVhSV9laolgkMnWzdCUKpSnbMPCs2PuPUpBIV9GdVfz56+ rCEyTm6DWa2LZ+phiZiC1R4r/HDTMBq8lyQkc+qKM2JAp0mbGe3maSpf2cJ90PqDM5ZaJcrf gW2EDKcsZHGCBM=
- Ironport-hdrordr: A9a23:0zC8D6Mdg4i5zcBcTsWjsMiBIKoaSvp037BN7TEXdfU1SL39qy nKpp8mPHDP5Ar5NEtOpTniAsm9qBHnm6KdiLN5Vd3OYOCMggqVBbAnwYz+wyDxXw3Sn9QtsJ uIqpIOa+EY22IK7/rH3A==
- Ironport-sdr: Jzd1dVpxVtIsLLl4oxkvx/iBUpgtGYSAWFxE5hbfce5dSaYe320Pbo5h9jVrjfO1ICQv34IU7V x5o1suUyG8JpjQcb1kNnL4UAyOLGGpW9S344srOnFD34resMuAvRRuRnEZDTKv4CoeeFmvfFqH xWqt8MKCwhO4KJjb0zQmHMCYt3a/mMxUVCFxuhO/sTSX06vGxt7htvlmvTlMDkGkH00OIPxAAU yU8emZHWE0ikh8ZEE5BFaqt8zW1HpBkLdYpMOFS7HbReJiQwDcwyBfGPqNjWi6bqp3OM4ffpMo BaxfVcs1BuTgzIXQcd5hN61s
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
On Thu, Sep 30, 2021 at 10:52:19AM +0300, Oleksandr Andrushchenko wrote:
> From: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx>
>
> Take into account guest's BAR view and program its p2m accordingly:
> gfn is guest's view of the BAR and mfn is the physical BAR value as set
> up by the host bridge in the hardware domain.
> This way hardware doamin sees physical BAR values and guest sees
> emulated ones.
>
> Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx>
>
> ---
> Since v2:
> - improve readability for data.start_gfn and restructure ?: construct
> Since v1:
> - s/MSI/MSI-X in comments
> ---
> xen/drivers/vpci/header.c | 34 ++++++++++++++++++++++++++++++++--
> 1 file changed, 32 insertions(+), 2 deletions(-)
>
> diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c
> index 9c603d26d302..f23c956cde6c 100644
> --- a/xen/drivers/vpci/header.c
> +++ b/xen/drivers/vpci/header.c
> @@ -30,6 +30,10 @@
>
> struct map_data {
> struct domain *d;
> + /* Start address of the BAR as seen by the guest. */
> + gfn_t start_gfn;
> + /* Physical start address of the BAR. */
> + mfn_t start_mfn;
> bool map;
> };
>
> @@ -37,12 +41,28 @@ static int map_range(unsigned long s, unsigned long e,
> void *data,
> unsigned long *c)
> {
> const struct map_data *map = data;
> + gfn_t start_gfn;
> int rc;
>
> for ( ; ; )
> {
> unsigned long size = e - s + 1;
>
> + /*
> + * Any BAR may have holes in its memory we want to map, e.g.
> + * we don't want to map MSI-X regions which may be a part of that
> BAR,
> + * e.g. when a single BAR is used for both MMIO and MSI-X.
IMO there are too many 'e.g.' here.
> + * In this case MSI-X regions are subtracted from the mapping, but
> + * map->start_gfn still points to the very beginning of the BAR.
> + * So if there is a hole present then we need to adjust start_gfn
> + * to reflect the fact of that substraction.
> + */
I would simply the comment a bit:
/*
* Ranges to be mapped don't always start at the BAR start address, as
* there can be holes or partially consumed ranges. Account for the
* offset of the current address from the BAR start.
*/
Apart from MSI-X related holes on x86 at least we support preemption
here, which means a range could be partially mapped before yielding.
> + start_gfn = gfn_add(map->start_gfn, s - mfn_x(map->start_mfn));
> +
> + printk(XENLOG_G_DEBUG
> + "%smap [%lx, %lx] -> %#"PRI_gfn" for d%d\n",
> + map->map ? "" : "un", s, e, gfn_x(start_gfn),
> + map->d->domain_id);
> /*
> * ARM TODOs:
> * - On ARM whether the memory is prefetchable or not should be
> passed
> @@ -52,8 +72,10 @@ static int map_range(unsigned long s, unsigned long e,
> void *data,
> * - {un}map_mmio_regions doesn't support preemption.
> */
>
> - rc = map->map ? map_mmio_regions(map->d, _gfn(s), size, _mfn(s))
> - : unmap_mmio_regions(map->d, _gfn(s), size, _mfn(s));
> + rc = map->map ? map_mmio_regions(map->d, start_gfn,
> + size, _mfn(s))
> + : unmap_mmio_regions(map->d, start_gfn,
> + size, _mfn(s));
> if ( rc == 0 )
> {
> *c += size;
> @@ -69,6 +91,7 @@ static int map_range(unsigned long s, unsigned long e, void
> *data,
> ASSERT(rc < size);
> *c += rc;
> s += rc;
> + gfn_add(map->start_gfn, rc);
I think increasing map->start_gfn is wrong here, as it would get out
of sync with map->start_mfn then, and the calculations done to obtain
start_gfn would then be wrong.
> if ( general_preempt_check() )
> return -ERESTART;
> }
> @@ -149,6 +172,10 @@ bool vpci_process_pending(struct vcpu *v)
> if ( !bar->mem )
> continue;
>
> + data.start_gfn =
> + _gfn(PFN_DOWN(is_hardware_domain(v->vpci.pdev->domain)
You can just use v->domain here.
> + ? bar->addr : bar->guest_addr));
I would place the '?' in the line above, but that's just my taste.
Thanks, Roger.
|