Skip to content

Commit 3d0d0d9

Browse files
committed
Merge tag 'kvm-s390-next-4.20-2' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux into HEAD
KVM: s390/vfio-ap: Fixes and enhancements for vfio-ap - add tracing - fix a locking bug - make local functions and data static
2 parents 7dd2157 + ed3054a commit 3d0d0d9

File tree

4 files changed

+70
-48
lines changed

4 files changed

+70
-48
lines changed

arch/s390/include/asm/kvm_host.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,8 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
865865
struct kvm_async_pf *work);
866866

867867
void kvm_arch_crypto_clear_masks(struct kvm *kvm);
868+
void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm,
869+
unsigned long *aqm, unsigned long *adm);
868870

869871
extern int sie64a(struct kvm_s390_sie_block *, u64 *);
870872
extern char sie_exit;

arch/s390/kvm/kvm-s390.c

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -859,34 +859,42 @@ static int kvm_s390_vm_set_crypto(struct kvm *kvm, struct kvm_device_attr *attr)
859859
mutex_lock(&kvm->lock);
860860
switch (attr->attr) {
861861
case KVM_S390_VM_CRYPTO_ENABLE_AES_KW:
862-
if (!test_kvm_facility(kvm, 76))
862+
if (!test_kvm_facility(kvm, 76)) {
863+
mutex_unlock(&kvm->lock);
863864
return -EINVAL;
865+
}
864866
get_random_bytes(
865867
kvm->arch.crypto.crycb->aes_wrapping_key_mask,
866868
sizeof(kvm->arch.crypto.crycb->aes_wrapping_key_mask));
867869
kvm->arch.crypto.aes_kw = 1;
868870
VM_EVENT(kvm, 3, "%s", "ENABLE: AES keywrapping support");
869871
break;
870872
case KVM_S390_VM_CRYPTO_ENABLE_DEA_KW:
871-
if (!test_kvm_facility(kvm, 76))
873+
if (!test_kvm_facility(kvm, 76)) {
874+
mutex_unlock(&kvm->lock);
872875
return -EINVAL;
876+
}
873877
get_random_bytes(
874878
kvm->arch.crypto.crycb->dea_wrapping_key_mask,
875879
sizeof(kvm->arch.crypto.crycb->dea_wrapping_key_mask));
876880
kvm->arch.crypto.dea_kw = 1;
877881
VM_EVENT(kvm, 3, "%s", "ENABLE: DEA keywrapping support");
878882
break;
879883
case KVM_S390_VM_CRYPTO_DISABLE_AES_KW:
880-
if (!test_kvm_facility(kvm, 76))
884+
if (!test_kvm_facility(kvm, 76)) {
885+
mutex_unlock(&kvm->lock);
881886
return -EINVAL;
887+
}
882888
kvm->arch.crypto.aes_kw = 0;
883889
memset(kvm->arch.crypto.crycb->aes_wrapping_key_mask, 0,
884890
sizeof(kvm->arch.crypto.crycb->aes_wrapping_key_mask));
885891
VM_EVENT(kvm, 3, "%s", "DISABLE: AES keywrapping support");
886892
break;
887893
case KVM_S390_VM_CRYPTO_DISABLE_DEA_KW:
888-
if (!test_kvm_facility(kvm, 76))
894+
if (!test_kvm_facility(kvm, 76)) {
895+
mutex_unlock(&kvm->lock);
889896
return -EINVAL;
897+
}
890898
kvm->arch.crypto.dea_kw = 0;
891899
memset(kvm->arch.crypto.crycb->dea_wrapping_key_mask, 0,
892900
sizeof(kvm->arch.crypto.crycb->dea_wrapping_key_mask));
@@ -2056,6 +2064,46 @@ static void kvm_s390_set_crycb_format(struct kvm *kvm)
20562064
kvm->arch.crypto.crycbd |= CRYCB_FORMAT1;
20572065
}
20582066

2067+
void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm,
2068+
unsigned long *aqm, unsigned long *adm)
2069+
{
2070+
struct kvm_s390_crypto_cb *crycb = kvm->arch.crypto.crycb;
2071+
2072+
mutex_lock(&kvm->lock);
2073+
kvm_s390_vcpu_block_all(kvm);
2074+
2075+
switch (kvm->arch.crypto.crycbd & CRYCB_FORMAT_MASK) {
2076+
case CRYCB_FORMAT2: /* APCB1 use 256 bits */
2077+
memcpy(crycb->apcb1.apm, apm, 32);
2078+
VM_EVENT(kvm, 3, "SET CRYCB: apm %016lx %016lx %016lx %016lx",
2079+
apm[0], apm[1], apm[2], apm[3]);
2080+
memcpy(crycb->apcb1.aqm, aqm, 32);
2081+
VM_EVENT(kvm, 3, "SET CRYCB: aqm %016lx %016lx %016lx %016lx",
2082+
aqm[0], aqm[1], aqm[2], aqm[3]);
2083+
memcpy(crycb->apcb1.adm, adm, 32);
2084+
VM_EVENT(kvm, 3, "SET CRYCB: adm %016lx %016lx %016lx %016lx",
2085+
adm[0], adm[1], adm[2], adm[3]);
2086+
break;
2087+
case CRYCB_FORMAT1:
2088+
case CRYCB_FORMAT0: /* Fall through both use APCB0 */
2089+
memcpy(crycb->apcb0.apm, apm, 8);
2090+
memcpy(crycb->apcb0.aqm, aqm, 2);
2091+
memcpy(crycb->apcb0.adm, adm, 2);
2092+
VM_EVENT(kvm, 3, "SET CRYCB: apm %016lx aqm %04x adm %04x",
2093+
apm[0], *((unsigned short *)aqm),
2094+
*((unsigned short *)adm));
2095+
break;
2096+
default: /* Can not happen */
2097+
break;
2098+
}
2099+
2100+
/* recreate the shadow crycb for each vcpu */
2101+
kvm_s390_sync_request_broadcast(kvm, KVM_REQ_VSIE_RESTART);
2102+
kvm_s390_vcpu_unblock_all(kvm);
2103+
mutex_unlock(&kvm->lock);
2104+
}
2105+
EXPORT_SYMBOL_GPL(kvm_arch_crypto_set_masks);
2106+
20592107
void kvm_arch_crypto_clear_masks(struct kvm *kvm)
20602108
{
20612109
mutex_lock(&kvm->lock);
@@ -2066,6 +2114,7 @@ void kvm_arch_crypto_clear_masks(struct kvm *kvm)
20662114
memset(&kvm->arch.crypto.crycb->apcb1, 0,
20672115
sizeof(kvm->arch.crypto.crycb->apcb1));
20682116

2117+
VM_EVENT(kvm, 3, "%s", "CLR CRYCB:");
20692118
/* recreate the shadow crycb for each vcpu */
20702119
kvm_s390_sync_request_broadcast(kvm, KVM_REQ_VSIE_RESTART);
20712120
kvm_s390_vcpu_unblock_all(kvm);

drivers/s390/crypto/vfio_ap_drv.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ static void vfio_ap_matrix_dev_destroy(void)
112112
root_device_unregister(matrix_dev->device.parent);
113113
}
114114

115-
int __init vfio_ap_init(void)
115+
static int __init vfio_ap_init(void)
116116
{
117117
int ret;
118118

@@ -146,7 +146,7 @@ int __init vfio_ap_init(void)
146146
return 0;
147147
}
148148

149-
void __exit vfio_ap_exit(void)
149+
static void __exit vfio_ap_exit(void)
150150
{
151151
vfio_ap_mdev_unregister();
152152
ap_driver_unregister(&vfio_ap_drv);

drivers/s390/crypto/vfio_ap_ops.c

Lines changed: 13 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ static ssize_t name_show(struct kobject *kobj, struct device *dev, char *buf)
7777
return sprintf(buf, "%s\n", VFIO_AP_MDEV_NAME_HWVIRT);
7878
}
7979

80-
MDEV_TYPE_ATTR_RO(name);
80+
static MDEV_TYPE_ATTR_RO(name);
8181

8282
static ssize_t available_instances_show(struct kobject *kobj,
8383
struct device *dev, char *buf)
@@ -86,15 +86,15 @@ static ssize_t available_instances_show(struct kobject *kobj,
8686
atomic_read(&matrix_dev->available_instances));
8787
}
8888

89-
MDEV_TYPE_ATTR_RO(available_instances);
89+
static MDEV_TYPE_ATTR_RO(available_instances);
9090

9191
static ssize_t device_api_show(struct kobject *kobj, struct device *dev,
9292
char *buf)
9393
{
9494
return sprintf(buf, "%s\n", VFIO_DEVICE_API_AP_STRING);
9595
}
9696

97-
MDEV_TYPE_ATTR_RO(device_api);
97+
static MDEV_TYPE_ATTR_RO(device_api);
9898

9999
static struct attribute *vfio_ap_mdev_type_attrs[] = {
100100
&mdev_type_attr_name.attr,
@@ -395,7 +395,7 @@ static ssize_t unassign_adapter_store(struct device *dev,
395395

396396
return count;
397397
}
398-
DEVICE_ATTR_WO(unassign_adapter);
398+
static DEVICE_ATTR_WO(unassign_adapter);
399399

400400
static int
401401
vfio_ap_mdev_verify_queues_reserved_for_apqi(struct ap_matrix_mdev *matrix_mdev,
@@ -491,7 +491,7 @@ static ssize_t assign_domain_store(struct device *dev,
491491

492492
return ret;
493493
}
494-
DEVICE_ATTR_WO(assign_domain);
494+
static DEVICE_ATTR_WO(assign_domain);
495495

496496

497497
/**
@@ -537,7 +537,7 @@ static ssize_t unassign_domain_store(struct device *dev,
537537

538538
return count;
539539
}
540-
DEVICE_ATTR_WO(unassign_domain);
540+
static DEVICE_ATTR_WO(unassign_domain);
541541

542542
/**
543543
* assign_control_domain_store
@@ -586,7 +586,7 @@ static ssize_t assign_control_domain_store(struct device *dev,
586586

587587
return count;
588588
}
589-
DEVICE_ATTR_WO(assign_control_domain);
589+
static DEVICE_ATTR_WO(assign_control_domain);
590590

591591
/**
592592
* unassign_control_domain_store
@@ -630,7 +630,7 @@ static ssize_t unassign_control_domain_store(struct device *dev,
630630

631631
return count;
632632
}
633-
DEVICE_ATTR_WO(unassign_control_domain);
633+
static DEVICE_ATTR_WO(unassign_control_domain);
634634

635635
static ssize_t control_domains_show(struct device *dev,
636636
struct device_attribute *dev_attr,
@@ -654,7 +654,7 @@ static ssize_t control_domains_show(struct device *dev,
654654

655655
return nchars;
656656
}
657-
DEVICE_ATTR_RO(control_domains);
657+
static DEVICE_ATTR_RO(control_domains);
658658

659659
static ssize_t matrix_show(struct device *dev, struct device_attribute *attr,
660660
char *buf)
@@ -704,7 +704,7 @@ static ssize_t matrix_show(struct device *dev, struct device_attribute *attr,
704704

705705
return nchars;
706706
}
707-
DEVICE_ATTR_RO(matrix);
707+
static DEVICE_ATTR_RO(matrix);
708708

709709
static struct attribute *vfio_ap_mdev_attrs[] = {
710710
&dev_attr_assign_adapter.attr,
@@ -727,37 +727,6 @@ static const struct attribute_group *vfio_ap_mdev_attr_groups[] = {
727727
NULL
728728
};
729729

730-
static void vfio_ap_mdev_copy_masks(struct ap_matrix_mdev *matrix_mdev)
731-
{
732-
int nbytes;
733-
unsigned long *apm, *aqm, *adm;
734-
struct kvm_s390_crypto_cb *crycb = matrix_mdev->kvm->arch.crypto.crycb;
735-
736-
switch (matrix_mdev->kvm->arch.crypto.crycbd & CRYCB_FORMAT_MASK) {
737-
case CRYCB_FORMAT2:
738-
apm = (unsigned long *)crycb->apcb1.apm;
739-
aqm = (unsigned long *)crycb->apcb1.aqm;
740-
adm = (unsigned long *)crycb->apcb1.adm;
741-
break;
742-
case CRYCB_FORMAT1:
743-
case CRYCB_FORMAT0:
744-
apm = (unsigned long *)crycb->apcb0.apm;
745-
aqm = (unsigned long *)crycb->apcb0.aqm;
746-
adm = (unsigned long *)crycb->apcb0.adm;
747-
break;
748-
default:
749-
/* cannot happen */
750-
return;
751-
}
752-
753-
nbytes = DIV_ROUND_UP(matrix_mdev->matrix.apm_max + 1, BITS_PER_BYTE);
754-
memcpy(apm, matrix_mdev->matrix.apm, nbytes);
755-
nbytes = DIV_ROUND_UP(matrix_mdev->matrix.aqm_max + 1, BITS_PER_BYTE);
756-
memcpy(aqm, matrix_mdev->matrix.aqm, nbytes);
757-
nbytes = DIV_ROUND_UP(matrix_mdev->matrix.adm_max + 1, BITS_PER_BYTE);
758-
memcpy(adm, matrix_mdev->matrix.adm, nbytes);
759-
}
760-
761730
/**
762731
* vfio_ap_mdev_set_kvm
763732
*
@@ -814,7 +783,9 @@ static int vfio_ap_mdev_group_notifier(struct notifier_block *nb,
814783
if (!matrix_mdev->kvm->arch.crypto.crycbd)
815784
return NOTIFY_DONE;
816785

817-
vfio_ap_mdev_copy_masks(matrix_mdev);
786+
kvm_arch_crypto_set_masks(matrix_mdev->kvm, matrix_mdev->matrix.apm,
787+
matrix_mdev->matrix.aqm,
788+
matrix_mdev->matrix.adm);
818789

819790
return NOTIFY_OK;
820791
}

0 commit comments

Comments
 (0)