On Mon, Sep 27, 2021 at 11:04:26AM +0200, Jan Beulich wrote:
> On 24.09.2021 16:45, Roger Pau Monné wrote:
> > On Fri, Sep 24, 2021 at 11:42:13AM +0200, Jan Beulich wrote:
> >> - parent = (struct dma_pte
> >> *)map_vtd_domain_page(hd->arch.vtd.pgd_maddr);
> >> - while ( level > 1 )
> >> + pte_maddr = hd->arch.vtd.pgd_maddr;
> >> + parent = map_vtd_domain_page(pte_maddr);
> >> + while ( level > target )
> >> {
> >> offset = address_level_offset(addr, level);
> >> pte = &parent[offset];
> >>
> >> pte_maddr = dma_pte_addr(*pte);
> >> - if ( !pte_maddr )
> >> + if ( !dma_pte_present(*pte) || (level > 1 &&
> >> dma_pte_superpage(*pte)) )
> >> {
> >> struct page_info *pg;
> >> + /*
> >> + * Higher level tables always set r/w, last level page table
> >> + * controls read/write.
> >> + */
> >> + struct dma_pte new_pte = { DMA_PTE_PROT };
> >>
> >> if ( !alloc )
> >> - break;
> >> + {
> >> + pte_maddr = 0;
> >> + if ( !dma_pte_present(*pte) )
> >> + break;
> >> +
> >> + /*
> >> + * When the leaf entry was requested, pass back the full
> >> PTE,
> >> + * with the address adjusted to account for the residual
> >> of
> >> + * the walk.
> >> + */
> >> + pte_maddr = pte->val +
> >
> > Wouldn't it be better to use dma_pte_addr(*pte) rather than accessing
> > pte->val, and then you could drop the PAGE_MASK?
> >
> > Or is the addr parameter not guaranteed to be page aligned?
>
> addr is page aligned, but may not be superpage aligned. Yet that's not
> the point here. As per the comment at the top of the function (and as
> per the needs of intel_iommu_lookup_page()) we want to return a proper
> (even if fake) PTE here, i.e. in particular including the access
> control bits. Is "full" in the comment not sufficient to express this?
I see. I guess I got confused by the function name. It would be better
called addr_to_dma_pte?
Thanks, Roger.