From: Robin Murphy <robin.murphy@arm.com>
To: Jason Gunthorpe <jgg@ziepe.ca>
Cc: joro@8bytes.org, will@kernel.org, iommu@lists.linux.dev,
linux-arm-kernel@lists.infradead.org, m.szyprowski@samsung.com,
heiko@sntech.de, jernej.skrabec@gmail.com,
thierry.reding@gmail.com, vdumpa@nvidia.com
Subject: Re: [PATCH 8/8] iommu: Improve map/unmap sanity checks
Date: Thu, 14 Sep 2023 15:23:46 +0100 [thread overview]
Message-ID: <e37085dc-cac4-b7f4-8c2e-e51e56a66887@arm.com> (raw)
In-Reply-To: <ZQMBLFB20ke4hv9t@ziepe.ca>
On 2023-09-14 13:48, Jason Gunthorpe wrote:
> On Wed, Sep 13, 2023 at 07:46:45PM +0100, Robin Murphy wrote:
>> On 2023-09-13 15:39, Jason Gunthorpe wrote:
>>> On Tue, Sep 12, 2023 at 05:18:44PM +0100, Robin Murphy wrote:
>>>> The current checks for the __IOMMU_DOMAIN_PAGING capability seem a
>>>> bit stifled, since it is quite likely now that a non-paging domain
>>>> won't have a pgsize_bitmap and/or mapping ops, and thus get caught
>>>> by the earlier condition anyway. Swap them around to test the more
>>>> fundamental condition first, then we can reasonably also upgrade
>>>> the other to a WARN_ON, since if a driver does ever expose a paging
>>>> domain without the means to actually page, it's clearly very broken.
>>>
>>>> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
>>>> ---
>>>> drivers/iommu/iommu.c | 10 +++++-----
>>>> 1 file changed, 5 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
>>>> index c83f2e4c56f5..391bcae4d02d 100644
>>>> --- a/drivers/iommu/iommu.c
>>>> +++ b/drivers/iommu/iommu.c
>>>> @@ -2427,12 +2427,12 @@ static int __iommu_map(struct iommu_domain *domain, unsigned long iova,
>>>> phys_addr_t orig_paddr = paddr;
>>>> int ret = 0;
>>>> - if (unlikely(!ops->map_pages || domain->pgsize_bitmap == 0UL))
>>>> - return -ENODEV;
>>>> -
>>>> if (unlikely(!(domain->type & __IOMMU_DOMAIN_PAGING)))
>>>> return -EINVAL;
>>>
>>> Why isn't this a WARN_ON? The caller is clearly lost its mind if it
>>> is calling map on a non paging domain..
>>
>> Sure it's a dumb thing to do, however I don't think we can reasonably say
>> without question that an external caller being dumb represents an unexpected
>> and serious loss of internal consistency.
>
> WARN_ON is not just for "serious loss of internal consistency" it
> should be use in all places where invariant are violated. We can't
> guess why the caller is using this wrong (most likely it is UAF or
> memory corruption), but if this fires something definately has gone
> wrong with the kernel.
Has it? It's not *functionally* incorrect to obtain a valid domain by
calling iommu_get_domain_for_dev(), pass that domain to iommu_map(), and
handle any failure returned. Sure, it's *semantically* questionable, but
so is calling iommu_iova_to_phys() on non-paging domains, and we have to
support that, because callers are dumb, and "callers aren't dumb" is not
a realistic invariant which we can uphold.
> eg if syzkaller somehow hits this we want the WARN_ON so it reports
> it.
But then an "IOMMU bug" is reported to us, and we say "yeah, that's not
ours, that's some code somewhere down in the middle of that callstack
being dumb", and then what? I know I don't have the time or inclination
to go off debugging and redesigning random other bits of the kernel for
calling our API in ways that look sketchy but aren't technically
invalid, do you?
iommu_map() can already fail for numerous reasons that may or may not
represent a bug in the caller, like the IOVA or PA being out-of-range,
or the IOVA already being mapped, or whatever. The wrong type of domain
is just another reason to fail (in, as far as we're concerned, an
entirely safe and manageable way). Callers have to be prepared to handle
failure, but it's up to them how unexpected or serious it is; we can't
second-guess them.
Thanks,
Robin.
next prev parent reply other threads:[~2023-09-14 14:24 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-12 16:18 [PATCH 0/8] iommu: Clean up map/unmap ops Robin Murphy
2023-09-12 16:18 ` [PATCH 1/8] iommu/exynos: Update to {map,unmap}_pages Robin Murphy
2023-09-12 16:18 ` [PATCH 2/8] iommu/omap: " Robin Murphy
2023-09-12 16:18 ` [PATCH 3/8] iommu/rockchip: " Robin Murphy
2023-09-12 16:18 ` [PATCH 4/8] iommu/sun50i: " Robin Murphy
2023-09-12 16:18 ` [PATCH 5/8] iommu/tegra-gart: " Robin Murphy
2023-09-12 16:18 ` [PATCH 6/8] iommu/tegra-smmu: " Robin Murphy
2023-09-12 16:18 ` [PATCH 7/8] iommu: Retire map/unmap ops Robin Murphy
2023-09-13 14:40 ` Jason Gunthorpe
2023-09-12 16:18 ` [PATCH 8/8] iommu: Improve map/unmap sanity checks Robin Murphy
2023-09-13 14:39 ` Jason Gunthorpe
2023-09-13 18:46 ` Robin Murphy
2023-09-14 12:48 ` Jason Gunthorpe
2023-09-14 14:23 ` Robin Murphy [this message]
2023-09-14 16:48 ` Jason Gunthorpe
2023-09-19 12:18 ` Robin Murphy
2023-09-22 17:28 ` Jason Gunthorpe
2023-09-25 10:05 ` [PATCH 0/8] iommu: Clean up map/unmap ops Joerg Roedel
2023-09-25 15:33 ` Jernej Škrabec
2023-09-26 9:23 ` Joerg Roedel
2023-09-26 12:01 ` Robin Murphy
2023-09-26 14:57 ` Joerg Roedel
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=e37085dc-cac4-b7f4-8c2e-e51e56a66887@arm.com \
--to=robin.murphy@arm.com \
--cc=heiko@sntech.de \
--cc=iommu@lists.linux.dev \
--cc=jernej.skrabec@gmail.com \
--cc=jgg@ziepe.ca \
--cc=joro@8bytes.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=m.szyprowski@samsung.com \
--cc=thierry.reding@gmail.com \
--cc=vdumpa@nvidia.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox