From: Baolu Lu <baolu.lu@linux.intel.com>
To: "Liu, Jingqi" <jingqi.liu@intel.com>,
Jason Gunthorpe <jgg@ziepe.ca>, Kevin Tian <kevin.tian@intel.com>,
Joerg Roedel <joro@8bytes.org>, Will Deacon <will@kernel.org>,
Robin Murphy <robin.murphy@arm.com>,
Alex Williamson <alex.williamson@redhat.com>,
Nicolin Chen <nicolinc@nvidia.com>
Cc: baolu.lu@linux.intel.com, iommu@lists.linux.dev,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Jason Gunthorpe <jgg@nvidia.com>
Subject: Re: [PATCH 1/2] iommu: Prevent RESV_DIRECT devices from blocking domains
Date: Tue, 13 Jun 2023 11:14:30 +0800 [thread overview]
Message-ID: <69f50ced-e806-717a-0c74-a4cfa58600fa@linux.intel.com> (raw)
In-Reply-To: <8cc1d69e-f86d-fd04-7737-914d967dc0f5@intel.com>
On 6/12/23 4:28 PM, Liu, Jingqi wrote:
> On 6/7/2023 11:51 AM, Lu Baolu wrote:
>> The IOMMU_RESV_DIRECT flag indicates that a memory region must be mapped
>> 1:1 at all times. This means that the region must always be accessible to
>> the device, even if the device is attached to a blocking domain. This is
>> equal to saying that IOMMU_RESV_DIRECT flag prevents devices from being
>> attached to blocking domains.
>>
>> This also implies that devices that implement RESV_DIRECT regions will be
>> prevented from being assigned to user space since taking the DMA
>> ownership
>> immediately switches to a blocking domain.
>>
>> The rule of preventing devices with the IOMMU_RESV_DIRECT regions from
>> being assigned to user space has existed in the Intel IOMMU driver for
>> a long time. Now, this rule is being lifted up to a general core rule,
>> as other architectures like AMD and ARM also have RMRR-like reserved
>> regions. This has been discussed in the community mailing list and refer
>> to below link for more details.
>>
>> Other places using unmanaged domains for kernel DMA must follow the
>> iommu_get_resv_regions() and setup IOMMU_RESV_DIRECT - we do not restrict
>> them in the core code.
>>
>> Cc: Robin Murphy <robin.murphy@arm.com>
>> Cc: Alex Williamson <alex.williamson@redhat.com>
>> Cc: Kevin Tian <kevin.tian@intel.com>
>> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
>> Link:
>> https://lore.kernel.org/linux-iommu/BN9PR11MB5276E84229B5BD952D78E9598C639@BN9PR11MB5276.namprd11.prod.outlook.com
>> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
>> ---
>> include/linux/iommu.h | 2 ++
>> drivers/iommu/iommu.c | 39 +++++++++++++++++++++++++++++----------
>> 2 files changed, 31 insertions(+), 10 deletions(-)
>>
>> diff --git a/include/linux/iommu.h b/include/linux/iommu.h
>> index d31642596675..fd18019ac951 100644
>> --- a/include/linux/iommu.h
>> +++ b/include/linux/iommu.h
>> @@ -409,6 +409,7 @@ struct iommu_fault_param {
>> * @priv: IOMMU Driver private data
>> * @max_pasids: number of PASIDs this device can consume
>> * @attach_deferred: the dma domain attachment is deferred
>> + * @requires_direct: The driver requested IOMMU_RESV_DIRECT
>> *
>> * TODO: migrate other per device data pointers under
>> iommu_dev_data, e.g.
>> * struct iommu_group *iommu_group;
>> @@ -422,6 +423,7 @@ struct dev_iommu {
>> void *priv;
>> u32 max_pasids;
>> u32 attach_deferred:1;
>> + u32 requires_direct:1;
>> };
>> int iommu_device_register(struct iommu_device *iommu,
>> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
>> index 9e0228ef612b..e59de7852067 100644
>> --- a/drivers/iommu/iommu.c
>> +++ b/drivers/iommu/iommu.c
>> @@ -959,12 +959,7 @@ static int
>> iommu_create_device_direct_mappings(struct iommu_domain *domain,
>> unsigned long pg_size;
>> int ret = 0;
>> - if (!iommu_is_dma_domain(domain))
>> - return 0;
>> -
>> - BUG_ON(!domain->pgsize_bitmap);
>> -
>> - pg_size = 1UL << __ffs(domain->pgsize_bitmap);
>> + pg_size = domain->pgsize_bitmap ? 1UL <<
>> __ffs(domain->pgsize_bitmap) : 0;
> Would it be better to add the following check here?
> if (WARN_ON(!pg_size))
> return -EINVAL;
>
> Instead of checking latter in the loop as follows.
> if (WARN_ON_ONCE(!pg_size)) {
> ret = -EINVAL;
> goto out;
> }
I am afraid no. Only the paging domains need a valid pg_size. That's the
reason why I put it after the iommu_is_dma_domain() check. The previous
code has the same behavior too.
Best regards,
baolu
next prev parent reply other threads:[~2023-06-13 3:15 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-07 3:51 [PATCH 0/2] Prevent RESV_DIRECT devices from user assignment Lu Baolu
2023-06-07 3:51 ` [PATCH 1/2] iommu: Prevent RESV_DIRECT devices from blocking domains Lu Baolu
2023-06-12 8:28 ` Liu, Jingqi
2023-06-13 3:14 ` Baolu Lu [this message]
2023-06-27 7:54 ` Tian, Kevin
2023-06-27 8:01 ` Baolu Lu
2023-06-27 8:15 ` Tian, Kevin
2023-06-27 8:21 ` Baolu Lu
2023-06-27 15:47 ` Jason Gunthorpe
2023-06-19 13:33 ` Robin Murphy
2023-06-19 13:41 ` Jason Gunthorpe
2023-06-19 14:20 ` Robin Murphy
2023-06-19 15:30 ` Jason Gunthorpe
2023-06-27 8:10 ` Tian, Kevin
2023-06-27 15:49 ` Jason Gunthorpe
2023-06-07 3:51 ` [PATCH 2/2] iommu/vt-d: Remove rmrr check in domain attaching device path Lu Baolu
2023-06-23 16:49 ` Jason Gunthorpe
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=69f50ced-e806-717a-0c74-a4cfa58600fa@linux.intel.com \
--to=baolu.lu@linux.intel.com \
--cc=alex.williamson@redhat.com \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=jgg@ziepe.ca \
--cc=jingqi.liu@intel.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nicolinc@nvidia.com \
--cc=robin.murphy@arm.com \
--cc=will@kernel.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.