From nobody Mon Nov 25 18:01:58 2024 Received: from szxga03-in.huawei.com (szxga03-in.huawei.com [45.249.212.189]) (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 202811D363D; Fri, 25 Oct 2024 09:02:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.189 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729846964; cv=none; b=mjkS2iDWUcEolJYXx+ScFLI8enZxXQq6lfVnvS0QAnV2vM1nELf3BjcQI4NqwrwALBangtX/2F5oTeH83z8BywuEBzR/4dU0iO2p+YzB60QZyojkWRfJJQTZJw0LKyFOzLkLsQetHwjumCplqnOTWLU1HaXTe0iUPCVGSAtfTBQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729846964; c=relaxed/simple; bh=w4ZxKQrqZpSMibcNS7/BllpRKF+tFp07Q8XIWWUdloo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=prZzN14EDPWrsfD9W17Nbqf9ScqP5R7Wp9+TGn3HM7iycIwBmftWxW3o2qD7pc6sAZfv1gp2FL+s0o16mdKYlBa5F5SWAP6su0Q3iJ/wfZXhOelX8ymnYDU6v1FXNmCxeWWSBE7EelmPWZ7j729d1BHdOPZw2rrj/eHoTw4rgfs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.189 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.163.174]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4XZcGc2pZFzQs4g; Fri, 25 Oct 2024 17:01:44 +0800 (CST) Received: from kwepemm600005.china.huawei.com (unknown [7.193.23.191]) by mail.maildlp.com (Postfix) with ESMTPS id 710FE140337; Fri, 25 Oct 2024 17:02:38 +0800 (CST) Received: from huawei.com (10.50.165.33) by kwepemm600005.china.huawei.com (7.193.23.191) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Fri, 25 Oct 2024 17:02:37 +0800 From: Longfang Liu To: , , , CC: , , , Subject: [PATCH v11 1/4] hisi_acc_vfio_pci: extract public functions for container_of Date: Fri, 25 Oct 2024 17:01:40 +0800 Message-ID: <20241025090143.64472-2-liulongfang@huawei.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20241025090143.64472-1-liulongfang@huawei.com> References: <20241025090143.64472-1-liulongfang@huawei.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-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To kwepemm600005.china.huawei.com (7.193.23.191) Content-Type: text/plain; charset="utf-8" In the current driver, vdev is obtained from struct hisi_acc_vf_core_device through the container_of function. This method is used in many places in the driver. In order to reduce this repetitive operation, It was extracted into a public function. Signed-off-by: Longfang Liu Reviewed-by: Shameer Kolothum --- .../vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/= pci/hisilicon/hisi_acc_vfio_pci.c index 9a3e97108ace..45351be8e270 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c @@ -630,6 +630,12 @@ static void hisi_acc_vf_disable_fds(struct hisi_acc_vf= _core_device *hisi_acc_vde } } =20 +static struct hisi_acc_vf_core_device *hisi_acc_get_vf_dev(struct vfio_dev= ice *vdev) +{ + return container_of(vdev, struct hisi_acc_vf_core_device, + core_device.vdev); +} + static void hisi_acc_vf_reset(struct hisi_acc_vf_core_device *hisi_acc_vde= v) { hisi_acc_vdev->vf_qm_state =3D QM_NOT_READY; @@ -1033,8 +1039,7 @@ static struct file * hisi_acc_vfio_pci_set_device_state(struct vfio_device *vdev, enum vfio_device_mig_state new_state) { - struct hisi_acc_vf_core_device *hisi_acc_vdev =3D container_of(vdev, - struct hisi_acc_vf_core_device, core_device.vdev); + struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_get_vf_dev(vde= v); enum vfio_device_mig_state next_state; struct file *res =3D NULL; int ret; @@ -1075,8 +1080,7 @@ static int hisi_acc_vfio_pci_get_device_state(struct vfio_device *vdev, enum vfio_device_mig_state *curr_state) { - struct hisi_acc_vf_core_device *hisi_acc_vdev =3D container_of(vdev, - struct hisi_acc_vf_core_device, core_device.vdev); + struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_get_vf_dev(vde= v); =20 mutex_lock(&hisi_acc_vdev->state_mutex); *curr_state =3D hisi_acc_vdev->mig_state; @@ -1280,8 +1284,7 @@ static long hisi_acc_vfio_pci_ioctl(struct vfio_devic= e *core_vdev, unsigned int =20 static int hisi_acc_vfio_pci_open_device(struct vfio_device *core_vdev) { - struct hisi_acc_vf_core_device *hisi_acc_vdev =3D container_of(core_vdev, - struct hisi_acc_vf_core_device, core_device.vdev); + struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_get_vf_dev(cor= e_vdev); struct vfio_pci_core_device *vdev =3D &hisi_acc_vdev->core_device; int ret; =20 @@ -1304,8 +1307,7 @@ static int hisi_acc_vfio_pci_open_device(struct vfio_= device *core_vdev) =20 static void hisi_acc_vfio_pci_close_device(struct vfio_device *core_vdev) { - struct hisi_acc_vf_core_device *hisi_acc_vdev =3D container_of(core_vdev, - struct hisi_acc_vf_core_device, core_device.vdev); + struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_get_vf_dev(cor= e_vdev); struct hisi_qm *vf_qm =3D &hisi_acc_vdev->vf_qm; =20 iounmap(vf_qm->io_base); @@ -1320,8 +1322,7 @@ static const struct vfio_migration_ops hisi_acc_vfio_= pci_migrn_state_ops =3D { =20 static int hisi_acc_vfio_pci_migrn_init_dev(struct vfio_device *core_vdev) { - struct hisi_acc_vf_core_device *hisi_acc_vdev =3D container_of(core_vdev, - struct hisi_acc_vf_core_device, core_device.vdev); + struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_get_vf_dev(cor= e_vdev); struct pci_dev *pdev =3D to_pci_dev(core_vdev->dev); struct hisi_qm *pf_qm =3D hisi_acc_get_pf_qm(pdev); =20 --=20 2.24.0 From nobody Mon Nov 25 18:01:58 2024 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) (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 EBADE1D415C; Fri, 25 Oct 2024 09:03:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.188 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729847001; cv=none; b=IsktdRADo6VNUJ4nHeILPWe8ziPaiYEGSHuFwshl5HwD/0wVXPw8iPzWMBC5KCnDb1+MDtKF+IDFCNFRjpxE04P+JYbjQhS6KizYlf/RsYZciv45N+/+Csdl5dWHQ1RpXcEOt9NnClq3gMxrQ3BT1CD7RbeZPlAbRE1Z9zIMSqg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729847001; c=relaxed/simple; bh=89zysdWO9QHwVicNvFBVQwWlrUkig269PlzLhTNYCVU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=hY8t1AZVPoOgtogUKvLeLHU75pv8f/Rzc/LWr4vDI9SSLx/owJLMXfLdY8Oj1db70CHlKffOwnn8XT4Kj2TC4T/eTdCC+lKDxhOw1msrRfzOWuY8OLp25qAjrbWok4JD224oZsFxoOWwmNJU+ICvCbKGoOtlSwF8idPmqQNyE68= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.188 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.88.194]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4XZcG06Q62zpXGH; Fri, 25 Oct 2024 17:01:12 +0800 (CST) Received: from kwepemm600005.china.huawei.com (unknown [7.193.23.191]) by mail.maildlp.com (Postfix) with ESMTPS id 778651400E3; Fri, 25 Oct 2024 17:03:09 +0800 (CST) Received: from huawei.com (10.50.165.33) by kwepemm600005.china.huawei.com (7.193.23.191) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Fri, 25 Oct 2024 17:03:08 +0800 From: Longfang Liu To: , , , CC: , , , Subject: [PATCH v11 2/4] hisi_acc_vfio_pci: create subfunction for data reading Date: Fri, 25 Oct 2024 17:01:41 +0800 Message-ID: <20241025090143.64472-3-liulongfang@huawei.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20241025090143.64472-1-liulongfang@huawei.com> References: <20241025090143.64472-1-liulongfang@huawei.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-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To kwepemm600005.china.huawei.com (7.193.23.191) Content-Type: text/plain; charset="utf-8" This patch generates the code for the operation of reading data from the device into a sub-function. Then, it can be called during the device status data saving phase of the live migration process and the device status data reading function in debugfs. Thereby reducing the redundant code of the driver. Signed-off-by: Longfang Liu Reviewed-by: Shameer Kolothum --- .../vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/= pci/hisilicon/hisi_acc_vfio_pci.c index 45351be8e270..a8c53952d82e 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c @@ -486,31 +486,11 @@ static int vf_qm_load_data(struct hisi_acc_vf_core_de= vice *hisi_acc_vdev, return 0; } =20 -static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev, - struct hisi_acc_vf_migration_file *migf) +static int vf_qm_read_data(struct hisi_qm *vf_qm, struct acc_vf_data *vf_d= ata) { - struct acc_vf_data *vf_data =3D &migf->vf_data; - struct hisi_qm *vf_qm =3D &hisi_acc_vdev->vf_qm; struct device *dev =3D &vf_qm->pdev->dev; int ret; =20 - if (unlikely(qm_wait_dev_not_ready(vf_qm))) { - /* Update state and return with match data */ - vf_data->vf_qm_state =3D QM_NOT_READY; - hisi_acc_vdev->vf_qm_state =3D vf_data->vf_qm_state; - migf->total_length =3D QM_MATCH_SIZE; - return 0; - } - - vf_data->vf_qm_state =3D QM_READY; - hisi_acc_vdev->vf_qm_state =3D vf_data->vf_qm_state; - - ret =3D vf_qm_cache_wb(vf_qm); - if (ret) { - dev_err(dev, "failed to writeback QM Cache!\n"); - return ret; - } - ret =3D qm_get_regs(vf_qm, vf_data); if (ret) return -EINVAL; @@ -536,6 +516,38 @@ static int vf_qm_state_save(struct hisi_acc_vf_core_de= vice *hisi_acc_vdev, return -EINVAL; } =20 + return 0; +} + +static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev, + struct hisi_acc_vf_migration_file *migf) +{ + struct acc_vf_data *vf_data =3D &migf->vf_data; + struct hisi_qm *vf_qm =3D &hisi_acc_vdev->vf_qm; + struct device *dev =3D &vf_qm->pdev->dev; + int ret; + + if (unlikely(qm_wait_dev_not_ready(vf_qm))) { + /* Update state and return with match data */ + vf_data->vf_qm_state =3D QM_NOT_READY; + hisi_acc_vdev->vf_qm_state =3D vf_data->vf_qm_state; + migf->total_length =3D QM_MATCH_SIZE; + return 0; + } + + vf_data->vf_qm_state =3D QM_READY; + hisi_acc_vdev->vf_qm_state =3D vf_data->vf_qm_state; + + ret =3D vf_qm_cache_wb(vf_qm); + if (ret) { + dev_err(dev, "failed to writeback QM Cache!\n"); + return ret; + } + + ret =3D vf_qm_read_data(vf_qm, vf_data); + if (ret) + return -EINVAL; + migf->total_length =3D sizeof(struct acc_vf_data); return 0; } --=20 2.24.0 From nobody Mon Nov 25 18:01:58 2024 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) (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 426531D54E2; Fri, 25 Oct 2024 09:03:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.187 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729847028; cv=none; b=aLwYgHtMqiTyVioCvqD7QustvhEIn2MHP9JIqviCZomSQxUzoKb2VfmaKl48SExu0cir8TSUNE/Sur75XgAKKiMliwQaMQHzCqe+03MOZ24dH47ZNwt896dGyIBGckl+NrWGX3gFUceyZawTMQ+zpJJJGO1QbnQbWKi09WTYai0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729847028; c=relaxed/simple; bh=IXySSjvnKaQlcqYMtv76t2iy0nzhdgHh/i6ICP571io=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=uCP87V3RAatMsnWFtHoy5XgS37ukX1ajtRxjpaBUvu7szazbCWUBTXqGPPww9MZ9NKdhwoN6j/W5qQJBQSXBUggnfD1y4N22kFoCueH1mdz9utA32xVS7hH8B5D9Tr8/+5Sm19jSoUHlI9MiHilWv/KRe9sIpRuN70KOTYBhiXU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.187 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.162.254]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4XZcGS062bz10NyZ; Fri, 25 Oct 2024 17:01:36 +0800 (CST) Received: from kwepemm600005.china.huawei.com (unknown [7.193.23.191]) by mail.maildlp.com (Postfix) with ESMTPS id 77A951800F2; Fri, 25 Oct 2024 17:03:40 +0800 (CST) Received: from huawei.com (10.50.165.33) by kwepemm600005.china.huawei.com (7.193.23.191) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Fri, 25 Oct 2024 17:03:39 +0800 From: Longfang Liu To: , , , CC: , , , Subject: [PATCH v11 3/4] hisi_acc_vfio_pci: register debugfs for hisilicon migration driver Date: Fri, 25 Oct 2024 17:01:42 +0800 Message-ID: <20241025090143.64472-4-liulongfang@huawei.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20241025090143.64472-1-liulongfang@huawei.com> References: <20241025090143.64472-1-liulongfang@huawei.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-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To kwepemm600005.china.huawei.com (7.193.23.191) Content-Type: text/plain; charset="utf-8" On the debugfs framework of VFIO, if the CONFIG_VFIO_DEBUGFS macro is enabled, the debug function is registered for the live migration driver of the HiSilicon accelerator device. After registering the HiSilicon accelerator device on the debugfs framework of live migration of vfio, a directory file "hisi_acc" of debugfs is created, and then three debug function files are created in this directory: vfio | +--- | +---migration | +--state | +--hisi_acc | +--dev_data | +--migf_data | +--cmd_state | +--- +---migration +--state +--hisi_acc +--dev_data +--migf_data +--cmd_state dev_data file: read device data that needs to be migrated from the current device in real time migf_data file: read the migration data of the last live migration from the current driver. cmd_state: used to get the cmd channel state for the device. +----------------+ +--------------+ +---------------+ | migration dev | | src dev | | dst dev | +-------+--------+ +------+-------+ +-------+-------+ | | | | +------v-------+ +-------v-------+ | | saving_migf | | resuming_migf | read | | file | | file | | +------+-------+ +-------+-------+ | | copy | | +------------+----------+ | | +-------v--------+ +-------v--------+ | data buffer | | debug_migf | +-------+--------+ +-------+--------+ | | cat | cat | +-------v--------+ +-------v--------+ | dev_data | | migf_data | +----------------+ +----------------+ When accessing debugfs, user can obtain the most recent status data of the device through the "dev_data" file. It can read recent complete status data of the device. If the current device is being migrated, it will wait for it to complete. The data for the last completed migration function will be stored in debug_migf. Users can read it via "migf_data". Signed-off-by: Longfang Liu Reviewed-by: Shameer Kolothum --- .../vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 204 ++++++++++++++++++ .../vfio/pci/hisilicon/hisi_acc_vfio_pci.h | 7 + 2 files changed, 211 insertions(+) diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/= pci/hisilicon/hisi_acc_vfio_pci.c index a8c53952d82e..0577d4ddfb34 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c @@ -627,15 +627,30 @@ static void hisi_acc_vf_disable_fd(struct hisi_acc_vf= _migration_file *migf) mutex_unlock(&migf->lock); } =20 +static void hisi_acc_debug_migf_copy(struct hisi_acc_vf_core_device *hisi_= acc_vdev, + struct hisi_acc_vf_migration_file *src_migf) +{ + struct hisi_acc_vf_migration_file *dst_migf =3D hisi_acc_vdev->debug_migf; + + if (!dst_migf) + return; + + dst_migf->total_length =3D src_migf->total_length; + memcpy(&dst_migf->vf_data, &src_migf->vf_data, + sizeof(struct acc_vf_data)); +} + static void hisi_acc_vf_disable_fds(struct hisi_acc_vf_core_device *hisi_a= cc_vdev) { if (hisi_acc_vdev->resuming_migf) { + hisi_acc_debug_migf_copy(hisi_acc_vdev, hisi_acc_vdev->resuming_migf); hisi_acc_vf_disable_fd(hisi_acc_vdev->resuming_migf); fput(hisi_acc_vdev->resuming_migf->filp); hisi_acc_vdev->resuming_migf =3D NULL; } =20 if (hisi_acc_vdev->saving_migf) { + hisi_acc_debug_migf_copy(hisi_acc_vdev, hisi_acc_vdev->saving_migf); hisi_acc_vf_disable_fd(hisi_acc_vdev->saving_migf); fput(hisi_acc_vdev->saving_migf->filp); hisi_acc_vdev->saving_migf =3D NULL; @@ -1294,6 +1309,140 @@ static long hisi_acc_vfio_pci_ioctl(struct vfio_dev= ice *core_vdev, unsigned int return vfio_pci_core_ioctl(core_vdev, cmd, arg); } =20 +static int hisi_acc_vf_debug_check(struct seq_file *seq, struct vfio_devic= e *vdev) +{ + struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_get_vf_dev(vde= v); + struct hisi_qm *vf_qm =3D &hisi_acc_vdev->vf_qm; + int ret; + + lockdep_assert_held(&hisi_acc_vdev->open_mutex); + /* + * When the device is not opened, the io_base is not mapped. + * The driver cannot perform device read and write operations. + */ + if (!hisi_acc_vdev->dev_opened) { + seq_printf(seq, "device not opened!\n"); + return -EINVAL; + } + + ret =3D qm_wait_dev_not_ready(vf_qm); + if (ret) { + seq_printf(seq, "VF device not ready!\n"); + return -EBUSY; + } + + return 0; +} + +static int hisi_acc_vf_debug_cmd(struct seq_file *seq, void *data) +{ + struct device *vf_dev =3D seq->private; + struct vfio_pci_core_device *core_device =3D dev_get_drvdata(vf_dev); + struct vfio_device *vdev =3D &core_device->vdev; + struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_get_vf_dev(vde= v); + struct hisi_qm *vf_qm =3D &hisi_acc_vdev->vf_qm; + u64 value; + int ret; + + mutex_lock(&hisi_acc_vdev->open_mutex); + ret =3D hisi_acc_vf_debug_check(seq, vdev); + if (ret) { + mutex_unlock(&hisi_acc_vdev->open_mutex); + return ret; + } + + value =3D readl(vf_qm->io_base + QM_MB_CMD_SEND_BASE); + if (value =3D=3D QM_MB_CMD_NOT_READY) { + mutex_unlock(&hisi_acc_vdev->open_mutex); + seq_printf(seq, "mailbox cmd channel not ready!\n"); + return -EINVAL; + } + mutex_unlock(&hisi_acc_vdev->open_mutex); + seq_printf(seq, "mailbox cmd channel ready!\n"); + + return 0; +} + +static int hisi_acc_vf_dev_read(struct seq_file *seq, void *data) +{ + struct device *vf_dev =3D seq->private; + struct vfio_pci_core_device *core_device =3D dev_get_drvdata(vf_dev); + struct vfio_device *vdev =3D &core_device->vdev; + struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_get_vf_dev(vde= v); + size_t vf_data_sz =3D offsetofend(struct acc_vf_data, padding); + struct acc_vf_data *vf_data =3D NULL; + int ret; + + mutex_lock(&hisi_acc_vdev->open_mutex); + ret =3D hisi_acc_vf_debug_check(seq, vdev); + if (ret) { + mutex_unlock(&hisi_acc_vdev->open_mutex); + return ret; + } + + mutex_lock(&hisi_acc_vdev->state_mutex); + vf_data =3D kzalloc(sizeof(struct acc_vf_data), GFP_KERNEL); + if (!vf_data) { + ret =3D -ENOMEM; + goto mutex_release; + } + + vf_data->vf_qm_state =3D hisi_acc_vdev->vf_qm_state; + ret =3D vf_qm_read_data(&hisi_acc_vdev->vf_qm, vf_data); + if (ret) + goto migf_err; + + seq_hex_dump(seq, "Dev Data:", DUMP_PREFIX_OFFSET, 16, 1, + (unsigned char *)vf_data, + vf_data_sz, false); + + seq_printf(seq, + "acc device:\n" + "guest driver load: %u\n" + "data size: %lu\n", + hisi_acc_vdev->vf_qm_state, + sizeof(struct acc_vf_data)); + +migf_err: + kfree(vf_data); +mutex_release: + mutex_unlock(&hisi_acc_vdev->open_mutex); + mutex_unlock(&hisi_acc_vdev->state_mutex); + + return ret; +} + +static int hisi_acc_vf_migf_read(struct seq_file *seq, void *data) +{ + struct device *vf_dev =3D seq->private; + struct vfio_pci_core_device *core_device =3D dev_get_drvdata(vf_dev); + struct vfio_device *vdev =3D &core_device->vdev; + struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_get_vf_dev(vde= v); + size_t vf_data_sz =3D offsetofend(struct acc_vf_data, padding); + struct hisi_acc_vf_migration_file *debug_migf =3D hisi_acc_vdev->debug_mi= gf; + + /* Check whether the live migration operation has been performed */ + if (debug_migf->total_length < QM_MATCH_SIZE) { + seq_printf(seq, "device not migrated!\n"); + return -EAGAIN; + } + + seq_hex_dump(seq, "Mig Data:", DUMP_PREFIX_OFFSET, 16, 1, + (unsigned char *)&debug_migf->vf_data, + vf_data_sz, false); + + seq_printf(seq, + "acc device:\n" + "guest driver load: %u\n" + "device opened: %d\n" + "migrate data length: %lu\n", + hisi_acc_vdev->vf_qm_state, + hisi_acc_vdev->dev_opened, + debug_migf->total_length); + + return 0; +} + static int hisi_acc_vfio_pci_open_device(struct vfio_device *core_vdev) { struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_get_vf_dev(cor= e_vdev); @@ -1305,12 +1454,16 @@ static int hisi_acc_vfio_pci_open_device(struct vfi= o_device *core_vdev) return ret; =20 if (core_vdev->mig_ops) { + mutex_lock(&hisi_acc_vdev->open_mutex); ret =3D hisi_acc_vf_qm_init(hisi_acc_vdev); if (ret) { + mutex_unlock(&hisi_acc_vdev->open_mutex); vfio_pci_core_disable(vdev); return ret; } hisi_acc_vdev->mig_state =3D VFIO_DEVICE_STATE_RUNNING; + hisi_acc_vdev->dev_opened =3D true; + mutex_unlock(&hisi_acc_vdev->open_mutex); } =20 vfio_pci_core_finish_enable(vdev); @@ -1322,7 +1475,10 @@ static void hisi_acc_vfio_pci_close_device(struct vf= io_device *core_vdev) struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_get_vf_dev(cor= e_vdev); struct hisi_qm *vf_qm =3D &hisi_acc_vdev->vf_qm; =20 + mutex_lock(&hisi_acc_vdev->open_mutex); + hisi_acc_vdev->dev_opened =3D false; iounmap(vf_qm->io_base); + mutex_unlock(&hisi_acc_vdev->open_mutex); vfio_pci_core_close_device(core_vdev); } =20 @@ -1342,6 +1498,7 @@ static int hisi_acc_vfio_pci_migrn_init_dev(struct vf= io_device *core_vdev) hisi_acc_vdev->pf_qm =3D pf_qm; hisi_acc_vdev->vf_dev =3D pdev; mutex_init(&hisi_acc_vdev->state_mutex); + mutex_init(&hisi_acc_vdev->open_mutex); =20 core_vdev->migration_flags =3D VFIO_MIGRATION_STOP_COPY | VFIO_MIGRATION_= PRE_COPY; core_vdev->mig_ops =3D &hisi_acc_vfio_pci_migrn_state_ops; @@ -1387,6 +1544,50 @@ static const struct vfio_device_ops hisi_acc_vfio_pc= i_ops =3D { .detach_ioas =3D vfio_iommufd_physical_detach_ioas, }; =20 +static void hisi_acc_vfio_debug_init(struct hisi_acc_vf_core_device *hisi_= acc_vdev) +{ + struct vfio_device *vdev =3D &hisi_acc_vdev->core_device.vdev; + struct dentry *vfio_dev_migration =3D NULL; + struct dentry *vfio_hisi_acc =3D NULL; + struct device *dev =3D vdev->dev; + void *migf =3D NULL; + + if (!debugfs_initialized() || + !IS_ENABLED(CONFIG_VFIO_DEBUGFS)) + return; + + if (vdev->ops !=3D &hisi_acc_vfio_pci_migrn_ops) + return; + + vfio_dev_migration =3D debugfs_lookup("migration", vdev->debug_root); + if (!vfio_dev_migration) { + dev_err(dev, "failed to lookup migration debugfs file!\n"); + return; + } + + migf =3D kzalloc(sizeof(struct hisi_acc_vf_migration_file), GFP_KERNEL); + if (!migf) + return; + hisi_acc_vdev->debug_migf =3D migf; + + vfio_hisi_acc =3D debugfs_create_dir("hisi_acc", vfio_dev_migration); + debugfs_create_devm_seqfile(dev, "dev_data", vfio_hisi_acc, + hisi_acc_vf_dev_read); + debugfs_create_devm_seqfile(dev, "migf_data", vfio_hisi_acc, + hisi_acc_vf_migf_read); + debugfs_create_devm_seqfile(dev, "cmd_state", vfio_hisi_acc, + hisi_acc_vf_debug_cmd); +} + +static void hisi_acc_vf_debugfs_exit(struct hisi_acc_vf_core_device *hisi_= acc_vdev) +{ + /* If migrn_ops is not used, debug_migf is NULL */ + if (hisi_acc_vdev->debug_migf) { + kfree(hisi_acc_vdev->debug_migf); + hisi_acc_vdev->debug_migf =3D NULL; + } +} + static int hisi_acc_vfio_pci_probe(struct pci_dev *pdev, const struct pci_= device_id *id) { struct hisi_acc_vf_core_device *hisi_acc_vdev; @@ -1413,6 +1614,8 @@ static int hisi_acc_vfio_pci_probe(struct pci_dev *pd= ev, const struct pci_device ret =3D vfio_pci_core_register_device(&hisi_acc_vdev->core_device); if (ret) goto out_put_vdev; + + hisi_acc_vfio_debug_init(hisi_acc_vdev); return 0; =20 out_put_vdev: @@ -1425,6 +1628,7 @@ static void hisi_acc_vfio_pci_remove(struct pci_dev *= pdev) struct hisi_acc_vf_core_device *hisi_acc_vdev =3D hisi_acc_drvdata(pdev); =20 vfio_pci_core_unregister_device(&hisi_acc_vdev->core_device); + hisi_acc_vf_debugfs_exit(hisi_acc_vdev); vfio_put_device(&hisi_acc_vdev->core_device.vdev); } =20 diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h b/drivers/vfio/= pci/hisilicon/hisi_acc_vfio_pci.h index 5bab46602fad..2a78ffd060c3 100644 --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.h @@ -32,6 +32,7 @@ #define QM_SQC_VFT_BASE_MASK_V2 GENMASK(15, 0) #define QM_SQC_VFT_NUM_SHIFT_V2 45 #define QM_SQC_VFT_NUM_MASK_V2 GENMASK(9, 0) +#define QM_MB_CMD_NOT_READY 0xffffffff =20 /* RW regs */ #define QM_REGS_MAX_LEN 7 @@ -99,6 +100,8 @@ struct hisi_acc_vf_migration_file { struct hisi_acc_vf_core_device { struct vfio_pci_core_device core_device; u8 match_done; + /* To make sure the device is opened */ + bool dev_opened; =20 /* For migration state */ struct mutex state_mutex; @@ -111,5 +114,9 @@ struct hisi_acc_vf_core_device { int vf_id; struct hisi_acc_vf_migration_file *resuming_migf; struct hisi_acc_vf_migration_file *saving_migf; + + /* To save migration data */ + struct hisi_acc_vf_migration_file *debug_migf; + struct mutex open_mutex; }; #endif /* HISI_ACC_VFIO_PCI_H */ --=20 2.24.0 From nobody Mon Nov 25 18:01:58 2024 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) (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 3C96E1D222F; Fri, 25 Oct 2024 09:04:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.187 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729847057; cv=none; b=MCaqkYcLBk+ocxEn9CcGewN+PmdIcx4F2Z8DE3Kc0TtZaa70Q2hlTRPRIzxBcDrdF8DloJvkz9fpdCGvuu4p6WZMj4iT1wiLN8nhVh4DHltqwszhysjRToCP81XDJgrEL+3wkm3MvmpohXxxfgtM/peRsNiDySTGL2DyXQoucR4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1729847057; c=relaxed/simple; bh=UyohMo7jcmqSJ543BpeQ58/1w+KHTlZr9IKhyVxdzdM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=uYhMC1wGSmKnHUX/FVoVHTcRW1VIUIBwhHMsocsxf3xWVsZ9mCuKKQNfZVLBoT0G3JCdmHP3Yw4ItEApG/wAQ2i0ItzrtHxdwV57gWfksuYcjJ0RLi7yAtgG0Q3lsOMbQ4oSkhQe6xvuTp/rJr9XV8fs0x7Lzx7W28M8NMYGefw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.187 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.163.48]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4XZcHd69wjzyT16; Fri, 25 Oct 2024 17:02:37 +0800 (CST) Received: from kwepemm600005.china.huawei.com (unknown [7.193.23.191]) by mail.maildlp.com (Postfix) with ESMTPS id 722AE18006C; Fri, 25 Oct 2024 17:04:11 +0800 (CST) Received: from huawei.com (10.50.165.33) by kwepemm600005.china.huawei.com (7.193.23.191) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Fri, 25 Oct 2024 17:04:10 +0800 From: Longfang Liu To: , , , CC: , , , Subject: [PATCH v11 4/4] Documentation: add debugfs description for hisi migration Date: Fri, 25 Oct 2024 17:01:43 +0800 Message-ID: <20241025090143.64472-5-liulongfang@huawei.com> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20241025090143.64472-1-liulongfang@huawei.com> References: <20241025090143.64472-1-liulongfang@huawei.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-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To kwepemm600005.china.huawei.com (7.193.23.191) Content-Type: text/plain; charset="utf-8" Add a debugfs document description file to help users understand how to use the hisilicon accelerator live migration driver's debugfs. Update the file paths that need to be maintained in MAINTAINERS Signed-off-by: Longfang Liu Reviewed-by: Shameer Kolothum --- .../ABI/testing/debugfs-hisi-migration | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Documentation/ABI/testing/debugfs-hisi-migration diff --git a/Documentation/ABI/testing/debugfs-hisi-migration b/Documentati= on/ABI/testing/debugfs-hisi-migration new file mode 100644 index 000000000000..89e4fde5ec6a --- /dev/null +++ b/Documentation/ABI/testing/debugfs-hisi-migration @@ -0,0 +1,25 @@ +What: /sys/kernel/debug/vfio//migration/hisi_acc/dev_data +Date: Oct 2024 +KernelVersion: 6.12 +Contact: Longfang Liu +Description: Read the configuration data and some status data + required for device live migration. These data include device + status data, queue configuration data, some task configuration + data and device attribute data. The output format of the data + is defined by the live migration driver. + +What: /sys/kernel/debug/vfio//migration/hisi_acc/migf_data +Date: Oct 2024 +KernelVersion: 6.12 +Contact: Longfang Liu +Description: Read the data from the last completed live migration. + This data includes the same device status data as in "dev_data". + The migf_data is the dev_data that is migrated. + +What: /sys/kernel/debug/vfio//migration/hisi_acc/cmd_state +Date: Oct 2024 +KernelVersion: 6.12 +Contact: Longfang Liu +Description: Used to obtain the device command sending and receiving + channel status. Returns failure or success logs based on the + results. --=20 2.24.0