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 BDA46A00C2 for ; Tue, 8 Mar 2022 15:16:26 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B931A40DDB; Tue, 8 Mar 2022 15:16:26 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 095A4406B4 for ; Tue, 8 Mar 2022 15:16:24 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1646748984; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pTnAT0//ZVkDQbQONoX+x6530L9RtRNOzBsJ9Gm6TDI=; b=RNLfgTwhcDi0WPJAj2zbRakh6tQiQ9o7sO3LtCJW5BxeC7+gtU6xO/7fsIs+xLG2fp/ep8 YPK6/+iuxdHPAdLiVlbC/9pZVrNgDcqPhLK1R432gpXavSypkAi7jxK5ShN7p7IL7Rpw04 IvuE4qDyk4YopNa46i9tB4Vu6DxSxBQ= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-614-KS9da2yhNrGyy1d9UR57Lg-1; Tue, 08 Mar 2022 09:16:22 -0500 X-MC-Unique: KS9da2yhNrGyy1d9UR57Lg-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 40937801AEB; Tue, 8 Mar 2022 14:16:21 +0000 (UTC) Received: from rh.Home (unknown [10.39.195.190]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3D6BB84034; Tue, 8 Mar 2022 14:16:20 +0000 (UTC) From: Kevin Traynor To: Wei Huang Cc: Tianfei Zhang , dpdk stable Subject: patch 'raw/ifpga: fix interrupt handle allocation' has been queued to stable release 21.11.1 Date: Tue, 8 Mar 2022 14:14:53 +0000 Message-Id: <20220308141500.286915-38-ktraynor@redhat.com> In-Reply-To: <20220308141500.286915-1-ktraynor@redhat.com> References: <20220308141500.286915-1-ktraynor@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=ktraynor@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII" 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 Hi, FYI, your patch has been queued to stable release 21.11.1 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 03/14/22. So please shout if anyone has objections. Also note that after the patch there's a diff of the upstream commit vs the patch applied to the branch. This will indicate if there was any rebasing needed to apply to the stable branch. If there were code changes for rebasing (ie: not only metadata diffs), please double check that the rebase was correctly done. Queued patches are on a temporary branch at: https://github.com/kevintraynor/dpdk-stable This queued commit can be viewed at: https://github.com/kevintraynor/dpdk-stable/commit/3d2cba4108dabd7fec774c0dfffb1b4e0876e4b8 Thanks. Kevin --- >From 3d2cba4108dabd7fec774c0dfffb1b4e0876e4b8 Mon Sep 17 00:00:00 2001 From: Wei Huang Date: Fri, 18 Feb 2022 02:38:48 -0500 Subject: [PATCH] raw/ifpga: fix interrupt handle allocation [ upstream commit 20659eb38099033b9aa4f7476a7ba7b5d3258569 ] Allocate FPGA interrupt handle instance for each card. Fixes: e0a1aafe2af9 ("raw/ifpga: introduce IRQ functions") Signed-off-by: Wei Huang Acked-by: Tianfei Zhang --- drivers/raw/ifpga/ifpga_rawdev.c | 94 +++++++++++++++++++------------- drivers/raw/ifpga/ifpga_rawdev.h | 7 ++- 2 files changed, 62 insertions(+), 39 deletions(-) diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c index 5baa0bdd47..c2e74518aa 100644 --- a/drivers/raw/ifpga/ifpga_rawdev.c +++ b/drivers/raw/ifpga/ifpga_rawdev.c @@ -72,8 +72,4 @@ static int ifpga_monitor_start; static pthread_t ifpga_monitor_start_thread; -#define IFPGA_MAX_IRQ 12 -/* 0 for FME interrupt, others are reserved for AFU irq */ -static struct rte_intr_handle *ifpga_irq_handle[IFPGA_MAX_IRQ]; - static struct ifpga_rawdev * ifpga_rawdev_allocate(struct rte_rawdev *rawdev); @@ -119,4 +115,5 @@ ifpga_rawdev_allocate(struct rte_rawdev *rawdev) struct ifpga_rawdev *dev; uint16_t dev_id; + int i = 0; dev = ifpga_rawdev_get(rawdev); @@ -135,4 +132,6 @@ ifpga_rawdev_allocate(struct rte_rawdev *rawdev) dev->rawdev = rawdev; dev->dev_id = dev_id; + for (i = 0; i < IFPGA_MAX_IRQ; i++) + dev->intr_handle[i] = NULL; return dev; @@ -1342,28 +1341,45 @@ fme_interrupt_handler(void *param) int -ifpga_unregister_msix_irq(enum ifpga_irq_type type, +ifpga_unregister_msix_irq(struct ifpga_rawdev *dev, enum ifpga_irq_type type, int vec_start, rte_intr_callback_fn handler, void *arg) { - struct rte_intr_handle *intr_handle; - int rc, i; + struct rte_intr_handle **intr_handle; + int rc = 0; + int i = vec_start + 1; + + if (!dev) + return -ENODEV; if (type == IFPGA_FME_IRQ) - intr_handle = ifpga_irq_handle[0]; + intr_handle = (struct rte_intr_handle **)&dev->intr_handle[0]; else if (type == IFPGA_AFU_IRQ) - intr_handle = ifpga_irq_handle[vec_start + 1]; + intr_handle = (struct rte_intr_handle **)&dev->intr_handle[i]; else - return 0; + return -EINVAL; - rte_intr_efd_disable(intr_handle); + if ((*intr_handle) == NULL) { + IFPGA_RAWDEV_PMD_ERR("%s interrupt %d not registered\n", + type == IFPGA_FME_IRQ ? "FME" : "AFU", + type == IFPGA_FME_IRQ ? 0 : vec_start); + return -ENOENT; + } - rc = rte_intr_callback_unregister(intr_handle, handler, arg); + rte_intr_efd_disable(*intr_handle); + + rc = rte_intr_callback_unregister(*intr_handle, handler, arg); + if (rc < 0) { + IFPGA_RAWDEV_PMD_ERR("Failed to unregister %s interrupt %d\n", + type == IFPGA_FME_IRQ ? "FME" : "AFU", + type == IFPGA_FME_IRQ ? 0 : vec_start); + } else { + rte_intr_instance_free(*intr_handle); + *intr_handle = NULL; + } - for (i = 0; i < IFPGA_MAX_IRQ; i++) - rte_intr_instance_free(ifpga_irq_handle[i]); return rc; } int -ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, +ifpga_register_msix_irq(struct ifpga_rawdev *dev, int port_id, enum ifpga_irq_type type, int vec_start, int count, rte_intr_callback_fn handler, const char *name, @@ -1371,5 +1387,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, { int ret; - struct rte_intr_handle *intr_handle; + struct rte_intr_handle **intr_handle; struct opae_adapter *adapter; struct opae_manager *mgr; @@ -1377,12 +1393,8 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, int *intr_efds = NULL, nb_intr, i; - for (i = 0; i < IFPGA_MAX_IRQ; i++) { - ifpga_irq_handle[i] = - rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE); - if (ifpga_irq_handle[i] == NULL) - return -ENOMEM; - } + if (!dev || !dev->rawdev) + return -ENODEV; - adapter = ifpga_rawdev_get_priv(dev); + adapter = ifpga_rawdev_get_priv(dev->rawdev); if (!adapter) return -ENODEV; @@ -1393,30 +1405,38 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, if (type == IFPGA_FME_IRQ) { - intr_handle = ifpga_irq_handle[0]; + intr_handle = (struct rte_intr_handle **)&dev->intr_handle[0]; count = 1; } else if (type == IFPGA_AFU_IRQ) { - intr_handle = ifpga_irq_handle[vec_start + 1]; + i = vec_start + 1; + intr_handle = (struct rte_intr_handle **)&dev->intr_handle[i]; } else { return -EINVAL; } - if (rte_intr_type_set(intr_handle, RTE_INTR_HANDLE_VFIO_MSIX)) + if (*intr_handle) + return -EBUSY; + + *intr_handle = rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE); + if (!(*intr_handle)) + return -ENOMEM; + + if (rte_intr_type_set(*intr_handle, RTE_INTR_HANDLE_VFIO_MSIX)) return -rte_errno; - ret = rte_intr_efd_enable(intr_handle, count); + ret = rte_intr_efd_enable(*intr_handle, count); if (ret) return -ENODEV; - if (rte_intr_fd_set(intr_handle, - rte_intr_efds_index_get(intr_handle, 0))) + if (rte_intr_fd_set(*intr_handle, + rte_intr_efds_index_get(*intr_handle, 0))) return -rte_errno; IFPGA_RAWDEV_PMD_DEBUG("register %s irq, vfio_fd=%d, fd=%d\n", - name, rte_intr_dev_fd_get(intr_handle), - rte_intr_fd_get(intr_handle)); + name, rte_intr_dev_fd_get(*intr_handle), + rte_intr_fd_get(*intr_handle)); if (type == IFPGA_FME_IRQ) { struct fpga_fme_err_irq_set err_irq_set; - err_irq_set.evtfd = rte_intr_efds_index_get(intr_handle, + err_irq_set.evtfd = rte_intr_efds_index_get(*intr_handle, 0); @@ -1429,5 +1449,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, return -EINVAL; - nb_intr = rte_intr_nb_intr_get(intr_handle); + nb_intr = rte_intr_nb_intr_get(*intr_handle); intr_efds = calloc(nb_intr, sizeof(int)); @@ -1436,5 +1456,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, for (i = 0; i < nb_intr; i++) - intr_efds[i] = rte_intr_efds_index_get(intr_handle, i); + intr_efds[i] = rte_intr_efds_index_get(*intr_handle, i); ret = opae_acc_set_irq(acc, vec_start, count, intr_efds); @@ -1446,5 +1466,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, /* register interrupt handler using DPDK API */ - ret = rte_intr_callback_register(intr_handle, + ret = rte_intr_callback_register(*intr_handle, handler, (void *)arg); if (ret) { @@ -1548,5 +1568,5 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev, } - ret = ifpga_register_msix_irq(rawdev, 0, IFPGA_FME_IRQ, 0, 0, + ret = ifpga_register_msix_irq(dev, 0, IFPGA_FME_IRQ, 0, 0, fme_interrupt_handler, "fme_irq", mgr); if (ret) @@ -1605,5 +1625,5 @@ ifpga_rawdev_destroy(struct rte_pci_device *pci_dev) return -ENODEV; - if (ifpga_unregister_msix_irq(IFPGA_FME_IRQ, 0, + if (ifpga_unregister_msix_irq(dev, IFPGA_FME_IRQ, 0, fme_interrupt_handler, mgr) < 0) return -EINVAL; diff --git a/drivers/raw/ifpga/ifpga_rawdev.h b/drivers/raw/ifpga/ifpga_rawdev.h index 61c8366707..6e09afead3 100644 --- a/drivers/raw/ifpga/ifpga_rawdev.h +++ b/drivers/raw/ifpga/ifpga_rawdev.h @@ -51,4 +51,5 @@ ifpga_rawdev_get_priv(const struct rte_rawdev *rawdev) #define IFPGA_RAWDEV_MSIX_IRQ_NUM 7 #define IFPGA_RAWDEV_NUM 32 +#define IFPGA_MAX_IRQ 12 struct ifpga_rawdev { @@ -60,4 +61,6 @@ struct ifpga_rawdev { char fvl_bdf[8][16]; char parent_bdf[16]; + /* 0 for FME interrupt, others are reserved for AFU irq */ + void *intr_handle[IFPGA_MAX_IRQ]; }; @@ -71,10 +74,10 @@ enum ifpga_irq_type { int -ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, +ifpga_register_msix_irq(struct ifpga_rawdev *dev, int port_id, enum ifpga_irq_type type, int vec_start, int count, rte_intr_callback_fn handler, const char *name, void *arg); int -ifpga_unregister_msix_irq(enum ifpga_irq_type type, +ifpga_unregister_msix_irq(struct ifpga_rawdev *dev, enum ifpga_irq_type type, int vec_start, rte_intr_callback_fn handler, void *arg); -- 2.34.1 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2022-03-08 13:55:29.328249914 +0000 +++ 0038-raw-ifpga-fix-interrupt-handle-allocation.patch 2022-03-08 13:55:28.509315199 +0000 @@ -1 +1 @@ -From 20659eb38099033b9aa4f7476a7ba7b5d3258569 Mon Sep 17 00:00:00 2001 +From 3d2cba4108dabd7fec774c0dfffb1b4e0876e4b8 Mon Sep 17 00:00:00 2001 @@ -5,0 +6,2 @@ +[ upstream commit 20659eb38099033b9aa4f7476a7ba7b5d3258569 ] + @@ -9 +10,0 @@ -Cc: stable@dpdk.org @@ -19 +20 @@ -index 6beecb710a..cc569c5e71 100644 +index 5baa0bdd47..c2e74518aa 100644 @@ -44 +45 @@ -@@ -1341,28 +1340,45 @@ fme_interrupt_handler(void *param) +@@ -1342,28 +1341,45 @@ fme_interrupt_handler(void *param) @@ -101 +102 @@ -@@ -1370,5 +1386,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, +@@ -1371,5 +1387,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, @@ -108 +109 @@ -@@ -1376,12 +1392,8 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, +@@ -1377,12 +1393,8 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, @@ -124 +125 @@ -@@ -1392,30 +1404,38 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, +@@ -1393,30 +1405,38 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, @@ -172 +173 @@ -@@ -1428,5 +1448,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, +@@ -1429,5 +1449,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, @@ -179 +180 @@ -@@ -1435,5 +1455,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, +@@ -1436,5 +1456,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, @@ -186 +187 @@ -@@ -1445,5 +1465,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, +@@ -1446,5 +1466,5 @@ ifpga_register_msix_irq(struct rte_rawdev *dev, int port_id, @@ -193 +194 @@ -@@ -1547,5 +1567,5 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev, +@@ -1548,5 +1568,5 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev, @@ -200 +201 @@ -@@ -1604,5 +1624,5 @@ ifpga_rawdev_destroy(struct rte_pci_device *pci_dev) +@@ -1605,5 +1625,5 @@ ifpga_rawdev_destroy(struct rte_pci_device *pci_dev)