Received: by 10.223.164.221 with SMTP id h29csp1051011wrb; Fri, 13 Oct 2017 10:45:56 -0700 (PDT) X-Google-Smtp-Source: AOwi7QCIjgDT6rvcuhYDNkW5RIBm5UiK18PZcoxUk3iy6iu+jbTh7wJe0ntBFsjuZfEu+JtDqlG4 X-Received: by 10.98.88.198 with SMTP id m189mr2056439pfb.130.1507916756097; Fri, 13 Oct 2017 10:45:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1507916756; cv=none; d=google.com; s=arc-20160816; b=R4UlZMkmJOxkkyXb7ODxeSgxpYEsbt1xD8EPx1vwGHfvPFyaGGAQok6R65DX5UfyGd n9i3dPrpDquuez7RzhMtPo2/zvONvR5g75Jh9rYTwdUMlfUQ+bG4ZDd1i56LYwJMfPqP /y+g2ZNVrA37fxhJEmVWs+KxJfA3j+FDn1O8HqiNSB/lhqcUvs9j53zt1TMkSliC2lSk +ZykPrDZHaAc/uecHm/bCkrAELuIa0wJXzHtJcHp7OmWRXTuqUggEgwmWP8+cW1MzA3h x3WP+gwgFCEO9PGWUyL3/5qLJS4xYWTAtfk83kOaVf6cYU22HetOVKFE83sJv+KK8s5g eXhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:references:in-reply-to:date :subject:cc:to:from:arc-authentication-results; bh=W5IlV2soEMJWceP62WS/QUnXsf11vW3oObs2jKQ6UW0=; b=ZyEjiY9R2DhAzJo4VyfEu7hpJCVedp1n1rHywUZ48rAwAOP/K43n3jevJzpj2SbHBN CBIS94ITSZAxPympBxskRWlYzPDjzdT5Um2R/5g5sJBsu/OPijk/SP2FoYWRIyQVAyyp qYTfEPNRx12HXtmstsxhgSihLyp9D1S0iGedwDKirY5VM8EK7lP6vhb6E528R1s3uNlW RXBq8CS6XFLkayYsMJsy+KjgFC9m8o0zZsV5tu7A4ZC+8AkkuLM68W3G52VocXC/r6gZ 1oK+qILj9SfrpW12A4o+79UVcNc61o4E92Zn9EOZT9VsA+OcJL5jz1BRh39+A0WsEwWe zWxQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d8si821955pgt.286.2017.10.13.10.45.41; Fri, 13 Oct 2017 10:45:56 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753194AbdJMRoy (ORCPT + 99 others); Fri, 13 Oct 2017 13:44:54 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:40698 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753024AbdJMRkC (ORCPT ); Fri, 13 Oct 2017 13:40:02 -0400 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id v9DHd0rd105771 for ; Fri, 13 Oct 2017 13:40:01 -0400 Received: from e19.ny.us.ibm.com (e19.ny.us.ibm.com [129.33.205.209]) by mx0a-001b2d01.pphosted.com with ESMTP id 2djykce1du-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Fri, 13 Oct 2017 13:40:01 -0400 Received: from localhost by e19.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 13 Oct 2017 13:40:00 -0400 Received: from b01cxnp22034.gho.pok.ibm.com (9.57.198.24) by e19.ny.us.ibm.com (146.89.104.206) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 13 Oct 2017 13:39:57 -0400 Received: from b01ledav001.gho.pok.ibm.com (b01ledav001.gho.pok.ibm.com [9.57.199.106]) by b01cxnp22034.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v9DHdu6n51642520; Fri, 13 Oct 2017 17:39:56 GMT Received: from b01ledav001.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4BF3528041; Fri, 13 Oct 2017 13:39:49 -0400 (EDT) Received: from localhost.localdomain (unknown [9.85.201.79]) by b01ledav001.gho.pok.ibm.com (Postfix) with ESMTPS id 5C35A28048; Fri, 13 Oct 2017 13:39:48 -0400 (EDT) From: Tony Krowiak To: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: freude@de.ibm.com, schwidefsky@de.ibm.com, heiko.carstens@de.ibm.com, borntraeger@de.ibm.com, cohuck@redhat.com, kwankhede@nvidia.com, bjsdjshi@linux.vnet.ibm.com, pbonzini@redhat.com, alex.williamson@redhat.com, pmorel@linux.vnet.ibm.com, alifm@linux.vnet.ibm.com, mjrosato@linux.vnet.ibm.com, qemu-s390x@nongnu.org, jjherne@linux.vnet.ibm.com, thuth@redhat.com, pasic@linux.vnet.ibm.com, Tony Krowiak Subject: [RFC 06/19] s390/zcrypt: register matrix device with VFIO mediated device framework Date: Fri, 13 Oct 2017 13:38:51 -0400 X-Mailer: git-send-email 1.7.1 In-Reply-To: <1507916344-3896-1-git-send-email-akrowiak@linux.vnet.ibm.com> References: <1507916344-3896-1-git-send-email-akrowiak@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 17101317-0056-0000-0000-000003D99116 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00007892; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000236; SDB=6.00930642; UDB=6.00468501; IPR=6.00710908; BA=6.00005636; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00017529; XFM=3.00000015; UTC=2017-10-13 17:40:00 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17101317-0057-0000-0000-000008109476 Message-Id: <1507916344-3896-7-git-send-email-akrowiak@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-10-13_07:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1707230000 definitions=main-1710130244 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Registers the matrix device created by the AP matrix bus with the VFIO mediated device framework. Registering the matrix device will create the sysfs structures needed to create mediated matrix devices that can be configured with a matrix of adapters, usage domains and control domains for a guest machine. Registering the matrix device with the VFIO mediated device framework will create the following sysfs structures: /sys/devices/ap_matrix ... [matrix] ...... [mdev_supported_types] ......... [ap_matrix-passthrough] ............ available_instances ............ create ............ device_api ............ [devices] ............ name To create a mediated device for the AP matrix device, write a UUID to the create file: uuidgen > create A symbolic link to the mediated device's directory will be created in the devices subdirectory named after the generated $uuid: /sys/devices/ap_matrix ... [matrix] ...... [mdev_supported_types] ......... [ap_matrix-passthrough] ............ [devices] ............... [$uuid] Signed-off-by: Tony Krowiak --- MAINTAINERS | 1 + drivers/s390/crypto/Makefile | 2 +- drivers/s390/crypto/ap_matrix_bus.c | 1 + drivers/s390/crypto/ap_matrix_bus.h | 4 + drivers/s390/crypto/vfio_ap_matrix_drv.c | 5 + drivers/s390/crypto/vfio_ap_matrix_ops.c | 172 ++++++++++++++++++++++++++ drivers/s390/crypto/vfio_ap_matrix_private.h | 3 + include/uapi/linux/vfio.h | 1 + 8 files changed, 188 insertions(+), 1 deletions(-) create mode 100644 drivers/s390/crypto/vfio_ap_matrix_ops.c diff --git a/MAINTAINERS b/MAINTAINERS index 115965e..0c8855a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -11720,6 +11720,7 @@ F: drivers/s390/crypto/ap_matrix_bus.h F: drivers/s390/crypto/ap_matrix_bus.c F: drivers/s390/crypto/vfio_ap_matrix_drv.c F: drivers/s390/crypto/vfio_ap_matrix_private.h +F: drivers/s390/crypto/vfio_ap_matrix_ops.c S390 ZFCP DRIVER M: Steffen Maier diff --git a/drivers/s390/crypto/Makefile b/drivers/s390/crypto/Makefile index 1983afa..b2545c8 100644 --- a/drivers/s390/crypto/Makefile +++ b/drivers/s390/crypto/Makefile @@ -16,5 +16,5 @@ pkey-objs := pkey_api.o obj-$(CONFIG_PKEY) += pkey.o # adjunct processor matrix -vfio_ap_matrix-objs := vfio_ap_matrix_drv.o +vfio_ap_matrix-objs := vfio_ap_matrix_drv.o vfio_ap_matrix_ops.o obj-$(CONFIG_VFIO_AP_MATRIX) += vfio_ap_matrix.o diff --git a/drivers/s390/crypto/ap_matrix_bus.c b/drivers/s390/crypto/ap_matrix_bus.c index 66bfa54..418c23b 100644 --- a/drivers/s390/crypto/ap_matrix_bus.c +++ b/drivers/s390/crypto/ap_matrix_bus.c @@ -61,6 +61,7 @@ static int ap_matrix_dev_create(void) matrix->device.bus = &ap_matrix_bus_type; matrix->device.parent = ap_matrix_root_device; matrix->device.release = ap_matrix_dev_release; + INIT_LIST_HEAD(&matrix->queues); ret = device_register(&matrix->device); if (ret) { diff --git a/drivers/s390/crypto/ap_matrix_bus.h b/drivers/s390/crypto/ap_matrix_bus.h index c2aff23..3eccc36 100644 --- a/drivers/s390/crypto/ap_matrix_bus.h +++ b/drivers/s390/crypto/ap_matrix_bus.h @@ -12,8 +12,12 @@ #include +#include "ap_bus.h" + struct ap_matrix { struct device device; + spinlock_t qlock; + struct list_head queues; }; struct ap_matrix *ap_matrix_get_device(void); diff --git a/drivers/s390/crypto/vfio_ap_matrix_drv.c b/drivers/s390/crypto/vfio_ap_matrix_drv.c index 760ed56..664d2f7 100644 --- a/drivers/s390/crypto/vfio_ap_matrix_drv.c +++ b/drivers/s390/crypto/vfio_ap_matrix_drv.c @@ -90,11 +90,16 @@ int __init ap_matrix_init(void) if (ret) return ret; + ret = ap_matrix_mdev_register(vfio_ap_matrix_drv.ap_matrix); + if (ret) + ap_driver_unregister(&vfio_ap_matrix_drv.ap_drv); + return ret; } void __exit ap_matrix_exit(void) { + ap_matrix_mdev_unregister(vfio_ap_matrix_drv.ap_matrix); ap_driver_unregister(&vfio_ap_matrix_drv.ap_drv); } diff --git a/drivers/s390/crypto/vfio_ap_matrix_ops.c b/drivers/s390/crypto/vfio_ap_matrix_ops.c new file mode 100644 index 0000000..7d01f18 --- /dev/null +++ b/drivers/s390/crypto/vfio_ap_matrix_ops.c @@ -0,0 +1,172 @@ +/* + * Adjunct processor matrix VFIO device driver callbacks. + * + * Copyright IBM Corp. 2017 + * Author(s): Tony Krowiak + * + */ +#include +#include +#include +#include +#include +#include +#include + +#include "vfio_ap_matrix_private.h" + +#define AP_MATRIX_MDEV_TYPE_HWVIRT "passthrough" +#define AP_MATRIX_MDEV_NAME_HWVIRT "AP Matrix Passthrough Device" + +#define AP_MATRIX_MAX_AVAILABLE_INSTANCES 255 + +struct ap_matrix_mdev { + struct mdev_device *mdev; + struct list_head node; +}; + +struct ap_matrix *matrix; +struct mutex mdev_devices_lock; +struct list_head mdev_devices; +int available_instances; + +static struct ap_matrix_mdev *ap_matrix_mdev_find_by_uuid(uuid_le uuid) +{ + struct ap_matrix_mdev *matrix_mdev; + + list_for_each_entry(matrix_mdev, &mdev_devices, node) { + if (uuid_le_cmp(mdev_uuid(matrix_mdev->mdev), uuid) == 0) + return matrix_mdev; + } + + return NULL; +} + +static int ap_matrix_mdev_create(struct kobject *kobj, + struct mdev_device *mdev) +{ + struct ap_matrix_mdev *matrix_mdev; + uuid_le uuid; + + if (available_instances == 0) { + pr_err("%s: Only %d mediated devices allowed for %s-%s device", + VFIO_AP_MATRIX_MODULE_NAME, + AP_MATRIX_MAX_AVAILABLE_INSTANCES, + VFIO_AP_MATRIX_MODULE_NAME, + AP_MATRIX_MDEV_TYPE_HWVIRT); + return -EPERM; + } + + uuid = mdev_uuid(mdev); + matrix_mdev = ap_matrix_mdev_find_by_uuid(uuid); + if (matrix_mdev) { + pr_err("%s: Mediated device %pU already exists", + VFIO_AP_MATRIX_MODULE_NAME, uuid.b); + return -EEXIST; + } + + matrix_mdev = kzalloc(sizeof(*matrix_mdev), GFP_KERNEL); + if (!matrix_mdev) + return -ENOMEM; + + mdev_set_drvdata(mdev, matrix_mdev); + mutex_lock(&mdev_devices_lock); + list_add_tail(&matrix_mdev->node, &mdev_devices); + mutex_unlock(&mdev_devices_lock); + + return 0; +} + +static int ap_matrix_mdev_remove(struct mdev_device *mdev) +{ + struct ap_matrix_mdev *matrix_mdev = mdev_get_drvdata(mdev); + uuid_le uuid = mdev_uuid(mdev); + + matrix_mdev = ap_matrix_mdev_find_by_uuid(uuid); + + if (matrix_mdev) { + mutex_lock(&mdev_devices_lock); + list_del(&matrix_mdev->node); + mutex_unlock(&mdev_devices_lock); + mdev_set_drvdata(mdev, NULL); + kfree(matrix_mdev); + available_instances--; + } + + return 0; +} + +static ssize_t name_show(struct kobject *kobj, struct device *dev, char *buf) +{ + return sprintf(buf, "%s\n", AP_MATRIX_MDEV_NAME_HWVIRT); +} + +MDEV_TYPE_ATTR_RO(name); + +static ssize_t available_instances_show(struct kobject *kobj, + struct device *dev, char *buf) +{ + return sprintf(buf, "%d\n", available_instances); +} + +MDEV_TYPE_ATTR_RO(available_instances); + +static ssize_t device_api_show(struct kobject *kobj, struct device *dev, + char *buf) +{ + return sprintf(buf, "%s\n", VFIO_DEVICE_API_AP_MATRIX_STRING); +} + +MDEV_TYPE_ATTR_RO(device_api); + +static struct attribute *ap_matrix_mdev_type_attrs[] = { + &mdev_type_attr_name.attr, + &mdev_type_attr_device_api.attr, + &mdev_type_attr_available_instances.attr, + NULL, +}; + +static struct attribute_group ap_matrix_mdev_hwvirt_type_group = { + .name = AP_MATRIX_MDEV_TYPE_HWVIRT, + .attrs = ap_matrix_mdev_type_attrs, +}; + +static struct attribute_group *ap_matrix_mdev_type_groups[] = { + &ap_matrix_mdev_hwvirt_type_group, + NULL, +}; + +static const struct mdev_parent_ops vfio_ap_matrix_ops = { + .owner = THIS_MODULE, + .supported_type_groups = ap_matrix_mdev_type_groups, + .create = ap_matrix_mdev_create, + .remove = ap_matrix_mdev_remove, +}; + +int ap_matrix_mdev_register(struct ap_matrix *ap_matrix) +{ + int ret; + struct device *dev = &ap_matrix->device; + + ret = mdev_register_device(dev, &vfio_ap_matrix_ops); + if (ret) + return ret; + + matrix = ap_matrix; + mutex_init(&mdev_devices_lock); + INIT_LIST_HEAD(&mdev_devices); + available_instances = AP_MATRIX_MAX_AVAILABLE_INSTANCES; + + return 0; +} + +void ap_matrix_mdev_unregister(struct ap_matrix *ap_matrix) +{ + struct device *dev; + + if (ap_matrix == matrix) { + dev = &matrix->device; + available_instances--; + mdev_unregister_device(dev); + } +} diff --git a/drivers/s390/crypto/vfio_ap_matrix_private.h b/drivers/s390/crypto/vfio_ap_matrix_private.h index 11c5e02..5c82bea 100644 --- a/drivers/s390/crypto/vfio_ap_matrix_private.h +++ b/drivers/s390/crypto/vfio_ap_matrix_private.h @@ -44,4 +44,7 @@ struct vfio_ap_queue { return NULL; } +extern int ap_matrix_mdev_register(struct ap_matrix *ap_matrix); +extern void ap_matrix_mdev_unregister(struct ap_matrix *ap_matrix); + #endif /* _VFIO_AP_PRIVATE_H_ */ diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index ae46105..743456f 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -214,6 +214,7 @@ struct vfio_device_info { #define VFIO_DEVICE_API_PLATFORM_STRING "vfio-platform" #define VFIO_DEVICE_API_AMBA_STRING "vfio-amba" #define VFIO_DEVICE_API_CCW_STRING "vfio-ccw" +#define VFIO_DEVICE_API_AP_MATRIX_STRING "vfio-ap-matrix" /** * VFIO_DEVICE_GET_REGION_INFO - _IOWR(VFIO_TYPE, VFIO_BASE + 8, -- 1.7.1 From 1584157826513164299@xxx Wed Nov 15 18:30:32 +0000 2017 X-GM-THRID: 1584157826513164299 X-Gmail-Labels: Inbox,Category Forums,HistoricalUnread