From nobody Fri Apr 3 01:28:24 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A040834889C; Wed, 25 Mar 2026 21:02:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774472533; cv=none; b=YaFgWABKghFYaizMKXSDJJz7VHqX3XzadRp5c9eOS89E4KxDTS2LTBWmbe7jcC+2/KcLdVTpOCJTQUAs34q5RqPBUXWTPa+WO2Epm6OCHc/CT9EoYe2OR+CcrgtEqg+rg3AF6JrtBf3eqjFBeDeyA67RBfHbdZvcjzbLrRrFmsg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774472533; c=relaxed/simple; bh=ubwcCZuLSZ6ZB4fdlP1RWs7uWagIJWw4LzYL2LiGC3k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cWRCpjfz2VF4floj0iLE9FqhlzAzYRji43ZzV2ShiGKLyHlq7QiQD6pGhtkGAMWtk35QgTN4Wn+zpG3fheXhCD3hwZKwU4ezRjRDXkuGtTAeQpGpJE63C1cqB63LjZ/UPl6NtvJD3GwVEveuyUnOUR3xX2SHp/DolltbZ9gyJiA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=jlayIiou; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="jlayIiou" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62PGeqxr3444471; Wed, 25 Mar 2026 21:02:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=9B9nD8oe+4Pg83vbu 3quAaAPaTki0tBUESAz95ocZgw=; b=jlayIiouGniPjyv6scLdgG+cTFswyg3fj 3GfcsFFjSYQUbCXNxSKx0fK2I0UqxyO5fK3cgh4oI2G8Ro8tNlkcRamfdFptfnEj xHfi2N3YVw+ShHSdZhOk1i092wc5e/sV1imvLZ0xPmLa7MqlFFy0rL5BYBQsIgJM CM3OndgGF7hT8yMYiTg4OMxGLrIhuj5NrYjb7YzC1GfZMY49o4w3SYwfHrQx/asR YCbX7ENgSWygNqGsTsSrllQjGglphPaX+AMV2SrIrreeJKZ7xOBJsC4pNq04Y698 eFxRS6yhmw7lbSlIjXQS645IzP8lA387JPNs3RUTSdw+MRoLDWKbw== Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4d1ktv1hja-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 25 Mar 2026 21:02:05 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 62PGlKQL004369; Wed, 25 Mar 2026 21:02:05 GMT Received: from smtprelay02.dal12v.mail.ibm.com ([172.16.1.4]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4d28c27yc4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 25 Mar 2026 21:02:05 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay02.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 62PL23xU5702378 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Mar 2026 21:02:03 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AD9AB58056; Wed, 25 Mar 2026 21:02:03 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B431C58069; Wed, 25 Mar 2026 21:02:02 +0000 (GMT) Received: from li-4c4c4544-004d-4810-8043-b7c04f423534.ibm.com.com (unknown [9.61.136.69]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 25 Mar 2026 21:02:02 +0000 (GMT) From: Anthony Krowiak To: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: jjherne@linux.ibm.com, borntraeger@de.ibm.com, mjrosato@linux.ibm.com, pasic@linux.ibm.com, alex@shazbot.org, kwankhede@nvidia.com, fiuczy@linux.ibm.com, pbonzini@redhat.com, frankja@linux.ibm.com, imbrenda@linux.ibm.com Subject: [PATCH v1 11/24] s390/vfio-ap: Initialize/release vfio device migration data Date: Wed, 25 Mar 2026 17:00:58 -0400 Message-ID: <20260325210149.888028-12-akrowiak@linux.ibm.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260325210149.888028-1-akrowiak@linux.ibm.com> References: <20260325210149.888028-1-akrowiak@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: r3JQDMACK-y5F09qqtNggD9244ZeitFi X-Authority-Analysis: v=2.4 cv=aMr9aL9m c=1 sm=1 tr=0 ts=69c44d4e cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=Yq5XynenixoA:10 a=VkNPw1HP01LnGYTKEx00:22 a=RnoormkPH1_aCDwRdu11:22 a=Y2IxJ9c9Rs8Kov3niI8_:22 a=VnNF1IyMAAAA:8 a=22LHVZlmPUAi0_1XYEgA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzI1MDE0OSBTYWx0ZWRfX2ySuYJrw7vMC Ueb1N+PqmvMK4hCdx3lLRWClpJ3MVuogID4JMrG6YI4h6ikhm7lr80YjZdOslomlernKrAyR9/Q ZSUe3mL2YrXmln5QQCa2GzK4kliG3tXBGOZu2f/MaBXY9n5Ukwy6UOPF2Mxsg5IzLjs0r10ZyQn OR/2nAQMBYga48NnGPyrJwvcxsvslNjgGaBtwAJnk1RKYDSl0phDbEwhcEC59glDpmz/keDNff/ Wo4AQjWT9rcBhOAoiVvzHZ3RakZS5eXTKn7mpjo9oHX0vg/Y52FrdpmPX/SawF7VGb/KHGOQ+RY VtEIKjkODTrpWzSOo/k+GtSljzLh1msX34KCVWsrlTrvVtxoaXyg3b6cmAgZmJWsTy2TBwRlLnb +DX0AXTiT1rxekMXXvdtHK4c69PQAdT4DNP4R3cd33Epf9sNwuyymqIZem01dSGyf9ddweFMEK2 SEfqvXAt6WlhUUxDeyw== X-Proofpoint-GUID: r3JQDMACK-y5F09qqtNggD9244ZeitFi X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-25_05,2026-03-24_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 malwarescore=0 suspectscore=0 phishscore=0 priorityscore=1501 bulkscore=0 clxscore=1011 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603250149 Content-Type: text/plain; charset="utf-8" Provides the functions that initialize and release the data structures used during live guest migration. These functions should be called when the mdev fd is opened and closed respectively. The function to release the data structures shall also be invoked when the mdev is released. Signed-off-by: Anthony Krowiak --- drivers/s390/crypto/vfio_ap_migration.c | 94 +++++++++++++++++++++++++ drivers/s390/crypto/vfio_ap_ops.c | 41 +++++++++-- drivers/s390/crypto/vfio_ap_private.h | 3 + 3 files changed, 131 insertions(+), 7 deletions(-) diff --git a/drivers/s390/crypto/vfio_ap_migration.c b/drivers/s390/crypto/= vfio_ap_migration.c index 2c5978dde61d..76cbbe1adb7a 100644 --- a/drivers/s390/crypto/vfio_ap_migration.c +++ b/drivers/s390/crypto/vfio_ap_migration.c @@ -4,6 +4,7 @@ * * Copyright IBM Corp. 2025 */ +#include #include "uapi/linux/vfio_ap.h" =20 #include "vfio_ap_private.h" @@ -66,3 +67,96 @@ struct vfio_ap_migration_file { struct vfio_ap_config *ap_config; size_t config_sz; }; + +static void vfio_ap_disable_file(struct vfio_ap_migration_file *migf) +{ + lockdep_assert_held(&matrix_dev->mdevs_lock); + migf->matrix_mdev =3D NULL; + migf->disabled =3D true; + migf->filp->f_pos =3D 0; +} + +static void vfio_ap_release_mig_files(struct ap_matrix_mdev *matrix_mdev) +{ + struct vfio_ap_migration_data *mig_data; + + lockdep_assert_held(&matrix_dev->mdevs_lock); + mig_data =3D matrix_mdev->mig_data; + + if (mig_data->resuming_migf) { + vfio_ap_disable_file(mig_data->resuming_migf); + fput(mig_data->resuming_migf->filp); + mig_data->resuming_migf =3D NULL; + } + + if (mig_data->saving_migf) { + vfio_ap_disable_file(mig_data->saving_migf); + fput(mig_data->saving_migf->filp); + mig_data->saving_migf =3D NULL; + } +} + +static struct file *vfio_ap_set_state(struct vfio_device *vdev, + enum vfio_device_mig_state new_state) +{ + return NULL; +} + +static int vfio_ap_get_state(struct vfio_device *vdev, + enum vfio_device_mig_state *current_state) +{ + return -EOPNOTSUPP; +} + +static int vfio_ap_get_data_size(struct vfio_device *vdev, + unsigned long *stop_copy_length) +{ + return -EOPNOTSUPP; +} + +static const struct vfio_migration_ops vfio_ap_migration_ops =3D { + .migration_set_state =3D vfio_ap_set_state, + .migration_get_state =3D vfio_ap_get_state, + .migration_get_data_size =3D vfio_ap_get_data_size, +}; + +/** + * vfio_ap_init_migration_data - initialize migration data and functions + * + * @matrix_mdev: pointer to object containing the mdev state + * + * Return: zero if initialization is successful; otherwise, returns a erro= r. + */ +int vfio_ap_init_migration_data(struct ap_matrix_mdev *matrix_mdev) +{ + struct vfio_ap_migration_data *mig_data; + + lockdep_assert_held(&matrix_dev->mdevs_lock); + + mig_data =3D kzalloc_obj(struct vfio_ap_migration_data, GFP_KERNEL); + if (!mig_data) + return -ENOMEM; + + mig_data->mig_state =3D VFIO_DEVICE_STATE_STOP; + matrix_mdev->vdev.migration_flags =3D VFIO_MIGRATION_STOP_COPY; + matrix_mdev->vdev.mig_ops =3D &vfio_ap_migration_ops; + matrix_mdev->mig_data =3D mig_data; + + return 0; +} + +/** + * vfio_ap_release_migration_data: reclaim private migration data + * + * @vdev: pointer to the mdev + */ +void vfio_ap_release_migration_data(struct ap_matrix_mdev *matrix_mdev) +{ + lockdep_assert_held(&matrix_dev->mdevs_lock); + if (!matrix_mdev->mig_data) + return; + + vfio_ap_release_mig_files(matrix_mdev); + kfree(matrix_mdev->mig_data); + matrix_mdev->mig_data =3D NULL; +} diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_a= p_ops.c index d487628027c7..1ff9994bd7ec 100644 --- a/drivers/s390/crypto/vfio_ap_ops.c +++ b/drivers/s390/crypto/vfio_ap_ops.c @@ -790,18 +790,30 @@ static bool vfio_ap_mdev_filter_matrix(struct ap_matr= ix_mdev *matrix_mdev, =20 static int vfio_ap_mdev_init_dev(struct vfio_device *vdev) { - struct ap_matrix_mdev *matrix_mdev =3D - container_of(vdev, struct ap_matrix_mdev, vdev); + struct ap_matrix_mdev *matrix_mdev; =20 + mutex_lock(&matrix_dev->mdevs_lock); + matrix_mdev =3D container_of(vdev, struct ap_matrix_mdev, vdev); matrix_mdev->mdev =3D to_mdev_device(vdev->dev); vfio_ap_matrix_init(&matrix_dev->info, &matrix_mdev->matrix); matrix_mdev->pqap_hook =3D handle_pqap; vfio_ap_matrix_init(&matrix_dev->info, &matrix_mdev->shadow_apcb); hash_init(matrix_mdev->qtable.queues); + mutex_unlock(&matrix_dev->mdevs_lock); =20 return 0; } =20 +static void vfio_ap_mdev_release_dev(struct vfio_device *vdev) +{ + struct ap_matrix_mdev *matrix_mdev; + + mutex_lock(&matrix_dev->mdevs_lock); + matrix_mdev =3D container_of(vdev, struct ap_matrix_mdev, vdev); + vfio_ap_release_migration_data(matrix_mdev); + mutex_unlock(&matrix_dev->mdevs_lock); +} + static int vfio_ap_mdev_probe(struct mdev_device *mdev) { struct ap_matrix_mdev *matrix_mdev; @@ -2124,19 +2136,33 @@ static int vfio_ap_mdev_reset_qlist(struct list_hea= d *qlist) =20 static int vfio_ap_mdev_open_device(struct vfio_device *vdev) { - struct ap_matrix_mdev *matrix_mdev =3D - container_of(vdev, struct ap_matrix_mdev, vdev); + struct ap_matrix_mdev *matrix_mdev; + int ret; =20 if (!vdev->kvm) return -EINVAL; =20 - return vfio_ap_mdev_set_kvm(matrix_mdev, vdev->kvm); + mutex_lock(&matrix_dev->mdevs_lock); + matrix_mdev =3D container_of(vdev, struct ap_matrix_mdev, vdev); + ret =3D vfio_ap_init_migration_data(matrix_mdev); + mutex_unlock(&matrix_dev->mdevs_lock); + + if (ret) + return ret; + + ret =3D vfio_ap_mdev_set_kvm(matrix_mdev, vdev->kvm); + + return ret; } =20 static void vfio_ap_mdev_close_device(struct vfio_device *vdev) { - struct ap_matrix_mdev *matrix_mdev =3D - container_of(vdev, struct ap_matrix_mdev, vdev); + struct ap_matrix_mdev *matrix_mdev; + + mutex_lock(&matrix_dev->mdevs_lock); + matrix_mdev =3D container_of(vdev, struct ap_matrix_mdev, vdev); + vfio_ap_release_migration_data(matrix_mdev); + mutex_unlock(&matrix_dev->mdevs_lock); =20 vfio_ap_mdev_unset_kvm(matrix_mdev); } @@ -2555,6 +2581,7 @@ static const struct attribute_group vfio_queue_attr_g= roup =3D { =20 static const struct vfio_device_ops vfio_ap_matrix_dev_ops =3D { .init =3D vfio_ap_mdev_init_dev, + .release =3D vfio_ap_mdev_release_dev, .open_device =3D vfio_ap_mdev_open_device, .close_device =3D vfio_ap_mdev_close_device, .ioctl =3D vfio_ap_mdev_ioctl, diff --git a/drivers/s390/crypto/vfio_ap_private.h b/drivers/s390/crypto/vf= io_ap_private.h index 24db7d32e41c..cad49b509f7a 100644 --- a/drivers/s390/crypto/vfio_ap_private.h +++ b/drivers/s390/crypto/vfio_ap_private.h @@ -181,4 +181,7 @@ void vfio_ap_on_cfg_changed(struct ap_config_info *new_= config_info, void vfio_ap_on_scan_complete(struct ap_config_info *new_config_info, struct ap_config_info *old_config_info); =20 +int vfio_ap_init_migration_data(struct ap_matrix_mdev *matrix_mdev); +void vfio_ap_release_migration_data(struct ap_matrix_mdev *matrix_mdev); + #endif /* _VFIO_AP_PRIVATE_H_ */ --=20 2.52.0