[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 3/3] x86/iommu: use a rangeset for hwdom setup
- To: Roger Pau Monne <roger.pau@xxxxxxxxxx>
- From: Jan Beulich <jbeulich@xxxxxxxx>
- Date: Mon, 20 Nov 2023 11:30:16 +0100
- Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.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=4g7qqN6ucZJINMdBhE4OI2oJFfnaEz3HJMBXdhYnjHA=; b=VDN4v3ej33eq3woS0AWloXmZRQZQ1J+9041ynVhtPP3Le5EhsScxc3t7qmMN7x5vrKmwph3yPal9xW4OLh+NOgwwruGwDVQCxS7cUQxP1KP5U2y0xMmj+dhAGntcWYm9bFJjw38wT8Ytci9lr+tU2fkOe7VR/E1K0/ghqllS+gzuZMQDO1QDAZjgt15OzhdeeXVWSd744i1cmHGkYdCjONrGWfhonpQUOKquJ++VSRLrOZWhsHTHQU2AYgEJxoa2nxpa084qCPJwbx2TFzeRKXU2N2CsNbq6opUHbJsx3+5b5a+skuT1ZociQ2XOhaKK5kj4NDJ3B/lrx/+A67MZjg==
- Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=C96/YKUhh72wYVEVmUGQwPebTnoJfV7ETopcHLLCSDqAFYfSDKtoKy4sHj+WRA+Od7cVtyM61h4R7FDFoEX1u3NYDCH++Dkt9UHhLnV1X5+SDNuoFzv1EViCGS9JfFuhNQ4NreOU4tp1+m6D1H63IN/YdipeRJB0B5wzLkt9WiR1jHHUQMbwUUdaTsbyCA36UnRgUFHQNj828EZUSm4Voa7yArs57wSYKXBJFiF5zchqCxZ6Noc/SU4bRtZ5fAmNE8dnBMn8D45bMpxKteYDpGmk33fXChMAwcZQqzB33gARCtIC1wBpxm5ohz6S5RPc1Y3PD9VDkNzxkgk1HDXDXw==
- Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com;
- Autocrypt: addr=jbeulich@xxxxxxxx; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL
- Cc: Paul Durrant <paul@xxxxxxx>, Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Wei Liu <wl@xxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
- Delivery-date: Mon, 20 Nov 2023 10:30:28 +0000
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
On 17.11.2023 10:47, Roger Pau Monne wrote:
> --- a/xen/arch/x86/hvm/io.c
> +++ b/xen/arch/x86/hvm/io.c
> @@ -364,9 +364,20 @@ static const struct hvm_mmcfg *vpci_mmcfg_find(const
> struct domain *d,
> return NULL;
> }
>
> -bool vpci_is_mmcfg_address(const struct domain *d, paddr_t addr)
> +int vpci_subtract_mmcfg(const struct domain *d, struct rangeset *r)
While there, also add __hwdom_init?
> @@ -447,62 +451,135 @@ void __hwdom_init arch_iommu_hwdom_init(struct domain
> *d)
> if ( iommu_hwdom_passthrough )
> return;
>
> - max_pfn = (GB(4) >> PAGE_SHIFT) - 1;
> - top = max(max_pdx, pfn_to_pdx(max_pfn) + 1);
> + map = rangeset_new(NULL, NULL, 0);
> + if ( !map )
> + panic("IOMMU initialization failed unable to allocate rangeset\n");
This reads a little odd, and could probably do with shortening anyway
(e.g. "IOMMU init: unable to allocate rangeset\n").
> + if ( iommu_hwdom_inclusive )
> + {
> + /* Add the whole range below 4GB, UNUSABLE regions will be removed.
> */
> + rc = rangeset_add_range(map, 0, max_pfn);
> + if ( rc )
> + panic("IOMMU inclusive mappings can't be added: %d\n",
> + rc);
> + }
>
> - for ( i = 0, start = 0, count = 0; i < top; )
> + for ( i = 0; i < e820.nr_map; i++ )
> {
> - unsigned long pfn = pdx_to_pfn(i);
> - unsigned int perms = hwdom_iommu_map(d, pfn, max_pfn);
> + struct e820entry entry = e820.map[i];
>
> - if ( !perms )
> - /* nothing */;
> - else if ( paging_mode_translate(d) )
> + switch ( entry.type )
> {
> - int rc;
> + case E820_UNUSABLE:
> + if ( !iommu_hwdom_inclusive || PFN_DOWN(entry.addr) > max_pfn )
> + continue;
It's > here, but ...
> - rc = p2m_add_identity_entry(d, pfn,
> - perms & IOMMUF_writable ?
> p2m_access_rw
> - :
> p2m_access_r,
> - 0);
> + rc = rangeset_remove_range(map, PFN_DOWN(entry.addr),
> + PFN_DOWN(entry.addr + entry.size -
> 1));
> if ( rc )
> - printk(XENLOG_WARNING
> - "%pd: identity mapping of %lx failed: %d\n",
> - d, pfn, rc);
> + panic("IOMMU failed to remove unusable memory: %d\n",
> + rc);
> + continue;
> +
> + case E820_RESERVED:
> + if ( !iommu_hwdom_inclusive && !iommu_hwdom_reserved )
> + continue;
> + break;
> +
> + case E820_RAM:
> + if ( iommu_hwdom_strict )
> + continue;
> + break;
> +
> + default:
> + if ( !iommu_hwdom_inclusive || PFN_DOWN(entry.addr) >= max_pfn )
> + continue;
... >= here?
> + entry.size = pfn_to_paddr(max_pfn) - 1 - entry.addr;
Why the subtraction of 1 when you're calculating size? Don't you actually
need to add 1 to max_pfn before converting to paddr?
While overall things look plausible elsewhere, I'm hoping that - as asked
for by Andrew - it'll be possible to split this some, to make it a little
more reasonable to actually look at the changes done.
Jan
|