[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] VT-d: improve fault info logging



Jan Beulich wrote on 2015-03-26:
> I got repeatedly annoyed by there not getting anything logged by 
> default on VT-d faults (and hence having to tell people to add extra 
> command line options), and hence I think it is time to redo this code:
> Log basic fault information at guest-warning level (rate limited by 
> default), and show the page walk in verbose rather than only in debug 
> mode. Break up multi-line message so that each gets a proper log level 
> attached, at once splitting out the common part. Also don't log 
> "unknown" faults as interrupt-remapping ones.
> 
> As a minor cleanup fix the type of the involved "fault_type" variables.
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>

Acked-by: Yang Zhang <yang.z.zhang@xxxxxxxxx>

> 
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -800,7 +800,8 @@ static const char *intr_remap_fault_reas
>      "Blocked an interrupt request due to source-id verification 
> failure",  };
> 
> -static const char *iommu_get_fault_reason(u8 fault_reason, int
> *fault_type) +static const char *iommu_get_fault_reason(u8 
> fault_reason,
> +                                          enum faulttype *fault_type)
>  {
>      if ( fault_reason >= 0x20 && ( fault_reason < 0x20 +
>                  ARRAY_SIZE(intr_remap_fault_reasons)) ) @@ -823,35
> +824,48 @@ static const char *iommu_get_fault_reaso  static int
> iommu_page_fault_do_one(struct iommu *iommu, int type,
>                                     u8 fault_reason, u16 source_id,
> u64 addr)  {
> -    const char *reason;
> -    int fault_type;
> +    const char *reason, *kind;
> +    enum faulttype fault_type;
>      u16 seg = iommu->intel->drhd->segment;
> -    reason = iommu_get_fault_reason(fault_reason, &fault_type);
> 
> -    if ( fault_type == DMA_REMAP )
> +    reason = iommu_get_fault_reason(fault_reason, &fault_type);
> +    switch ( fault_type )
>      {
> -        INTEL_IOMMU_DEBUG(
> -                "DMAR:[%s] Request device [%04x:%02x:%02x.%u] "
> -                "fault addr %"PRIx64", iommu reg = %p\n"
> -                "DMAR:[fault reason %02xh] %s\n",
> -                (type ? "DMA Read" : "DMA Write"),
> -                seg, (source_id >> 8), PCI_SLOT(source_id & 0xFF),
> -                PCI_FUNC(source_id & 0xFF), addr, iommu->reg,
> -                fault_reason, reason);
> -     if (iommu_debug)
> -            print_vtd_entries(iommu, (source_id >> 8),
> -                          (source_id & 0xff), (addr >> PAGE_SHIFT));
> +    case DMA_REMAP:
> +        printk(XENLOG_G_WARNING VTDPREFIX
> +               "DMAR:[%s] Request device [%04x:%02x:%02x.%u] "
> +               "fault addr %"PRIx64", iommu reg = %p\n",
> +               (type ? "DMA Read" : "DMA Write"),
> +               seg, PCI_BUS(source_id), PCI_SLOT(source_id),
> +               PCI_FUNC(source_id), addr, iommu->reg);
> +        kind = "DMAR";
> +        break;
> +    case INTR_REMAP:
> +        printk(XENLOG_G_WARNING VTDPREFIX
> +               "INTR-REMAP: Request device [%04x:%02x:%02x.%u] "
> +               "fault index %"PRIx64", iommu reg = %p\n",
> +               seg, PCI_BUS(source_id), PCI_SLOT(source_id),
> +               PCI_FUNC(source_id), addr >> 48, iommu->reg);
> +        kind = "INTR-REMAP";
> +        break;
> +    default:
> +        printk(XENLOG_G_WARNING VTDPREFIX
> +               "UNKNOWN: Request device [%04x:%02x:%02x.%u] "
> +               "fault addr %"PRIx64", iommu reg = %p\n",
> +               seg, PCI_BUS(source_id), PCI_SLOT(source_id),
> +               PCI_FUNC(source_id), addr, iommu->reg);
> +        kind = "UNKNOWN";
> +        break;
>      }
> -    else
> -        INTEL_IOMMU_DEBUG(
> -                "INTR-REMAP: Request device [%04x:%02x:%02x.%u] "
> -                "fault index %"PRIx64", iommu reg = %p\n"
> -                "INTR-REMAP:[fault reason %02xh] %s\n",
> -                seg, (source_id >> 8), PCI_SLOT(source_id & 0xFF),
> -                PCI_FUNC(source_id & 0xFF), addr >> 48, iommu->reg,
> -                fault_reason, reason);
> -    return 0;
> 
> +    gprintk(XENLOG_G_WARNING VTDPREFIX, "%s: reason %02x - %s\n", +    
>        kind, fault_reason, reason); + +    if ( iommu_verbose &&
> fault_type == DMA_REMAP ) +        print_vtd_entries(iommu,
> PCI_BUS(source_id), PCI_DEVFN2(source_id), +                         
> addr >> PAGE_SHIFT); + +    return 0;
>  }
>  
>  static void iommu_fault_status(u32 fault_status)


Best regards,
Yang



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.