On 2/14/19 12:47 AM, Christoph Hellwig wrote: > On Wed, Feb 13, 2019 at 05:01:27PM -0700, Khalid Aziz wrote: >> +++ b/kernel/dma/swiotlb.c >> @@ -396,8 +396,9 @@ static void swiotlb_bounce(phys_addr_t orig_addr, phys_addr_t tlb_addr, >> { >> unsigned long pfn = PFN_DOWN(orig_addr); >> unsigned char *vaddr = phys_to_virt(tlb_addr); >> + struct page *page = pfn_to_page(pfn); >> >> - if (PageHighMem(pfn_to_page(pfn))) { >> + if (PageHighMem(page) || xpfo_page_is_unmapped(page)) { > > I think this just wants a page_unmapped or similar helper instead of > needing the xpfo_page_is_unmapped check. We actually have quite > a few similar construct in the arch dma mapping code for architectures > that require cache flushing. As I am not the original author of this patch, I am interpreting the original intent. I think xpfo_page_is_unmapped() was added to account for kernel build without CONFIG_XPFO. xpfo_page_is_unmapped() has an alternate definition to return false if CONFIG_XPFO is not defined. xpfo_is_unmapped() is cleaned up further in patch 11 ("xpfo, mm: remove dependency on CONFIG_PAGE_EXTENSION") to a one-liner "return PageXpfoUnmapped(page);". xpfo_is_unmapped() can be eliminated entirely by adding an else clause to the following code added by that patch: --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -398,6 +402,15 @@ TESTCLEARFLAG(Young, young, PF_ANY) PAGEFLAG(Idle, idle, PF_ANY) #endif +#ifdef CONFIG_XPFO +PAGEFLAG(XpfoUser, xpfo_user, PF_ANY) +TESTCLEARFLAG(XpfoUser, xpfo_user, PF_ANY) +TESTSETFLAG(XpfoUser, xpfo_user, PF_ANY) +PAGEFLAG(XpfoUnmapped, xpfo_unmapped, PF_ANY) +TESTCLEARFLAG(XpfoUnmapped, xpfo_unmapped, PF_ANY) +TESTSETFLAG(XpfoUnmapped, xpfo_unmapped, PF_ANY) +#endif + /* * On an anonymous page mapped into a user virtual memory area, * page->mapping points to its anon_vma, not to a struct address_space; Adding the following #else to above conditional: #else TESTPAGEFLAG_FALSE(XpfoUser) TESTPAGEFLAG_FALSE(XpfoUnmapped) should allow us to eliminate xpfo_is_unmapped(). Right? Thanks, Khalid > >> +bool xpfo_page_is_unmapped(struct page *page) >> +{ >> + struct xpfo *xpfo; >> + >> + if (!static_branch_unlikely(&xpfo_inited)) >> + return false; >> + >> + xpfo = lookup_xpfo(page); >> + if (unlikely(!xpfo) && !xpfo->inited) >> + return false; >> + >> + return test_bit(XPFO_PAGE_UNMAPPED, &xpfo->flags); >> +} >> +EXPORT_SYMBOL(xpfo_page_is_unmapped); > > And at least for swiotlb there is no need to export this helper, > as it is always built in. >