lkml.org 
[lkml]   [2024]   [Jan]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Subject[PATCH v11 0/5] fix vt-d hard lockup when hotplug ATS capable device
    Date
    This patchset is used to fix vt-d hard lockup reported when surprise
    unplug ATS capable endpoint device connects to system via PCIe switch
    as following topology.

    +-[0000:15]-+-00.0 Intel Corporation Ice Lake Memory Map/VT-d
    | +-00.1 Intel Corporation Ice Lake Mesh 2 PCIe
    | +-00.2 Intel Corporation Ice Lake RAS
    | +-00.4 Intel Corporation Device 0b23
    | \-01.0-[16-1b]----00.0-[17-1b]--+-00.0-[18]----00.0
    NVIDIA Corporation Device 2324
    | +-01.0-[19]----00.0
    Mellanox Technologies MT2910 Family [ConnectX-7]

    User brought endpoint device 19:00.0's link down by flapping it's hotplug
    capable slot 17:01.0 link control register, as sequence DLLSC response,
    pciehp_ist() will unload device driver and power it off, durning device
    driver is unloading an iommu device-TLB invalidation (Intel VT-d spec, or
    'ATS Invalidation' in PCIe spec) request issued to that link down device,
    thus a long time completion/timeout waiting in interrupt context causes
    continuous hard lockup warnning and system hang.

    Other detail, see every patch commit log.

    patch [1&2] were tested by yehaorong@bytedance.com on stable v6.7-rc4.
    patch [1-5] passed compiling on stable v6.8rc1.

    change log:
    v11:
    - update per latest comment and suggestion from Baolu and YiLiu.
    - split refactoring patch into two patches, [3/5] for simplify parameters
    and [4/5] for pdev parameter passing.
    - re-order patches.
    - fold target device presence check into qi_check_fault().
    - combine patch[2][5] in v10 into one patch[5].
    - some commit description correctness.
    - add fixes tag to patch[2/5].
    - rebased on 6.8rc1
    v10:
    - refactor qi_submit_sync() and its callers to get pci_dev instance, as
    Kevin pointed out add target_flush_dev to iommu is not right.
    v9:
    - unify all spelling of ATS Invalidation adhere to PCIe spec per Bjorn's
    suggestion.
    v8:
    - add a patch to break the loop for timeout device-TLB invalidation, as
    Bjorn said there is possibility device just no response but not gone.
    v7:
    - reorder patches and revise commit log per Bjorn's guide.
    - other code and commit log revise per Lukas' suggestion.
    - rebased to stable v6.7-rc6.
    v6:
    - add two patches to break out device-TLB invalidation if device is gone.
    v5:
    - add a patch try to fix the rare case (surprise remove a device in
    safe removal process). not work because surprise removal handling can't
    re-enter when another safe removal is in process.
    v4:
    - move the PCI device state checking after ATS per Baolu's suggestion.
    v3:
    - fix commit description typo.
    v2:
    - revise commit[1] description part according to Lukas' suggestion.
    - revise commit[2] description to clarify the issue's impact.
    v1:
    - https://lore.kernel.org/lkml/20231213034637.2603013-1-haifeng.zhao@
    linux.intel.com/T/


    Thanks,
    Ethan


    Ethan Zhao (5):
    PCI: make pci_dev_is_disconnected() helper public for other drivers
    iommu/vt-d: don't issue ATS Invalidation request when device is
    disconnected
    iommu/vt-d: simplify parameters of qi_submit_sync() ATS invalidation
    callers
    iommu/vt-d: pass pdev parameter for qi_check_fault() and refactor
    callers
    iommu/vt-d: improve ITE fault handling if target device isn't present

    drivers/iommu/intel/dmar.c | 71 +++++++++++++++++++++++------
    drivers/iommu/intel/iommu.c | 26 +++--------
    drivers/iommu/intel/iommu.h | 20 ++++----
    drivers/iommu/intel/irq_remapping.c | 2 +-
    drivers/iommu/intel/nested.c | 9 +---
    drivers/iommu/intel/pasid.c | 12 ++---
    drivers/iommu/intel/svm.c | 13 +++---
    drivers/pci/pci.h | 5 --
    include/linux/pci.h | 5 ++
    9 files changed, 93 insertions(+), 70 deletions(-)

    --
    2.31.1


    \
     
     \ /
      Last update: 2024-01-26 02:40    [W:3.267 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site