lkml.org 
[lkml]   [2022]   [Apr]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v19 04/20] s390/vfio-ap: introduce shadow APCB
    Date
    The APCB is a field within the CRYCB that provides the AP configuration
    to a KVM guest. Let's introduce a shadow copy of the KVM guest's APCB and
    maintain it for the lifespan of the guest.

    The shadow APCB serves the following purposes:

    1. The shadow APCB can be maintained even when the mediated device is not
    currently in use by a KVM guest. Since the mediated device's AP
    configuration is filtered to ensure that no AP queues are passed through
    to the KVM guest that are not bound to the vfio_ap device driver or
    available to the host, the mediated device's AP configuration may differ
    from the guest's. Having a shadow of a guest's APCB allows us to provide
    a sysfs interface to view the guest's APCB even if the mediated device
    is not currently passed through to a KVM guest. This can aid in
    problem determination when the guest is unexpectedly missing AP
    resources.

    2. If filtering was done in-place for the real APCB, the guest could pick
    up a transient state. Doing the filtering on a shadow and transferring
    the AP configuration to the real APCB after the guest is started or when
    AP resources are assigned to or unassigned from the mediated device, or
    when the host configuration changes, the guest's AP configuration will
    never be in a transient state.

    Signed-off-by: Tony Krowiak <akrowiak@linux.ibm.com>
    Reviewed-by: Halil Pasic <pasic@linux.ibm.com>
    ---
    drivers/s390/crypto/vfio_ap_ops.c | 10 ++++++----
    drivers/s390/crypto/vfio_ap_private.h | 2 ++
    2 files changed, 8 insertions(+), 4 deletions(-)

    diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c
    index 9df7ceb50ed1..9c4a3ad5369a 100644
    --- a/drivers/s390/crypto/vfio_ap_ops.c
    +++ b/drivers/s390/crypto/vfio_ap_ops.c
    @@ -463,6 +463,7 @@ static int vfio_ap_mdev_probe(struct mdev_device *mdev)
    matrix_mdev->mdev = mdev;
    vfio_ap_matrix_init(&matrix_dev->info, &matrix_mdev->matrix);
    matrix_mdev->pqap_hook = handle_pqap;
    + vfio_ap_matrix_init(&matrix_dev->info, &matrix_mdev->shadow_apcb);
    hash_init(matrix_mdev->qtable.queues);
    mdev_set_drvdata(mdev, matrix_mdev);
    mutex_lock(&matrix_dev->lock);
    @@ -1305,10 +1306,11 @@ static int vfio_ap_mdev_set_kvm(struct ap_matrix_mdev *matrix_mdev,

    kvm_get_kvm(kvm);
    matrix_mdev->kvm = kvm;
    - kvm_arch_crypto_set_masks(kvm,
    - matrix_mdev->matrix.apm,
    - matrix_mdev->matrix.aqm,
    - matrix_mdev->matrix.adm);
    + memcpy(&matrix_mdev->shadow_apcb, &matrix_mdev->matrix,
    + sizeof(struct ap_matrix));
    + kvm_arch_crypto_set_masks(kvm, matrix_mdev->shadow_apcb.apm,
    + matrix_mdev->shadow_apcb.aqm,
    + matrix_mdev->shadow_apcb.adm);

    mutex_unlock(&kvm->lock);
    mutex_unlock(&matrix_dev->lock);
    diff --git a/drivers/s390/crypto/vfio_ap_private.h b/drivers/s390/crypto/vfio_ap_private.h
    index aea6a8b854b3..fa11a7e91e24 100644
    --- a/drivers/s390/crypto/vfio_ap_private.h
    +++ b/drivers/s390/crypto/vfio_ap_private.h
    @@ -91,6 +91,7 @@ struct ap_queue_table {
    * @node: allows the ap_matrix_mdev struct to be added to a list
    * @matrix: the adapters, usage domains and control domains assigned to the
    * mediated matrix device.
    + * @shadow_apcb: the shadow copy of the APCB field of the KVM guest's CRYCB
    * @group_notifier: notifier block used for specifying callback function for
    * handling the VFIO_GROUP_NOTIFY_SET_KVM event
    * @iommu_notifier: notifier block used for specifying callback function for
    @@ -105,6 +106,7 @@ struct ap_matrix_mdev {
    struct vfio_device vdev;
    struct list_head node;
    struct ap_matrix matrix;
    + struct ap_matrix shadow_apcb;
    struct notifier_block group_notifier;
    struct notifier_block iommu_notifier;
    struct kvm *kvm;
    --
    2.31.1
    \
     
     \ /
      Last update: 2022-04-05 00:53    [W:4.185 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site