From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id 6A4E542526;
	Wed,  6 Sep 2023 15:00:35 +0200 (CEST)
Received: from mails.dpdk.org (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 319AF402B8;
	Wed,  6 Sep 2023 15:00:31 +0200 (CEST)
Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com
 [209.85.214.173])
 by mails.dpdk.org (Postfix) with ESMTP id 9537140270
 for <dev@dpdk.org>; Wed,  6 Sep 2023 13:48:04 +0200 (CEST)
Received: by mail-pl1-f173.google.com with SMTP id
 d9443c01a7336-1bf6ea270b2so19370845ad.0
 for <dev@dpdk.org>; Wed, 06 Sep 2023 04:48:04 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=arista.com; s=google; t=1694000884; x=1694605684; darn=dpdk.org;
 h=content-transfer-encoding:mime-version:references:in-reply-to
 :message-id:date:subject:cc:to:from:from:to:cc:subject:date
 :message-id:reply-to;
 bh=ewtZR/0Oe1tKguj5xCMER+TZkaUCSm+Tao90j5rNAuQ=;
 b=VXBOsJJ4Sio0c1LUIvG6ytcWb/q1ZrEouw7gYmxMpOEFaneEdpgyePS3sJbQ3Bg+ib
 dNqR8hzSJjOvo/8DcJ7AkaktyrJIisakl0OtDL5LTB7D+kVNrgBEb33InJBEmdfqLg6T
 T3xRW7MTSVrRN1p/1a/Z1NFBc6PmEgtUC9WUa9JztXTFN6QjPMNoiSryTzxginK5S5Yq
 MglkEyckKsR4BTImTlivYoRJHmvGkeuYDPmtw7V1+fwIZTZLIj/E4CA9kuWzYtuCSLEv
 vJkaQEIYu92n+s4RkROROmoIvhFYkBC+3EFXDRo0dtJIReSsD4nk2E3uxxsCWGBVrgNE
 MZ5w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20221208; t=1694000884; x=1694605684;
 h=content-transfer-encoding:mime-version:references:in-reply-to
 :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc
 :subject:date:message-id:reply-to;
 bh=ewtZR/0Oe1tKguj5xCMER+TZkaUCSm+Tao90j5rNAuQ=;
 b=Zq65uQS6ARU20o/pafJRUJzMjo48wbdo4XOLELP580PkB8zdzgrqziIuyrnjAxplpi
 BGXy/1MCBGf5sxWccYdeTEk0hbZNaEUchV7A3FnWrmv1GWMSpm75WfoVZE7IhtcFMgXr
 xyzhgeiLPWSRkuBuGrLMDpUMwBjrqwWIjjt8H/w2oxWBFJlnpsLs5Ga11JhqQSEOQYWz
 tDxc1c/4vgR4xLYi9TUia8QLMG3kH0COmZ877Zi1+z1nOAoosHhKPK7SDHrb9QHLGNj5
 95X6Y4cHslhM1bwCX7L8PGFIJ2Ltsut1SbVEEaeu9dD9QKa5n0a8pU8wkmIGOD3gH/oT
 Hx6w==
X-Gm-Message-State: AOJu0Yw13DbxOsZzYoeE36tpnkVOXqEXIad9h/3+1TG9Aus6RbtAiyi3
 pgVY0Ks+z4yDzJxDgA2GZthpog==
X-Google-Smtp-Source: AGHT+IGJNdeQG9gpkG6Hrbfd2eb/MLHsMs3osvSj6B02Y9zeF6K+oVuQK4nk3ILQxGtj0+45BD+VdA==
X-Received: by 2002:a17:902:b94c:b0:1c0:ec0a:316a with SMTP id
 h12-20020a170902b94c00b001c0ec0a316amr12466860pls.36.1694000883501; 
 Wed, 06 Sep 2023 04:48:03 -0700 (PDT)
Received: from saurabhs-sfelagsubintfimpl-0.sjc.aristanetworks.com
 ([74.123.28.17]) by smtp.gmail.com with ESMTPSA id
 9-20020a170902c14900b001bc445e249asm10961485plj.124.2023.09.06.04.48.02
 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);
 Wed, 06 Sep 2023 04:48:03 -0700 (PDT)
From: Saurabh Singhal <saurabhs@arista.com>
To: Thomas Monjalon <thomas@monjalon.net>, Jingjing Wu <jingjing.wu@intel.com>,
 Beilei Xing <beilei.xing@intel.com>
Cc: dev@dpdk.org,
	Saurabh Singhal <saurabhs@arista.com>
Subject: [PATCH v2] net/iavf: unregister intr handler before FD close
Date: Wed,  6 Sep 2023 04:47:49 -0700
Message-ID: <20230906114750.74496-1-saurabhs@arista.com>
X-Mailer: git-send-email 2.41.0
In-Reply-To: <DM4PR11MB59948C0DE908D32B3311C44FD7EFA@DM4PR11MB5994.namprd11.prod.outlook.com>
References: <DM4PR11MB59948C0DE908D32B3311C44FD7EFA@DM4PR11MB5994.namprd11.prod.outlook.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-Mailman-Approved-At: Wed, 06 Sep 2023 15:00:28 +0200
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org

Unregister VFIO interrupt handler before the interrupt fd gets closed in
case iavf_dev_init() returns an error.

dpdk creates a standalone thread named eal-intr-thread for processing
interrupts for the PCI devices. The interrupt handler callbacks are
registered by the VF driver(iavf, in this case).

When we do a PCI probe of the network interfaces, we register an
interrupt handler, open a vfio-device fd using ioctl, and an eventfd in
dpdk. These interrupt sources are registered in a global linked list
that the eal-intr-thread keeps iterating over for handling the
interrupts. In our internal testing, we see eal-intr-thread crash in
these two ways:

Error adding fd 660 epoll_ctl, Operation not permitted

or

Error adding fd 660 epoll_ctl, Bad file descriptor

epoll_ctl() returns EPERM if the target fd does not support poll.
It returns EBADF when the epoll fd itself is closed or the target fd is
closed.

When the first type of crash happens, we see that the fd 660 is
anon_inode:[vfio-device] which does not support poll.

When the second type of crash happens, we could see from the fd map of
the crashing process that the fd 660 was already closed.

This means the said fd has been closed and in certain cases may have
been reassigned to a different device by the operating system but the
eal-intr-thread does not know about it.

We observed that these crashes were always accompanied by an error in
iavf_dev_init() after rte_intr_callback_register() and
iavf_enable_irq0() have already happened. In the error path, the
intr_handle_fd was being closed but the interrupt handler wasn't being
unregistered.

The fix is to unregister the interrupt handle in the
iavf_dev_init() error path.

Ensure proper cleanup if iavf_security_init() or
iavf_security_ctx_create() fail. Earlier, we were leaking memory by
simply returning from iavf_dev_init().

Signed-off-by: Saurabh Singhal <saurabhs@arista.com>
---
 .mailmap                       |  1 +
 drivers/net/iavf/iavf_ethdev.c | 22 ++++++++++++++++++++--
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/.mailmap b/.mailmap
index 864d33ee46..4dac53011b 100644
--- a/.mailmap
+++ b/.mailmap
@@ -1227,6 +1227,7 @@ Satananda Burla <sburla@marvell.com>
 Satha Rao <skoteshwar@marvell.com> <skoteshwar@caviumnetworks.com>
 Satheesh Paul <psatheesh@marvell.com>
 Sathesh Edara <sedara@marvell.com>
+Saurabh Singhal <saurabhs@arista.com>
 Savinay Dharmappa <savinay.dharmappa@intel.com>
 Scott Branden <scott.branden@broadcom.com>
 Scott Daniels <daniels@research.att.com>
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index f2fc5a5621..b7ed22889a 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -133,6 +133,8 @@ static int iavf_dev_rx_queue_intr_enable(struct rte_eth_dev *dev,
 					uint16_t queue_id);
 static int iavf_dev_rx_queue_intr_disable(struct rte_eth_dev *dev,
 					 uint16_t queue_id);
+static void iavf_dev_interrupt_handler(void *param);
+static inline void iavf_disable_irq0(struct iavf_hw *hw);
 static int iavf_dev_flow_ops_get(struct rte_eth_dev *dev,
 				 const struct rte_flow_ops **ops);
 static int iavf_set_mc_addr_list(struct rte_eth_dev *dev,
@@ -2709,13 +2711,13 @@ iavf_dev_init(struct rte_eth_dev *eth_dev)
 		ret = iavf_security_ctx_create(adapter);
 		if (ret) {
 			PMD_INIT_LOG(ERR, "failed to create ipsec crypto security instance");
-			return ret;
+			goto flow_init_err;
 		}
 
 		ret = iavf_security_init(adapter);
 		if (ret) {
 			PMD_INIT_LOG(ERR, "failed to initialized ipsec crypto resources");
-			return ret;
+			goto security_init_err;
 		}
 	}
 
@@ -2728,7 +2730,23 @@ iavf_dev_init(struct rte_eth_dev *eth_dev)
 
 	return 0;
 
+security_init_err:
+	iavf_security_ctx_destroy(adapter);
+
 flow_init_err:
+	iavf_disable_irq0(hw);
+
+	if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR) {
+		/* disable uio intr before callback unregiser */
+		rte_intr_disable(intr_handle);
+
+		/* unregister callback func from eal lib */
+		rte_intr_callback_unregister(intr_handle,
+					     iavf_dev_interrupt_handler, dev);
+	} else {
+		rte_eal_alarm_cancel(iavf_dev_alarm_handler, dev);
+	}
+
 	rte_free(eth_dev->data->mac_addrs);
 	eth_dev->data->mac_addrs = NULL;
 
-- 
2.41.0