VFIO AP 鎖概述

本文件描述了與 vfio_ap 裝置驅動程式的安全操作相關的鎖。 在本文件中,以下變數將用於表示此處描述的結構的例項

struct ap_matrix_dev *matrix_dev;
struct ap_matrix_mdev *matrix_mdev;
struct kvm *kvm;

矩陣裝置鎖 (drivers/s390/crypto/vfio_ap_private.h)

struct ap_matrix_dev {
      ...
      struct list_head mdev_list;
      struct mutex mdevs_lock;
      ...
}

矩陣裝置鎖 (matrix_dev->mdevs_lock) 被實現為包含在 ap_matrix_dev 結構體的單個物件中的全域性互斥鎖。 此鎖控制對每個 matrix_mdev(matrix_dev->mdev_list)中包含的所有欄位的訪問。 在從表示 vfio_ap 裝置驅動程式的調解裝置之一的 matrix_mdev 例項中包含的欄位讀取、寫入或使用資料時,必須持有此鎖。

KVM 鎖 (include/linux/kvm_host.h)

struct kvm {
      ...
      struct mutex lock;
      ...
}

KVM 鎖 (kvm->lock) 控制對 KVM 客戶機的狀態資料的訪問。 當一個或多個 AP 介面卡、域或控制域正在插入或拔出到客戶機時,vfio_ap 裝置驅動程式必須持有此鎖。

KVM 指標儲存在 matrix_mdev 例項 (matrix_mdev->kvm = kvm) 中,該例項包含已附加到 KVM 客戶機的調解裝置的狀態。

訪客鎖 (drivers/s390/crypto/vfio_ap_private.h)

struct ap_matrix_dev {
      ...
      struct list_head mdev_list;
      struct mutex guests_lock;
      ...
}

訪客鎖 (matrix_dev->guests_lock) 控制對 matrix_mdev 例項 (matrix_dev->mdev_list) 的訪問,這些例項表示儲存已附加到 KVM 客戶機的調解裝置狀態的調解裝置。 必須持有此鎖

  1. 當 vfio_ap 裝置驅動程式使用它來插入/拔出傳遞到 KVM 客戶機的 AP 裝置時,控制對 KVM 指標 (matrix_mdev->kvm) 的訪問。

  2. 將 matrix_mdev 例項新增到 matrix_dev->mdev_list 或從中刪除。 這是必要的,以確保在瀏覽列表以找到 ap_matrix_mdev 例項以便插入/拔出傳遞到 KVM 客戶機的 AP 裝置時,有正確的鎖定順序。

    例如,當從 vfio_ap 裝置驅動程式中刪除佇列裝置時,如果介面卡傳遞到 KVM 客戶機,則必須將其拔出。 為了確定介面卡是否已傳遞,必須找到佇列分配到的 matrix_mdev 物件。 然後可以使用 KVM 指標 (matrix_mdev->kvm) 來確定調解裝置是否已傳遞 (matrix_mdev->kvm != NULL),如果是,則拔出介面卡。

如果 KVM 指標不用於插入/拔出傳遞到 KVM 客戶機的裝置,則無需獲取訪客鎖來訪問 KVM 指標;但是,在這種情況下,必須持有矩陣裝置鎖 (matrix_dev->mdevs_lock) 才能訪問 KVM 指標,因為它是在矩陣裝置鎖的保護下設定和清除的。 一個典型的例子是處理攔截 PQAP(AQIC) 指令子功能的函式。 此處理程式只需要訪問 KVM 指標即可設定或清除 IRQ 資源,因此只需要持有 matrix_dev->mdevs_lock。

PQAP 鉤子鎖 (arch/s390/include/asm/kvm_host.h)

typedef int (*crypto_hook)(struct kvm_vcpu *vcpu);

struct kvm_s390_crypto {
      ...
      struct rw_semaphore pqap_hook_rwsem;
      crypto_hook *pqap_hook;
      ...
};

PQAP 鉤子鎖是一個 r/w 訊號量,用於控制對處理程式函式指標 (*kvm->arch.crypto.pqap_hook) 的訪問,該函式指標用於在主機攔截 PQAP(AQIC) 指令子功能時呼叫。 當設定 pqap_hook 值時,必須以寫入模式持有該鎖,當呼叫 pqap_hook 函式時,必須以讀取模式持有該鎖。