[PATH,v4,0/3] iommu/vt-d: debugfs: Enhancements to IOMMU debugfs

Message ID 20231011083915.36706-1-Jingqi.liu@intel.com
Headers
Series iommu/vt-d: debugfs: Enhancements to IOMMU debugfs |

Message

Liu, Jingqi Oct. 11, 2023, 8:39 a.m. UTC
  The original debugfs only dumps all IOMMU page tables without pasid
supported. It traverses all devices on the pci bus, then dumps all
page tables based on device domains. This traversal is from software
perspective.

This series dumps page tables whose mappings are created and destroyed
by the iommu_map/unmap() interfaces, by traversing root tables,
context tables, pasid directories and pasid tables from hardware
perspective. It supports dumping a specified page table in legacy mode
or scalable mode with or without a specified pasid.

It adds a debugfs directory per pair of {device, pasid} when attaching
device with pasid, i.e.
/sys/kernel/debug/iommu/intel/<device source id>/<pasid>.
And create a debugfs file in the directory for users to dump the page
table corresponding to {device, pasid}. e.g.
/sys/kernel/debug/iommu/intel/0000:00:02.0/1/domain_translation_struct.
For the default domain without pasid, it creates a debugfs file in the
debugfs device directory for users to dump its page table. e.g.
/sys/kernel/debug/iommu/intel/0000:00:02.0/domain_translation_struct.
Remove the corresponding debugfs directory and file when detaching or
releasing a device.

For legacy mode, according to bus number and DEVFN, traverse the root
table and context table to get the pointer of page table in the
context table entry, then dump the specified page table.

For scalable mode, according to bus number, DEVFN and pasid, traverse
the root table, context table, pasid directory and pasid table to get
the pointer of page table in the pasid table entry, then dump the
specified page table.

Examples are as follows:
1) Dump the page table of device "0000:00:01.0" that only supports
    legacy mode.
    $ sudo cat
    /sys/kernel/debug/iommu/intel/0000:00:01.0/domain_translation_struct

2) Dump the page table of device "0000:00:02.0" with PASID "1" that
   supports scalable mode.
   $ sudo cat
   /sys/kernel/debug/iommu/intel/0000:00:0a.0/1/domain_translation_struct

Change log:

v4:
 - Save the debugfs dentry in 'device_domain_info' and 'dev_pasid_info'
   structures to simplify debugfs operations per Baolu's review.
 - Use 'dev_pasid_info' to get the infomation of {device, pasid} pair
   when dumping the page table per Baolu's review.

v3: https://lore.kernel.org/linux-iommu/20230927151536.67319-1-Jingqi.liu@intel.com
 - Add domain as a parameter for creating debugfs pasid directory
   per Baolu's review.
 - dput() the dentry after debugfs_lookup() per Baolu's review.
 - debugfs device and pasid directory are managed separately per
   Baolu's review.

v2: https://lore.kernel.org/linux-iommu/20230922151636.77139-1-Jingqi.liu@intel.com
 - Add a debugfs directory per {dev, pasid} as suggested by Kevin.
 - Create the debugfs directory when attaching device as suggested by Baolu.
 - Only dump the page tables whose mappings are created and destroyed
   by the iommu_map/unmap() interfaces per Baolu's review.
 - Rename the helpers for creating/removing debugfs directory/file and
   merge patch 2,3,4,5 to one patch per Baolu's review.

v1: https://lore.kernel.org/linux-iommu/20230625150442.42197-1-Jingqi.liu@intel.com

Jingqi Liu (3):
  iommu/vt-d: debugfs: Dump entry pointing to huge page
  iommu/vt-d: debugfs: Create/remove debugfs file per {device, pasid}
  iommu/vt-d: debugfs: Support dumping a specified page table

 drivers/iommu/intel/debugfs.c | 300 ++++++++++++++++++++++++++++------
 drivers/iommu/intel/iommu.c   |  11 ++
 drivers/iommu/intel/iommu.h   |  18 ++
 3 files changed, 283 insertions(+), 46 deletions(-)
  

Comments

Baolu Lu Oct. 13, 2023, 4:23 a.m. UTC | #1
On 10/11/23 4:39 PM, Jingqi Liu wrote:
> The original debugfs only dumps all IOMMU page tables without pasid 
> supported. It traverses all devices on the pci bus, then dumps all page 
> tables based on device domains. This traversal is from software 
> perspective. This series dumps page tables whose mappings are created 
> and destroyed by the iommu_map/unmap() interfaces, by traversing root 
> tables, context tables, pasid directories and pasid tables from hardware 
> perspective. It supports dumping a specified page table in legacy mode 
> or scalable mode with or without a specified pasid. It adds a debugfs 
> directory per pair of {device, pasid} when attaching device with pasid, 
> i.e. /sys/kernel/debug/iommu/intel/<device source id>/<pasid>. And 
> create a debugfs file in the directory for users to dump the page table 
> corresponding to {device, pasid}. e.g. 
> /sys/kernel/debug/iommu/intel/0000:00:02.0/1/domain_translation_struct. 
> For the default domain without pasid, it creates a debugfs file in the 
> debugfs device directory for users to dump its page table. e.g. 
> /sys/kernel/debug/iommu/intel/0000:00:02.0/domain_translation_struct. 
> Remove the corresponding debugfs directory and file when detaching or 
> releasing a device. For legacy mode, according to bus number and DEVFN, 
> traverse the root table and context table to get the pointer of page 
> table in the context table entry, then dump the specified page table. 
> For scalable mode, according to bus number, DEVFN and pasid, traverse 
> the root table, context table, pasid directory and pasid table to get 
> the pointer of page table in the pasid table entry, then dump the 
> specified page table. Examples are as follows: 1) Dump the page table of 
> device "0000:00:01.0" that only supports legacy mode. $ sudo cat 
> /sys/kernel/debug/iommu/intel/0000:00:01.0/domain_translation_struct 2) 
> Dump the page table of device "0000:00:02.0" with PASID "1" that 
> supports scalable mode. $ sudo cat 
> /sys/kernel/debug/iommu/intel/0000:00:0a.0/1/domain_translation_struct

This series doesn't apply to v6.6-rc5. Can you please rebase and send a
new version?

Best regards,
baolu