Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:15.5:Update
xen.27494
xsa400-00.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File xsa400-00.patch of Package xen.27494
# Commit 9fdc10abe9457e4c9879a266f82372cb08e88ffb # Date 2021-11-24 11:06:20 +0100 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> VT-d: split domid map cleanup check into a function This logic will want invoking from elsewhere. No functional change intended. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Roger Pau Monné <roger.pau@citrix.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -171,6 +171,51 @@ static void cleanup_domid_map(struct dom } } +static bool any_pdev_behind_iommu(const struct domain *d, + const struct pci_dev *exclude, + const struct iommu *iommu) +{ + const struct pci_dev *pdev; + + for_each_pdev ( d, pdev ) + { + const struct acpi_drhd_unit *drhd; + + if ( pdev == exclude ) + continue; + + drhd = acpi_find_matched_drhd_unit(pdev); + if ( drhd && drhd->iommu == iommu ) + return true; + } + + return false; +} + +/* + * If no other devices under the same iommu owned by this domain, + * clear iommu in iommu_bitmap and clear domain_id in domid_bitmap. + */ +static void check_cleanup_domid_map(struct domain *d, + const struct pci_dev *exclude, + struct iommu *iommu) +{ + bool found = any_pdev_behind_iommu(d, exclude, iommu); + + /* + * Hidden devices are associated with DomXEN but usable by the hardware + * domain. Hence they need considering here as well. + */ + if ( !found && is_hardware_domain(d) ) + found = any_pdev_behind_iommu(dom_xen, exclude, iommu); + + if ( !found ) + { + clear_bit(iommu->index, &dom_iommu(d)->arch.iommu_bitmap); + cleanup_domid_map(d, iommu); + } +} + static int iommus_incoherent; static void sync_cache(const void *addr, unsigned int size) @@ -1719,27 +1764,6 @@ int domain_context_unmap_one( return rc; } -static bool any_pdev_behind_iommu(const struct domain *d, - const struct pci_dev *exclude, - const struct iommu *iommu) -{ - const struct pci_dev *pdev; - - for_each_pdev ( d, pdev ) - { - const struct acpi_drhd_unit *drhd; - - if ( pdev == exclude ) - continue; - - drhd = acpi_find_matched_drhd_unit(pdev); - if ( drhd && drhd->iommu == iommu ) - return true; - } - - return false; -} - static int domain_context_unmap(struct domain *domain, u8 devfn, struct pci_dev *pdev) { @@ -1748,7 +1772,6 @@ static int domain_context_unmap(struct d int ret = 0; uint16_t seg = pdev->seg; uint8_t bus = pdev->bus, tmp_bus, tmp_devfn, secbus; - bool found; drhd = acpi_find_matched_drhd_unit(pdev); if ( !drhd ) @@ -1829,26 +1852,8 @@ static int domain_context_unmap(struct d goto out; } - if ( ret ) - goto out; - - /* - * If no other devices under the same iommu owned by this domain, - * clear iommu in iommu_bitmap and clear domain_id in domid_bitmap. - */ - found = any_pdev_behind_iommu(domain, pdev, iommu); - /* - * Hidden devices are associated with DomXEN but usable by the hardware - * domain. Hence they need considering here as well. - */ - if ( !found && is_hardware_domain(domain) ) - found = any_pdev_behind_iommu(dom_xen, pdev, iommu); - - if ( !found ) - { - clear_bit(iommu->index, &dom_iommu(domain)->arch.iommu_bitmap); - cleanup_domid_map(domain, iommu); - } + if ( !ret ) + check_cleanup_domid_map(domain, pdev, iommu); out: return ret;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor