[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH V4 3/4] intel-iommu: convert VTD_PE_GET_FPD_ERR() to be a fun
From: |
Jason Wang |
Subject: |
Re: [PATCH V4 3/4] intel-iommu: convert VTD_PE_GET_FPD_ERR() to be a function |
Date: |
Fri, 28 Oct 2022 10:04:58 +0800 |
On Thu, Oct 27, 2022 at 9:16 PM Yi Liu <yi.l.liu@intel.com> wrote:
>
> On 2022/10/27 15:50, Jason Wang wrote:
> > We used to have a macro for VTD_PE_GET_FPD_ERR() but it has an
> > internal goto which prevents it from being reused. This patch convert
> > that macro to a dedicated function and let the caller to decide what
> > to do (e.g using goto or not). This makes sure it can be re-used for
> > other function that requires fault reporting.
> >
> > Signed-off-by: Jason Wang <jasowang@redhat.com>
> > ---
> > Changes since V2:
> > - rename vtd_qualify_report_fault() to vtd_report_qualify_fault()
> > ---
> > hw/i386/intel_iommu.c | 42 ++++++++++++++++++++++++++++--------------
> > 1 file changed, 28 insertions(+), 14 deletions(-)
> >
> > diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
> > index 6abe12a8c5..6c03ecf3cb 100644
> > --- a/hw/i386/intel_iommu.c
> > +++ b/hw/i386/intel_iommu.c
> > @@ -49,17 +49,6 @@
> > /* pe operations */
> > #define VTD_PE_GET_TYPE(pe) ((pe)->val[0] & VTD_SM_PASID_ENTRY_PGTT)
> > #define VTD_PE_GET_LEVEL(pe) (2 + (((pe)->val[0] >> 2) &
> > VTD_SM_PASID_ENTRY_AW))
> > -#define VTD_PE_GET_FPD_ERR(ret_fr, is_fpd_set, s, source_id, addr,
> > is_write) {\
> > - if (ret_fr) {
> > \
> > - ret_fr = -ret_fr;
> > \
> > - if (is_fpd_set && vtd_is_qualified_fault(ret_fr)) {
> > \
> > - trace_vtd_fault_disabled();
> > \
> > - } else {
> > \
> > - vtd_report_dmar_fault(s, source_id, addr, ret_fr, is_write);
> > \
> > - }
> > \
> > - goto error;
> > \
> > - }
> > \
> > -}
> >
> > /*
> > * PCI bus number (or SID) is not reliable since the device is usaully
> > @@ -1718,6 +1707,19 @@ out:
> > trace_vtd_pt_enable_fast_path(source_id, success);
> > }
> >
> > +static void vtd_report_qualify_fault(IntelIOMMUState *s,
> > + int err, bool is_fpd_set,
> > + uint16_t source_id,
> > + hwaddr addr,
> > + bool is_write)
> > +{
> > + if (is_fpd_set && vtd_is_qualified_fault(err)) {
> > + trace_vtd_fault_disabled();
> > + } else {
> > + vtd_report_dmar_fault(s, source_id, addr, err, is_write);
>
> seems like this will report non-qualified fault. so the naming is not
> most suit. :-) Otherwise, I'm ok with the change.
Right, let me rename it to vtd_report_fault().
Thanks
>
> > + }
> > +}
> > +
> > /* Map dev to context-entry then do a paging-structures walk to do a iommu
> > * translation.
> > *
> > @@ -1778,7 +1780,11 @@ static bool vtd_do_iommu_translate(VTDAddressSpace
> > *vtd_as, PCIBus *bus,
> > is_fpd_set = ce.lo & VTD_CONTEXT_ENTRY_FPD;
> > if (!is_fpd_set && s->root_scalable) {
> > ret_fr = vtd_ce_get_pasid_fpd(s, &ce, &is_fpd_set);
> > - VTD_PE_GET_FPD_ERR(ret_fr, is_fpd_set, s, source_id, addr,
> > is_write);
> > + if (ret_fr) {
> > + vtd_report_qualify_fault(s, -ret_fr, is_fpd_set,
> > + source_id, addr, is_write);
> > + goto error;
> > + }
> > }
> > } else {
> > ret_fr = vtd_dev_to_context_entry(s, bus_num, devfn, &ce);
> > @@ -1786,7 +1792,11 @@ static bool vtd_do_iommu_translate(VTDAddressSpace
> > *vtd_as, PCIBus *bus,
> > if (!ret_fr && !is_fpd_set && s->root_scalable) {
> > ret_fr = vtd_ce_get_pasid_fpd(s, &ce, &is_fpd_set);
> > }
> > - VTD_PE_GET_FPD_ERR(ret_fr, is_fpd_set, s, source_id, addr,
> > is_write);
> > + if (ret_fr) {
> > + vtd_report_qualify_fault(s, -ret_fr, is_fpd_set,
> > + source_id, addr, is_write);
> > + goto error;
> > + }
> > /* Update context-cache */
> > trace_vtd_iotlb_cc_update(bus_num, devfn, ce.hi, ce.lo,
> > cc_entry->context_cache_gen,
> > @@ -1822,7 +1832,11 @@ static bool vtd_do_iommu_translate(VTDAddressSpace
> > *vtd_as, PCIBus *bus,
> >
> > ret_fr = vtd_iova_to_slpte(s, &ce, addr, is_write, &slpte, &level,
> > &reads, &writes, s->aw_bits);
> > - VTD_PE_GET_FPD_ERR(ret_fr, is_fpd_set, s, source_id, addr, is_write);
> > + if (ret_fr) {
> > + vtd_report_qualify_fault(s, -ret_fr, is_fpd_set, source_id,
> > + addr, is_write);
> > + goto error;
> > + }
> >
> > page_mask = vtd_slpt_level_page_mask(level);
> > access_flags = IOMMU_ACCESS_FLAG(reads, writes);
>
> --
> Regards,
> Yi Liu
>
- [PATCH V4 0/4] PASID support for Intel IOMMU, Jason Wang, 2022/10/27
- [PATCH V4 1/4] intel-iommu: don't warn guest errors when getting rid2pasid entry, Jason Wang, 2022/10/27
- [PATCH V4 2/4] intel-iommu: drop VTDBus, Jason Wang, 2022/10/27
- [PATCH V4 3/4] intel-iommu: convert VTD_PE_GET_FPD_ERR() to be a function, Jason Wang, 2022/10/27
- [PATCH V4 4/4] intel-iommu: PASID support, Jason Wang, 2022/10/27
- Re: [PATCH V4 0/4] PASID support for Intel IOMMU, Peter Xu, 2022/10/27