From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 717F4A00BE for ; Fri, 11 Mar 2022 03:42:42 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5EC874113F; Fri, 11 Mar 2022 03:42:42 +0100 (CET) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id 61A1740042; Fri, 11 Mar 2022 03:42:39 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1646966560; x=1678502560; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=SkvB9Ahqy6L0/IcjZ4JdGpY+YYaNPfYu7dGxYaM11mY=; b=ghKTF1MkPrc32/QrpbRQo/dRv1ltwla6FwN2/hwtupYAIZBMbGMbCPh9 tYz6xch3E+Dp3VPKZd+Pg8kz1z7Bvy6zjtCh6og4LwSAftbiaGHnM9lm7 XC3dVLHD1a/gPugwwFa0aPoMtu2v4l6ZNHK4XcEbhtLzAwY8blUdCyWdi NdnkP3Uxi+Qku0iVxYrUCwN3n4N4L6uFexzj0ZytyXyla16G2fd4aATzB om3D1DeLPz4VwPVcAgy77tU8F2u7GHAG8MJFv4sc3OsteC4hJOWsjksjp prA5G4Hw2I6CMSYO91vl2ACNjMLgmH17wgNyjIXPdrBZBe/H+Qf5fqGI/ A==; X-IronPort-AV: E=McAfee;i="6200,9189,10282"; a="316204213" X-IronPort-AV: E=Sophos;i="5.90,172,1643702400"; d="scan'208";a="316204213" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Mar 2022 18:42:38 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.90,172,1643702400"; d="scan'208";a="633271178" Received: from unknown (HELO localhost.localdomain.sh.intel.com) ([10.238.175.107]) by FMSMGA003.fm.intel.com with ESMTP; 10 Mar 2022 18:42:35 -0800 From: Wei Huang To: dev@dpdk.org, thomas@monjalon.net, rosen.xu@intel.com, nipun.gupta@nxp.com, hemant.agrawal@nxp.com Cc: stable@dpdk.org, tianfei.zhang@intel.com, qi.z.zhang@intel.com, ferruh.yigit@intel.com, Wei Huang Subject: [PATCH v1] raw/ifpga: remove vdev when ifpga is closed Date: Thu, 10 Mar 2022 21:39:19 -0500 Message-Id: <20220311023919.1505021-1-wei.huang@intel.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Virtual devices created on ifpga raw device are not removed when ifpga is closed. To avoid such problem, ifpga virtual device remove function is implemented, virtual device is removed in raw device close function. Signed-off-by: Wei Huang Acked-by: Tianfei Zhang Acked-by: Rosen Xu --- drivers/raw/ifpga/ifpga_rawdev.c | 137 +++++++++++++++++++++++++++++---------- drivers/raw/ifpga/ifpga_rawdev.h | 8 +++ 2 files changed, 109 insertions(+), 36 deletions(-) diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c index 26c1366..9f4a3ce 100644 --- a/drivers/raw/ifpga/ifpga_rawdev.c +++ b/drivers/raw/ifpga/ifpga_rawdev.c @@ -134,6 +134,8 @@ struct ifpga_rawdev * for (i = 0; i < IFPGA_MAX_IRQ; i++) dev->intr_handle[i] = NULL; dev->poll_enabled = 0; + for (i = 0; i < IFPGA_MAX_VDEV; i++) + dev->vdev_name[i] = NULL; return dev; } @@ -735,10 +737,24 @@ static int set_surprise_link_check_aer( static int ifpga_rawdev_close(struct rte_rawdev *dev) { + struct ifpga_rawdev *ifpga_rdev = NULL; struct opae_adapter *adapter; + char *vdev_name = NULL; + int i = 0; if (dev) { - ifpga_monitor_stop_func(ifpga_rawdev_get(dev)); + ifpga_rdev = ifpga_rawdev_get(dev); + if (ifpga_rdev) { + for (i = 0; i < IFPGA_MAX_VDEV; i++) { + vdev_name = ifpga_rdev->vdev_name[i]; + if (!rte_vdev_uninit(vdev_name)) { + rte_free(vdev_name); + ifpga_rdev->vdev_name[i] = NULL; + } + } + ifpga_monitor_stop_func(ifpga_rdev); + ifpga_rdev->rawdev = NULL; + } adapter = ifpga_rawdev_get_priv(dev); if (adapter) { opae_adapter_destroy(adapter); @@ -1637,8 +1653,6 @@ static int fme_clean_fme_error(struct opae_manager *mgr) return -EINVAL; } dev = ifpga_rawdev_get(rawdev); - if (dev) - dev->rawdev = NULL; adapter = ifpga_rawdev_get_priv(rawdev); if (!adapter) @@ -1713,73 +1727,113 @@ static int ifpga_rawdev_get_string_arg(const char *key __rte_unused, return 0; } + static int -ifpga_cfg_probe(struct rte_vdev_device *dev) +ifpga_vdev_parse_devargs(struct rte_devargs *devargs, + struct ifpga_vdev_args *args) { - struct rte_devargs *devargs; - struct rte_kvargs *kvlist = NULL; - struct rte_rawdev *rawdev = NULL; - struct ifpga_rawdev *ifpga_dev; - int port; + struct rte_kvargs *kvlist; char *name = NULL; - char dev_name[RTE_RAWDEV_NAME_MAX_LEN]; - int ret = -1; + int port = 0; + int ret = -EINVAL; - devargs = dev->device.devargs; + if (!devargs || !args) + return ret; kvlist = rte_kvargs_parse(devargs->args, valid_args); if (!kvlist) { - IFPGA_RAWDEV_PMD_LOG(ERR, "error when parsing param"); - goto end; + IFPGA_RAWDEV_PMD_ERR("error when parsing devargs"); + return ret; } if (rte_kvargs_count(kvlist, IFPGA_ARG_NAME) == 1) { if (rte_kvargs_process(kvlist, IFPGA_ARG_NAME, - &ifpga_rawdev_get_string_arg, - &name) < 0) { + &ifpga_rawdev_get_string_arg, &name) < 0) { IFPGA_RAWDEV_PMD_ERR("error to parse %s", - IFPGA_ARG_NAME); + IFPGA_ARG_NAME); goto end; + } else { + strlcpy(args->bdf, name, sizeof(args->bdf)); + rte_free(name); } } else { IFPGA_RAWDEV_PMD_ERR("arg %s is mandatory for ifpga bus", - IFPGA_ARG_NAME); + IFPGA_ARG_NAME); goto end; } if (rte_kvargs_count(kvlist, IFPGA_ARG_PORT) == 1) { - if (rte_kvargs_process(kvlist, - IFPGA_ARG_PORT, - &rte_ifpga_get_integer32_arg, - &port) < 0) { + if (rte_kvargs_process(kvlist, IFPGA_ARG_PORT, + &rte_ifpga_get_integer32_arg, &port) < 0) { IFPGA_RAWDEV_PMD_ERR("error to parse %s", IFPGA_ARG_PORT); goto end; + } else { + args->port = port; } } else { IFPGA_RAWDEV_PMD_ERR("arg %s is mandatory for ifpga bus", - IFPGA_ARG_PORT); + IFPGA_ARG_PORT); goto end; } + ret = 0; + +end: + if (kvlist) + rte_kvargs_free(kvlist); + + return ret; +} + +static int +ifpga_cfg_probe(struct rte_vdev_device *vdev) +{ + struct rte_rawdev *rawdev = NULL; + struct ifpga_rawdev *ifpga_dev; + struct ifpga_vdev_args args; + char dev_name[RTE_RAWDEV_NAME_MAX_LEN]; + int i, n, ret = 0; + + IFPGA_RAWDEV_PMD_INFO("probe ifpga_rawdev_cfg %s", vdev->device.name); + + ret = ifpga_vdev_parse_devargs(vdev->device.devargs, &args); + if (ret) + return ret; + memset(dev_name, 0, sizeof(dev_name)); - snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%s", name); + snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "IFPGA:%s", args.bdf); rawdev = rte_rawdev_pmd_get_named_dev(dev_name); if (!rawdev) - goto end; + return -ENODEV; ifpga_dev = ifpga_rawdev_get(rawdev); if (!ifpga_dev) - goto end; + return -ENODEV; - memset(dev_name, 0, sizeof(dev_name)); - snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "%d|%s", - port, name); + for (i = 0; i < IFPGA_MAX_VDEV; i++) { + if (ifpga_dev->vdev_name[i] == NULL) { + n = strlen(vdev->device.name) + 1; + ifpga_dev->vdev_name[i] = rte_malloc(NULL, n, 0); + if (ifpga_dev->vdev_name[i] == NULL) + return -ENOMEM; + strlcpy(ifpga_dev->vdev_name[i], vdev->device.name, n); + break; + } + } + + if (i >= IFPGA_MAX_VDEV) { + IFPGA_RAWDEV_PMD_ERR("Can't create more virtual device!"); + return -ENOENT; + } + snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "%d|%s", + args.port, args.bdf); ret = rte_eal_hotplug_add(RTE_STR(IFPGA_BUS_NAME), - dev_name, devargs->args); -end: - rte_kvargs_free(kvlist); - free(name); + dev_name, vdev->device.devargs->args); + if (ret) { + rte_free(ifpga_dev->vdev_name[i]); + ifpga_dev->vdev_name[i] = NULL; + } return ret; } @@ -1787,10 +1841,21 @@ static int ifpga_rawdev_get_string_arg(const char *key __rte_unused, static int ifpga_cfg_remove(struct rte_vdev_device *vdev) { - IFPGA_RAWDEV_PMD_INFO("Remove ifpga_cfg %p", - vdev); + struct ifpga_vdev_args args; + char dev_name[RTE_RAWDEV_NAME_MAX_LEN]; + int ret = 0; - return 0; + IFPGA_RAWDEV_PMD_INFO("remove ifpga_rawdev_cfg %s", vdev->device.name); + + ret = ifpga_vdev_parse_devargs(vdev->device.devargs, &args); + if (ret) + return ret; + + snprintf(dev_name, RTE_RAWDEV_NAME_MAX_LEN, "%d|%s", + args.port, args.bdf); + ret = rte_eal_hotplug_remove(RTE_STR(IFPGA_BUS_NAME), dev_name); + + return ret; } static struct rte_vdev_driver ifpga_cfg_driver = { diff --git a/drivers/raw/ifpga/ifpga_rawdev.h b/drivers/raw/ifpga/ifpga_rawdev.h index 857b734..eb9a9a5 100644 --- a/drivers/raw/ifpga/ifpga_rawdev.h +++ b/drivers/raw/ifpga/ifpga_rawdev.h @@ -50,6 +50,7 @@ enum ifpga_rawdev_device_state { #define IFPGA_RAWDEV_MSIX_IRQ_NUM 7 #define IFPGA_RAWDEV_NUM 32 +#define IFPGA_MAX_VDEV 4 #define IFPGA_MAX_IRQ 12 struct ifpga_rawdev { @@ -64,6 +65,13 @@ struct ifpga_rawdev { void *intr_handle[IFPGA_MAX_IRQ]; /* enable monitor thread poll device's sensors or not */ int poll_enabled; + /* name of virtual devices created on raw device */ + char *vdev_name[IFPGA_MAX_VDEV]; +}; + +struct ifpga_vdev_args { + char bdf[8]; + int port; }; struct ifpga_rawdev * -- 1.8.3.1