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 客戶機的調解裝置狀態的調解裝置。 必須持有此鎖
當 vfio_ap 裝置驅動程式使用它來插入/拔出傳遞到 KVM 客戶機的 AP 裝置時,控制對 KVM 指標 (matrix_mdev->kvm) 的訪問。
將 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 函式時,必須以讀取模式持有該鎖。