From: Jason Gunthorpe jgg@nvidia.com Sent: Thursday, September 4, 2025 1:47 AM
map is slightly complicated because it has to handle a number of special edge cases:
- Overmapping a previously shared table with an OA - requries validating and freeing the possibly empty tables
- Doing the above across an entire to-be-created contiguous entry
- Installing a new shared table level concurrently with another thread
- Expanding the table by adding more top levels
what is 'shared table'? Looks this term doesn't appear in previous patches.
also it's unclear to me why overmapping a previously shared table can succeed while overmapping leaf entries cannot (w/ -EADDRINUSE)
- /* Calculate target page size and level for the leaves */
- if (pt_has_system_page(common) && pgsize == PAGE_SIZE &&
pgcount == 1) {
PT_WARN_ON(!(pgsize_bitmap & PAGE_SIZE));
if (log2_mod(iova | paddr, PAGE_SHIFT))
return -ENXIO;
map.leaf_pgsize_lg2 = PAGE_SHIFT;
map.leaf_level = 0;
single_page = true;
- } else {
map.leaf_pgsize_lg2 = pt_compute_best_pgsize(
pgsize_bitmap, range.va, range.last_va, paddr);
if (!map.leaf_pgsize_lg2)
return -ENXIO;
map.leaf_level =
pt_pgsz_lg2_to_level(common, map.leaf_pgsize_lg2);
Existing driver checks alignment on pgsize, e.g. intel-iommu:
if (!IS_ALIGNED(iova | paddr, pgsize)) return -EINVAL;
But pt_compute_best_pgsize() doesn't use 'pgsize' and only have checks on calculated pgsz_lg2:
pgsz_lg2 = log2_fls(pgsz_bitmap); if (!pgsz_lg2) return 0;
pgsz_lg2--;
PT_WARN_ON(log2_mod(va, pgsz_lg2) != 0); PT_WARN_ON(oalog2_mod(oa, pgsz_lg2) != 0);
Looks not identical.
+/**
- struct pt_iommu_flush_ops - HW IOTLB cache flushing operations
- The IOMMU driver should implement these using
container_of(iommu_table) to
- get to it's iommu_domain dervied structure. All ops can be called in
atomic
- contexts as they are buried under DMA API calls.
s/dervied/derived/