iommu: debug-pagealloc: Use page_ext_get_from_phys()
Instead of calling pfn_valid() and then getting the page, call the newly added function page_ext_get_from_phys(), which would also check for MMIO and offline memory and return NULL in that case. Signed-off-by: Mostafa Saleh <smostafa@google.com> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
This commit is contained in:
parent
d414b83dc5
commit
a7f1bc231b
|
|
@ -30,14 +30,6 @@ struct page_ext_operations page_iommu_debug_ops = {
|
||||||
.need = need_iommu_debug,
|
.need = need_iommu_debug,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct page_ext *get_iommu_page_ext(phys_addr_t phys)
|
|
||||||
{
|
|
||||||
struct page *page = phys_to_page(phys);
|
|
||||||
struct page_ext *page_ext = page_ext_get(page);
|
|
||||||
|
|
||||||
return page_ext;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct iommu_debug_metadata *get_iommu_data(struct page_ext *page_ext)
|
static struct iommu_debug_metadata *get_iommu_data(struct page_ext *page_ext)
|
||||||
{
|
{
|
||||||
return page_ext_data(page_ext, &page_iommu_debug_ops);
|
return page_ext_data(page_ext, &page_iommu_debug_ops);
|
||||||
|
|
@ -45,18 +37,26 @@ static struct iommu_debug_metadata *get_iommu_data(struct page_ext *page_ext)
|
||||||
|
|
||||||
static void iommu_debug_inc_page(phys_addr_t phys)
|
static void iommu_debug_inc_page(phys_addr_t phys)
|
||||||
{
|
{
|
||||||
struct page_ext *page_ext = get_iommu_page_ext(phys);
|
struct page_ext *page_ext = page_ext_from_phys(phys);
|
||||||
struct iommu_debug_metadata *d = get_iommu_data(page_ext);
|
struct iommu_debug_metadata *d;
|
||||||
|
|
||||||
|
if (!page_ext)
|
||||||
|
return;
|
||||||
|
|
||||||
|
d = get_iommu_data(page_ext);
|
||||||
WARN_ON(atomic_inc_return_relaxed(&d->ref) <= 0);
|
WARN_ON(atomic_inc_return_relaxed(&d->ref) <= 0);
|
||||||
page_ext_put(page_ext);
|
page_ext_put(page_ext);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iommu_debug_dec_page(phys_addr_t phys)
|
static void iommu_debug_dec_page(phys_addr_t phys)
|
||||||
{
|
{
|
||||||
struct page_ext *page_ext = get_iommu_page_ext(phys);
|
struct page_ext *page_ext = page_ext_from_phys(phys);
|
||||||
struct iommu_debug_metadata *d = get_iommu_data(page_ext);
|
struct iommu_debug_metadata *d;
|
||||||
|
|
||||||
|
if (!page_ext)
|
||||||
|
return;
|
||||||
|
|
||||||
|
d = get_iommu_data(page_ext);
|
||||||
WARN_ON(atomic_dec_return_relaxed(&d->ref) < 0);
|
WARN_ON(atomic_dec_return_relaxed(&d->ref) < 0);
|
||||||
page_ext_put(page_ext);
|
page_ext_put(page_ext);
|
||||||
}
|
}
|
||||||
|
|
@ -104,11 +104,8 @@ void __iommu_debug_map(struct iommu_domain *domain, phys_addr_t phys, size_t siz
|
||||||
if (WARN_ON(!phys || check_add_overflow(phys, size, &end)))
|
if (WARN_ON(!phys || check_add_overflow(phys, size, &end)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (off = 0 ; off < size ; off += page_size) {
|
for (off = 0 ; off < size ; off += page_size)
|
||||||
if (!pfn_valid(__phys_to_pfn(phys + off)))
|
|
||||||
continue;
|
|
||||||
iommu_debug_inc_page(phys + off);
|
iommu_debug_inc_page(phys + off);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __iommu_debug_update_iova(struct iommu_domain *domain,
|
static void __iommu_debug_update_iova(struct iommu_domain *domain,
|
||||||
|
|
@ -123,7 +120,7 @@ static void __iommu_debug_update_iova(struct iommu_domain *domain,
|
||||||
for (off = 0 ; off < size ; off += page_size) {
|
for (off = 0 ; off < size ; off += page_size) {
|
||||||
phys_addr_t phys = iommu_iova_to_phys(domain, iova + off);
|
phys_addr_t phys = iommu_iova_to_phys(domain, iova + off);
|
||||||
|
|
||||||
if (!phys || !pfn_valid(__phys_to_pfn(phys)))
|
if (!phys)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (inc)
|
if (inc)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue