From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7FB88A04C7; Wed, 16 Sep 2020 06:30:50 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EB5DA1C1B9; Wed, 16 Sep 2020 06:29:18 +0200 (CEST) Received: from mail-pg1-f228.google.com (mail-pg1-f228.google.com [209.85.215.228]) by dpdk.org (Postfix) with ESMTP id 5D9761C19F for ; Wed, 16 Sep 2020 06:29:10 +0200 (CEST) Received: by mail-pg1-f228.google.com with SMTP id f2so3189636pgd.3 for ; Tue, 15 Sep 2020 21:29:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FQzT+6hZC7WTzdOc1bPCDCutmq9LRg209TnWfHVhXiw=; b=BnOh+YUV5rTUnaKvIrqss1HORRsMOuRmS2PsE+1Ine5LP+6IkRWpiS5w7gk0fekalP xaWl40ikjWRQNnVX0zkJC+WSKVTfL9QT8OJkrgsMLBlckln45mcfaP89XhBzS2CHw5HZ Z6NC0p2ysMS6ZLRev1VYOreeacjJpPUHEp7Ps= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FQzT+6hZC7WTzdOc1bPCDCutmq9LRg209TnWfHVhXiw=; b=pGGaC1bR+s6aVKoOebJknuZmC+gqb+/Rc7BtjEqR/xQPdTyY2MLB1AiQyQ3uq3mrZx nRetQxNiJ1fP1Ap6i5Y7/5NwZAs6xQD6hcWeM4F+Rz9sJUkx3vObIN4kL2GLyu1uSZLa YimFiR4fbvesIdm9RouSXptCkgh0uMqn2PPYhugAEmsIbLNW72/YLVHxl0IEqK89jV27 txDSKeAm18sWvaTZZPxkXtTQb7h4HPwUYh0llBn9oej1B4sEdVjZFjI43nufnebKXLSh RGmWTvE5FG0+xld4B/KniLoq97NF3surMLRdiNc7tcRNZv31Ka/PpJZpwbOjDWn+hgFd o/xA== X-Gm-Message-State: AOAM531WeE7OynRfigEiGZsYJ0Q4DQAQHfUM1UR+L4Y+YEO/8rc7hHM0 O7og5TLCxrFBJy8YT0HOyYNuNHXYTAByELSfx2Urw241PHQuC1qTAli6Af91Ilr1Du0bi3sfG3E 55WTpCAUMo3wXULpumNypRXZKqEr82NzUjTUX1vWlO3gYOw3tuKJDMQY+Dhocd7RO9/fF25Er4x d53w== X-Google-Smtp-Source: ABdhPJzsm7CJtxTVKaK/Txl8aJ37AnQr5UY5M3sCbkjvzCcmhaqcJB0ss4I2cjSdF68zALfw87Okn/imKsVI X-Received: by 2002:a62:a513:0:b029:142:2501:39f6 with SMTP id v19-20020a62a5130000b0290142250139f6mr4711908pfm.69.1600230549331; Tue, 15 Sep 2020 21:29:09 -0700 (PDT) Received: from localhost.localdomain ([192.19.223.252]) by smtp-relay.gmail.com with ESMTPS id hk6sm132636pjb.6.2020.09.15.21.29.08 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Sep 2020 21:29:09 -0700 (PDT) X-Relaying-Domain: broadcom.com From: Ajit Khaparde To: dev@dpdk.org Cc: Kishore Padmanabha , Mike Baucom , Shahaji Bhosle Date: Tue, 15 Sep 2020 21:28:36 -0700 Message-Id: <20200916042851.32914-11-ajit.khaparde@broadcom.com> X-Mailer: git-send-email 2.21.1 (Apple Git-122.3) In-Reply-To: <20200916042851.32914-1-ajit.khaparde@broadcom.com> References: <20200911015603.88359-1-ajit.khaparde@broadcom.com> <20200916042851.32914-1-ajit.khaparde@broadcom.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v2 10/25] net/bnxt: refactor VFR port clean up X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Kishore Padmanabha When parent VF or PF ports are cleaned up, the child VF representor ports also need to be cleaned up. If not cleaned up, then deleting the parent VF shall result in not cleaning up the hardware rules and updating the firmware of VFR removal. The issue can occur even when application is exited without deleting VFR ports. Signed-off-by: Kishore Padmanabha Reviewed-by: Mike Baucom Reviewed-by: Shahaji Bhosle Reviewed-by: Ajit Khaparde --- drivers/net/bnxt/bnxt_ethdev.c | 20 ++++++++++++++-- drivers/net/bnxt/bnxt_reps.c | 38 ++++++++++++++++++++++++++---- drivers/net/bnxt/bnxt_reps.h | 1 + drivers/net/bnxt/tf_ulp/bnxt_ulp.c | 4 ++-- 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c index 445c40820..890888531 100644 --- a/drivers/net/bnxt/bnxt_ethdev.c +++ b/drivers/net/bnxt/bnxt_ethdev.c @@ -1309,6 +1309,9 @@ static void bnxt_dev_stop_op(struct rte_eth_dev *eth_dev) /* disable uio/vfio intr/eventfd mapping */ rte_intr_disable(intr_handle); + /* Stop the child representors for this device */ + bnxt_vf_rep_stop_all(bp); + /* delete the bnxt ULP port details */ bnxt_ulp_port_deinit(bp); @@ -3724,8 +3727,13 @@ bnxt_filter_ctrl_op(struct rte_eth_dev *dev, struct bnxt_vf_representor *vfr = dev->data->dev_private; bp = vfr->parent_dev->data->dev_private; /* parent is deleted while children are still valid */ - if (!bp) + if (!bp) { + PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR Error %d:%d\n", + dev->data->port_id, + filter_type, + filter_op); return -EIO; + } } ret = is_bnxt_in_error(bp); @@ -5927,8 +5935,12 @@ static int bnxt_pci_remove_dev_with_reps(struct rte_eth_dev *eth_dev) vf_rep_eth_dev = bp->rep_info[i].vfr_eth_dev; if (!vf_rep_eth_dev) continue; + PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR pci remove\n", + vf_rep_eth_dev->data->port_id); rte_eth_dev_destroy(vf_rep_eth_dev, bnxt_vf_representor_uninit); } + PMD_DRV_LOG(DEBUG, "BNXT Port:%d pci remove\n", + eth_dev->data->port_id); ret = rte_eth_dev_destroy(eth_dev, bnxt_dev_uninit); return ret; @@ -6055,6 +6067,8 @@ static int bnxt_rep_port_probe(struct rte_pci_device *pci_dev, ret = -ENODEV; return ret; } + PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR pci probe\n", + backing_eth_dev->data->port_id); backing_bp->rep_info[representor.vf_id].vfr_eth_dev = vf_rep_eth_dev; backing_bp->num_reps++; @@ -6103,7 +6117,8 @@ static int bnxt_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, backing_eth_dev = rte_eth_dev_allocated(pci_dev->device.name); } - + PMD_DRV_LOG(DEBUG, "BNXT Port:%d pci probe\n", + backing_eth_dev->data->port_id); /* probe representor ports now */ ret = bnxt_rep_port_probe(pci_dev, eth_da, backing_eth_dev); @@ -6122,6 +6137,7 @@ static int bnxt_pci_remove(struct rte_pci_device *pci_dev) * +ve value will at least help in proper cleanup */ + PMD_DRV_LOG(DEBUG, "BNXT Port:%d pci remove\n", eth_dev->data->port_id); if (rte_eal_process_type() == RTE_PROC_PRIMARY) { if (eth_dev->data->dev_flags & RTE_ETH_DEV_REPRESENTOR) return rte_eth_dev_destroy(eth_dev, diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c index 00e44bce5..b975d5af0 100644 --- a/drivers/net/bnxt/bnxt_reps.c +++ b/drivers/net/bnxt/bnxt_reps.c @@ -166,6 +166,7 @@ int bnxt_vf_representor_init(struct rte_eth_dev *eth_dev, void *params) struct rte_eth_link *link; struct bnxt *parent_bp; + PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR init\n", eth_dev->data->port_id); vf_rep_bp->vf_id = rep_params->vf_id; vf_rep_bp->switch_domain_id = rep_params->switch_domain_id; vf_rep_bp->parent_dev = rep_params->parent_dev; @@ -216,15 +217,18 @@ int bnxt_vf_representor_uninit(struct rte_eth_dev *eth_dev) struct bnxt *parent_bp; struct bnxt_vf_representor *rep = (struct bnxt_vf_representor *)eth_dev->data->dev_private; - uint16_t vf_id; + PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR uninit\n", eth_dev->data->port_id); eth_dev->data->mac_addrs = NULL; eth_dev->dev_ops = NULL; parent_bp = rep->parent_dev->data->dev_private; - if (!parent_bp) + if (!parent_bp) { + PMD_DRV_LOG(DEBUG, "BNXT Port:%d already freed\n", + eth_dev->data->port_id); return 0; + } parent_bp->num_reps--; vf_id = rep->vf_id; @@ -296,7 +300,8 @@ static int bnxt_tf_vfr_alloc(struct rte_eth_dev *vfr_ethdev) vfr->vf_id, rc); (void)bnxt_ulp_delete_vfr_default_rules(vfr); } - + BNXT_TF_DBG(DEBUG, "BNXT Port:%d VFR created and initialized\n", + vfr->dpdk_port_id); return rc; } @@ -361,6 +366,7 @@ int bnxt_vf_rep_dev_start_op(struct rte_eth_dev *eth_dev) parent_bp = rep_bp->parent_dev->data->dev_private; rep_info = &parent_bp->rep_info[rep_bp->vf_id]; + BNXT_TF_DBG(DEBUG, "BNXT Port:%d VFR start\n", eth_dev->data->port_id); pthread_mutex_lock(&rep_info->vfr_start_lock); if (!rep_info->conduit_valid) { rc = bnxt_get_dflt_vnic_svif(parent_bp, rep_bp); @@ -386,6 +392,7 @@ int bnxt_vf_rep_dev_start_op(struct rte_eth_dev *eth_dev) static int bnxt_tf_vfr_free(struct bnxt_vf_representor *vfr) { + BNXT_TF_DBG(DEBUG, "BNXT Port:%d VFR ulp free\n", vfr->dpdk_port_id); return bnxt_ulp_delete_vfr_default_rules(vfr); } @@ -401,8 +408,11 @@ static int bnxt_vfr_free(struct bnxt_vf_representor *vfr) } parent_bp = vfr->parent_dev->data->dev_private; - if (!parent_bp) + if (!parent_bp) { + PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR already freed\n", + vfr->dpdk_port_id); return 0; + } /* Check if representor has been already freed in FW */ if (!vfr->vfr_tx_cfa_action) @@ -432,6 +442,8 @@ void bnxt_vf_rep_dev_stop_op(struct rte_eth_dev *eth_dev) eth_dev->rx_pkt_burst = &bnxt_dummy_recv_pkts; eth_dev->tx_pkt_burst = &bnxt_dummy_xmit_pkts; + BNXT_TF_DBG(DEBUG, "BNXT Port:%d VFR stop\n", eth_dev->data->port_id); + bnxt_vfr_free(vfr_bp); if (eth_dev->data->dev_started) @@ -442,6 +454,7 @@ void bnxt_vf_rep_dev_stop_op(struct rte_eth_dev *eth_dev) void bnxt_vf_rep_dev_close_op(struct rte_eth_dev *eth_dev) { + BNXT_TF_DBG(DEBUG, "BNXT Port:%d VFR close\n", eth_dev->data->port_id); bnxt_vf_representor_uninit(eth_dev); } @@ -721,3 +734,20 @@ int bnxt_vf_rep_stats_reset_op(struct rte_eth_dev *eth_dev) } return 0; } + +void bnxt_vf_rep_stop_all(struct bnxt *bp) +{ + uint16_t vf_id; + struct rte_eth_dev *rep_eth_dev; + + /* No vfrep ports just exit */ + if (!bp->rep_info) + return; + + for (vf_id = 0; vf_id < BNXT_MAX_VF_REPS; vf_id++) { + rep_eth_dev = bp->rep_info[vf_id].vfr_eth_dev; + if (!rep_eth_dev) + continue; + bnxt_vf_rep_dev_stop_op(rep_eth_dev); + } +} diff --git a/drivers/net/bnxt/bnxt_reps.h b/drivers/net/bnxt/bnxt_reps.h index 418b95afc..d877b0823 100644 --- a/drivers/net/bnxt/bnxt_reps.h +++ b/drivers/net/bnxt/bnxt_reps.h @@ -42,4 +42,5 @@ void bnxt_vf_rep_dev_close_op(struct rte_eth_dev *eth_dev); int bnxt_vf_rep_stats_get_op(struct rte_eth_dev *eth_dev, struct rte_eth_stats *stats); int bnxt_vf_rep_stats_reset_op(struct rte_eth_dev *eth_dev); +void bnxt_vf_rep_stop_all(struct bnxt *bp); #endif /* _BNXT_REPS_H_ */ diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c index 63d453ffb..272536473 100644 --- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c +++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c @@ -905,7 +905,7 @@ bnxt_ulp_port_init(struct bnxt *bp) } /* create the default rules */ bnxt_ulp_create_df_rules(bp); - BNXT_TF_DBG(DEBUG, "ULP Port:%d created and initialized\n", + BNXT_TF_DBG(DEBUG, "BNXT Port:%d ULP port init\n", bp->eth_dev->data->port_id); return rc; @@ -940,7 +940,7 @@ bnxt_ulp_port_deinit(struct bnxt *bp) return; } - BNXT_TF_DBG(DEBUG, "ULP Port:%d destroyed\n", + BNXT_TF_DBG(DEBUG, "BNXT Port:%d ULP port deinit\n", bp->eth_dev->data->port_id); /* Get the session details */ -- 2.21.1 (Apple Git-122.3)