• Kan Liang's avatar
    iommu/vt-d: Add IOMMU perfmon support · 7232ab8b
    Kan Liang authored
    Implement the IOMMU performance monitor capability, which supports the
    collection of information about key events occurring during operation of
    the remapping hardware, to aid performance tuning and debug.
    
    The IOMMU perfmon support is implemented as part of the IOMMU driver and
    interfaces with the Linux perf subsystem.
    
    The IOMMU PMU has the following unique features compared with the other
    PMUs.
    - Support counting. Not support sampling.
    - Does not support per-thread counting. The scope is system-wide.
    - Support per-counter capability register. The event constraints can be
      enumerated.
    - The available event and event group can also be enumerated.
    - Extra Enhanced Commands are introduced to control the counters.
    
    Add a new variable, struct iommu_pmu *pmu, to in the struct intel_iommu
    to track the PMU related information.
    
    Add iommu_pmu_register() and iommu_pmu_unregister() to register and
    unregister a IOMMU PMU. The register function setup the IOMMU PMU ops
    and invoke the standard perf_pmu_register() interface to register a PMU
    in the perf subsystem. This patch only exposes the functions. The
    following patch will enable them in the IOMMU driver.
    
    The IOMMU PMUs can be found under /sys/bus/event_source/devices/dmar*
    
    The available filters and event format can be found at the format folder
    
     $ ls /sys/bus/event_source/devices/dmar1/format/
     event  event_group  filter_ats  filter_ats_en  filter_page_table
     filter_page_table_en
    
    The supported events can be found at the events folder
    
     $ ls /sys/bus/event_source/devices/dmar1/events/
     ats_blocked        fs_nonleaf_hit           int_cache_hit_posted
     iommu_mem_blocked  iotlb_hit        pasid_cache_lookup  ss_nonleaf_hit
     ctxt_cache_hit     fs_nonleaf_lookup        int_cache_lookup
     iommu_mrds         iotlb_lookup     pg_req_posted    ss_nonleaf_lookup
     ctxt_cache_lookup  int_cache_hit_nonposted  iommu_clocks
     iommu_requests     pasid_cache_hit  pw_occupancy
    
    The command below illustrates filter usage with a simple example.
    
     $ perf stat -e dmar1/iommu_requests,filter_ats_en=0x1,filter_ats=0x1/
       -a sleep 1
    
     Performance counter stats for 'system wide':
    
       368,947      dmar1/iommu_requests,filter_ats_en=0x1,filter_ats=0x1/
    
     1.002592074 seconds time elapsed
    Signed-off-by: default avatarKan Liang <kan.liang@linux.intel.com>
    Link: https://lore.kernel.org/r/20230128200428.1459118-5-kan.liang@linux.intel.comSigned-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
    Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    7232ab8b
perfmon.h 1.62 KB