From: Donggeun Yoo <donggeunyoo.kernel@gmail.com>
To: Michael Kelley <mhklinux@outlook.com>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>,
Robin Murphy <robin.murphy@arm.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
Chanho Park <chanho61.park@samsung.com>,
Bumyong Lee <bumyong.lee@samsung.com>,
iommu@lists.linux.dev, linux-kernel@vger.kernel.org,
stable@vger.kernel.org,
Donggeun Yoo <donggeunyoo.kernel@gmail.com>
Subject: Re: [PATCH] swiotlb: use the adjusted address for the highmem page lookup
Date: Sun, 6 Sep 2026 03:54:31 +0900 [thread overview]
Message-ID: <20260905185431.177766-1-donggeunyoo.kernel@gmail.com> (raw)
In-Reply-To: <SN6PR02MB41579A137BC1D48AFE93E27FD4B42@SN6PR02MB4157.namprd02.prod.outlook.com>
On Sat, Sep 05, 2026 at 03:45:41PM +0000, Michael Kelley wrote:
> I don't understand this paragraph, but that may be because I'm not that
> familiar with highmem. Are all the slots making up a particular swiotlb
> mapping either highmem or lowmem? If a mixture is possible, then a
> partial sync could start somewhere in a lowmem page and cross over
> into a highmem page, which would break.
The slots are always lowmem: the pool comes from memblock_alloc_low() and
swiotlb holds one kernel address for it in mem->vaddr. PageHighMem() here
asks about the pages behind orig_addr, so the question is whether one
mapping's original buffer can span both. It can. ZONE_NORMAL ends at
max_low_pfn and ZONE_HIGHMEM starts there, and while the page allocator
will not hand out a run across that line, pages_are_mergeable() and
bvec_try_merge_page() merge on physical adjacency alone.
Your case is real, and this patch does not fix it. On a 32-bit ARM guest
(multi_v7_defconfig plus ARM_LPAE and HIGHMEM, 2G, swiotlb=force) with
lowmem ending at pfn 0x70000 and high_memory at f0000000:
orig=6ffffe00 len=1024 last=700001ff
mainline PageHighMem(pfn_to_page(PFN_DOWN(orig))) = 0
this patch PhysHighMem(orig) = 0
phys_to_virt(last) = f00001ff, past high_memory
dma_map_page(pfn 0x6ffff, off 3584, len 1024, TO_DEVICE)
Unable to handle kernel paging request at virtual address f0000000
Internal error: Oops: 206 [#1] SMP ARM
PC is at mmiocpy+0x4c/0x334
dma_map_page_attrs from ...
The same oops with and without this patch, and no partial sync is needed
for it: the bounce at map time does it.
is_highmem() is monotonic in the pfn, since ZONE_HIGHMEM and a
ZONE_MOVABLE carved out of it are the highest zones, so testing the last
byte alone covers your case and this one, at the cost of the single test
already there. On top of this patch:
- if (PhysHighMem(orig_addr)) {
+ if (PhysHighMem(orig_addr + size - 1)) {
The loop copies through kmap_local_page(), which is fine for a lowmem
page, so entering it for a range that only ends in highmem is correct.
That guest survives the map above with it.
The second one predates 5f89468e2f06, so I will send it separately.
next prev parent reply other threads:[~2026-09-05 18:54 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-05 8:42 Donggeun Yoo
2026-09-05 15:45 ` Michael Kelley
2026-09-05 18:54 ` Donggeun Yoo [this message]
2026-09-05 20:07 ` Michael Kelley
2026-09-05 20:08 ` Michael Kelley
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=20260905185431.177766-1-donggeunyoo.kernel@gmail.com \
--to=donggeunyoo.kernel@gmail.com \
--cc=bumyong.lee@samsung.com \
--cc=chanho61.park@samsung.com \
--cc=iommu@lists.linux.dev \
--cc=konrad.wilk@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=m.szyprowski@samsung.com \
--cc=mhklinux@outlook.com \
--cc=robin.murphy@arm.com \
--cc=stable@vger.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
all inboxes | Powered by JetHome®