On Tue, Mar 02, 2021 at 10:26:42AM +0100, Jean-Philippe Brucker wrote:
[snip]

> +
> +static enum iommu_page_response_code
> +iopf_handle_single(struct iopf_fault *iopf)
> +{
> +     vm_fault_t ret;
> +     struct mm_struct *mm;
> +     struct vm_area_struct *vma;
> +     unsigned int access_flags = 0;
> +     unsigned int fault_flags = FAULT_FLAG_REMOTE;
> +     struct iommu_fault_page_request *prm = &iopf->fault.prm;
> +     enum iommu_page_response_code status = IOMMU_PAGE_RESP_INVALID;
> +
> +     if (!(prm->flags & IOMMU_FAULT_PAGE_REQUEST_PASID_VALID))
> +             return status;
> +
> +     mm = iommu_sva_find(prm->pasid);
> +     if (IS_ERR_OR_NULL(mm))
> +             return status;
> +
> +     mmap_read_lock(mm);
> +
> +     vma = find_extend_vma(mm, prm->addr);
> +     if (!vma)
> +             /* Unmapped area */
> +             goto out_put_mm;
> +
> +     if (prm->perm & IOMMU_FAULT_PERM_READ)
> +             access_flags |= VM_READ;
> +
> +     if (prm->perm & IOMMU_FAULT_PERM_WRITE) {
> +             access_flags |= VM_WRITE;
> +             fault_flags |= FAULT_FLAG_WRITE;
> +     }
> +
> +     if (prm->perm & IOMMU_FAULT_PERM_EXEC) {
> +             access_flags |= VM_EXEC;
> +             fault_flags |= FAULT_FLAG_INSTRUCTION;
> +     }
> +
> +     if (!(prm->perm & IOMMU_FAULT_PERM_PRIV))
> +             fault_flags |= FAULT_FLAG_USER;
> +
> +     if (access_flags & ~vma->vm_flags)
> +             /* Access fault */
> +             goto out_put_mm;
> +
> +     ret = handle_mm_fault(vma, prm->addr, fault_flags, NULL);

Should we add a trace similar to trace_page_fault_user() or kernel in
arch/x86/kernel/mm/fault.c 

or maybe add a perf_sw_event() for device faults? 

Cheers,
Ashok
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to