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 32C4CA054A;
	Thu, 18 Feb 2021 22:28:12 +0100 (CET)
Received: from [217.70.189.124] (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 9035A16084C;
	Thu, 18 Feb 2021 22:28:06 +0100 (CET)
Received: from FRA01-PR2-obe.outbound.protection.outlook.com
 (mail-eopbgr120110.outbound.protection.outlook.com [40.107.12.110])
 by mails.dpdk.org (Postfix) with ESMTP id 7D99C16084C
 for <dev@dpdk.org>; Thu, 18 Feb 2021 22:28:05 +0100 (CET)
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;
 b=bS87dOaesNeU3tMUFrmKPMgu2H5fOEd/Qnm10iOWSJaNzfXPbDqj6qZwdLuInni/pqy7ggJ+Tje/SNXftuKyl5jslqbjAm8U/SP+OTnK1cas0FsCnTZe/YTSff01wfZCOHTTSqWeM9b5foi4+EqzD1cBQa2N+mOfYv/m507c+F7dgPD8LApuz6Z6rXJ+I8LOBRHB1SMDQ2qty2dDc4eTAzjg0mpmTOZhwCGUmwNFUfB+LtgxrJOKYDE67zpgDp6/xe1odMQfPrUy/F3tzOixQ4eSFHgyWSsIG/2c/PnP18uyHc12ZTFor38ixg0e+5vbwtghrRHwAyiZW6sseLROlA==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; 
 s=arcselector9901;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=xE44bhuBbkIdDBGX4IoqfHU5L80IA+dfjTDtHeMk1MM=;
 b=RF2kPpgkl0hy/xxa+jfvOqA7FJOHqwfzVz5hpXKD7lxnMiSc7R5KgvLzJBCTWJuG3KENiXSsmA6y/F2KKutTXBal6OqLbzkDwUjLU10/qAll88kc9uCqKS2Pc8B2M5lOFrRcfdYrR+sGq0ntUt5nweQAb5GzohNwn6PQgD97PhRBrGZfTH1gdY0iW/1M23/y4ePCsZw6vPknPAgmrclgBWr4nIjR/RMTbuDO/OAcQaMRkpFC9HrxMAvz/2zfe2chNSwE7ngV6UirHeAOdKIxHruGhETFnJLTRrKte17urKObKBdU6xvTHHau+I9sM2KwXBWRQSj+vxkkNlmQ5QXUgw==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass
 smtp.mailfrom=ekinops.com; dmarc=pass action=none header.from=ekinops.com;
 dkim=pass header.d=ekinops.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ekinops.com;
 s=selector2;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=xE44bhuBbkIdDBGX4IoqfHU5L80IA+dfjTDtHeMk1MM=;
 b=oNxycQS29Wl4bhnu26QU/nfEF+83DG4KHnQaZlsQtY5rpVNjxwOkC0a9nQw1mVwREXPY+gAUpoTzdFBXJANVsTLiiWLJ0S7lRXdQXRsVWLlQm/7FmmruJG96wxsWm4wB+LIDHz6YtMYtsZ5wSpCb/IkYQvVI5ElGH1jbD8+5PRA=
Authentication-Results: intel.com; dkim=none (message not signed)
 header.d=none;intel.com; dmarc=none action=none header.from=ekinops.com;
Received: from PAZP264MB1413.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:188::5)
 by PAZP264MB1478.FRAP264.PROD.OUTLOOK.COM (2603:10a6:102:d9::9) with
 Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3846.38; Thu, 18 Feb
 2021 21:28:05 +0000
Received: from PAZP264MB1413.FRAP264.PROD.OUTLOOK.COM
 ([fe80::88bd:6160:5403:acdf]) by PAZP264MB1413.FRAP264.PROD.OUTLOOK.COM
 ([fe80::88bd:6160:5403:acdf%6]) with mapi id 15.20.3846.042; Thu, 18 Feb 2021
 21:28:04 +0000
From: Renata Saiakhova <Renata.Saiakhova@ekinops.com>
To: Anatoly Burakov <anatoly.burakov@intel.com>,
 Harman Kalra <hkalra@marvell.com>,
 Bruce Richardson <bruce.richardson@intel.com>,
 Ray Kinsella <mdr@ashroe.eu>, Neil Horman <nhorman@tuxdriver.com>
Cc: dev@dpdk.org,
	Renata Saiakhova <Renata.Saiakhova@ekinops.com>
Date: Thu, 18 Feb 2021 22:27:46 +0100
Message-Id: <20210218212746.3073-2-Renata.Saiakhova@ekinops.com>
X-Mailer: git-send-email 2.17.2
In-Reply-To: <20210218212746.3073-1-Renata.Saiakhova@ekinops.com>
References: <20210218212746.3073-1-Renata.Saiakhova@ekinops.com>
Content-Type: text/plain
X-Originating-IP: [91.183.184.98]
X-ClientProxiedBy: AM0PR04CA0112.eurprd04.prod.outlook.com
 (2603:10a6:208:55::17) To PAZP264MB1413.FRAP264.PROD.OUTLOOK.COM
 (2603:10a6:102:188::5)
MIME-Version: 1.0
X-MS-Exchange-MessageSentRepresentingType: 1
Received: from renataOAB.oneaccess.intra (91.183.184.98) by
 AM0PR04CA0112.eurprd04.prod.outlook.com (2603:10a6:208:55::17) with Microsoft
 SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
 15.20.3868.27 via Frontend Transport; Thu, 18 Feb 2021 21:28:04 +0000
X-MS-PublicTrafficType: Email
X-MS-Office365-Filtering-Correlation-Id: 810f2650-1737-4d04-24c8-08d8d45413d5
X-MS-TrafficTypeDiagnostic: PAZP264MB1478:
X-MS-Exchange-Transport-Forked: True
X-Microsoft-Antispam-PRVS: <PAZP264MB14784EB456AB4DFBF4B6EA7592859@PAZP264MB1478.FRAP264.PROD.OUTLOOK.COM>
X-MS-Oob-TLC-OOBClassifiers: OLM:5797;
X-MS-Exchange-SenderADCheck: 1
X-Microsoft-Antispam: BCL:0;
X-Microsoft-Antispam-Message-Info: rUhgOHFrLmeWx7CuubHlyVAoI1BXmpwUMsMZ5nhLhZnK/ZNLRFdUVX+5UNK08T0tZ445cvxQs8sZGAl2UJPmpz5PyExDLA/uR0qE9Zh3+U0lUqktEdJvwFGXj77FClThY0Nqgqti0Syvl/TBUueHoOvUMgOykBJz5sJ6jVRyTzq6luvqjm40/7iR9LDEMr7vg5pStGHyRyrVonFmSa8rK34OkCQFEV8dI3HVWxA0SWl6UjC5PdESUq6mlSRcF/5TNdHXSTLd67YMzGCGf6545kX0B4cuWgr7ERFmAd5OP3phz4kJxfxBhW2NB4m5i6Kg8jLA6aKHv8jvKtMsCxCFEbNit+NguCXxpYGtzIzHlYn04zB4WV+kyLf84JPtJL1qSn0zqRooGEmpBO3mU+T+73DmuJkEqntfsBgUd5RZBqVALH/OnX/I5C01PFjx8jn7Dy8DLk6Vm9NB568cH7YtjfAf1aQ6j9XLvMBP4Fzqg6l4RFBbiIDtDV8iDhxuPYHxB2Q5aaSKnfchKoB3iWHmrQ==
X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;
 IPV:NLI; SFV:NSPM; H:PAZP264MB1413.FRAP264.PROD.OUTLOOK.COM; PTR:; CAT:NONE;
 SFS:(39850400004)(376002)(396003)(366004)(346002)(136003)(5660300002)(1076003)(6486002)(6512007)(6506007)(6666004)(8936002)(956004)(2616005)(2906002)(36756003)(8676002)(110136005)(86362001)(478600001)(26005)(66946007)(52116002)(186003)(66476007)(83380400001)(66556008)(4326008)(16526019)(107886003)(316002);
 DIR:OUT; SFP:1102; 
X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?1EyUAy6Q5moymYUvn7hXOJ92dRMzXxteICj47+iYQYt8lR/CrW6pLemC3/ez?=
 =?us-ascii?Q?jNZYOEn6307zLYllGyp3OFM3mFgCYqLNO1Z7oiana254+ccA3knYqVTkFkDW?=
 =?us-ascii?Q?AY16lZXTAaSLU2w/VXh0Mz7jvW1v2uVXGqrPlA5GHlV145L+xArwocH+2/VX?=
 =?us-ascii?Q?1AE+ksd0+ZU0ohksOuGKaGKTRN5dDsFL2Wa4sgcd5j7c5D4om2NAF7a2IrjD?=
 =?us-ascii?Q?t590bmbEyXqrMwhQSjHzMUVQINRvVWMcekj3Uv0/VwIYmwQmxlqJ0FU7JXM8?=
 =?us-ascii?Q?uuxm6h4hHzHsT8cpfiUnVKOgNwNLv4RzooynZVlRFdRlvQQnJhm/txOQfSz8?=
 =?us-ascii?Q?Pc0XJzkkkI7XkWEcVwBArIteelm0pxymYbXAZqRgSj0iN1bs/gEW6v6BYwqJ?=
 =?us-ascii?Q?p6qomSRyv+EOOWIjpyVV9Wc7T1V1VSZsn6DFxha2pmt7NIpkGw1oFn08YNde?=
 =?us-ascii?Q?NvfeTXv/J7v8zHp81gtwe2Ky0ZCFXd3plR0KdiTn/pm9tnHxxwwui4x3NHLR?=
 =?us-ascii?Q?QlfWueIYc0SOxppf/A0j6RCXL4Ldkaa0A7umac/toX6emUsbwnyD6lbXbjVq?=
 =?us-ascii?Q?qf1kGNl1KYma/tlZfPJfXWzc3qIeXQLCMzSPi1Xg8hISqhIYxBC7UMDDKMSl?=
 =?us-ascii?Q?BI2s5dckF3JXmnU2UX2dkqEtaH5QNkFI0YKqFPEkY425FVtmKVFxTJGwB4El?=
 =?us-ascii?Q?WINIlv25pXmjXaqox58FSqVaRcpa8RKLde12flGTrvJjrceRL6zNDCjzeC/W?=
 =?us-ascii?Q?6Z8Y+1/sGi3uPFD61/QynJIozRz2RDSp/6E0aYH8GWWKQyCn8f5HXuMTWTYC?=
 =?us-ascii?Q?Itsa/5lW1PvgKLo1AcipAjyJWikIx2dTfyLb87mVakpEdjfnKAcPgec1flYe?=
 =?us-ascii?Q?eg4oyPLPsly8aCtpXO7JJqYcepmEGkKmXLA8sxhke5ZjAZ01tCvY2MnSuvEg?=
 =?us-ascii?Q?mNB8mqhrvjQnaLQDrcNXmVgVIeXIlUoFIjr7Geq3icKl5xT8ZFwt87ceJsqB?=
 =?us-ascii?Q?14auFvMCYtHzZmhSosBZRHgLe0YWz3g17NwmslKKWQLjtxhXjzQaKOdCjwhQ?=
 =?us-ascii?Q?9VSjKR1bl9KpFig6sB2qq5KCDNvFzjteWxjcnEO3tZoBzoFAkBlk9lsQI13m?=
 =?us-ascii?Q?R+Fpzr1JtY+KL3MzWvABWe24etkt8rCHeHFuKIBVKAHJxihARnHVoI9bXfj1?=
 =?us-ascii?Q?XLIaM4Eiu4qQSzibkEsSXzKBPeKBIz1B/5ctTWQXB2gSMHDDyrc0Ad5Hyk4s?=
 =?us-ascii?Q?/B5c/YRp6b4b1V6+7gcmMp2DBWJEF6NF5kgddSs3tSjRMzDJtdZOSl7BaX0F?=
 =?us-ascii?Q?/So8gD3hOJAha2XEuWMrRrMG?=
X-OriginatorOrg: ekinops.com
X-MS-Exchange-CrossTenant-Network-Message-Id: 810f2650-1737-4d04-24c8-08d8d45413d5
X-MS-Exchange-CrossTenant-AuthSource: PAZP264MB1413.FRAP264.PROD.OUTLOOK.COM
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Feb 2021 21:28:04.8689 (UTC)
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: f57b78a6-c654-4771-a72f-837275f46179
X-MS-Exchange-CrossTenant-MailboxType: HOSTED
X-MS-Exchange-CrossTenant-UserPrincipalName: HYQ8Bqluf26vmvWa0DMlMizeBVCGy1+sD/RE1diMekT4JdBjmsssBSTnE9+6HEKpwbPM9Hj8QR3t2tMGuKPNXdQSEEYiKrHkxapPad2fyXE=
X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAZP264MB1478
Subject: [dpdk-dev] [PATCH v4 1/1] eal/interrupts: add synchronous wrapper
 around unregister
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
Sender: "dev" <dev-bounces@dpdk.org>

Avoid race with unregister interrupt handler if interrupt
source has some active callbacks at the moment, use wrapper
around rte_intr_callback_unregister() to check for -EAGAIN
return value and to loop until rte_intr_callback_unregister()
succeeds.

Signed-off-by: Renata Saiakhova <Renata.Saiakhova@ekinops.com>
Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
 drivers/bus/pci/linux/pci_vfio.c        |  2 +-
 lib/librte_eal/freebsd/eal_interrupts.c | 12 ++++++++++++
 lib/librte_eal/include/rte_interrupts.h | 25 +++++++++++++++++++++++++
 lib/librte_eal/linux/eal_interrupts.c   | 12 ++++++++++++
 lib/librte_eal/version.map              |  1 +
 5 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c
index e3f7b6abe..c14f7f8c4 100644
--- a/drivers/bus/pci/linux/pci_vfio.c
+++ b/drivers/bus/pci/linux/pci_vfio.c
@@ -414,7 +414,7 @@ pci_vfio_disable_notifier(struct rte_pci_device *dev)
 		return -1;
 	}
 
-	ret = rte_intr_callback_unregister(&dev->vfio_req_intr_handle,
+	ret = rte_intr_callback_unregister_sync(&dev->vfio_req_intr_handle,
 					   pci_vfio_req_handler,
 					   (void *)&dev->device);
 	if (ret < 0) {
diff --git a/lib/librte_eal/freebsd/eal_interrupts.c b/lib/librte_eal/freebsd/eal_interrupts.c
index 72eeacbc1..86810845f 100644
--- a/lib/librte_eal/freebsd/eal_interrupts.c
+++ b/lib/librte_eal/freebsd/eal_interrupts.c
@@ -345,6 +345,18 @@ rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle,
 	return ret;
 }
 
+int
+rte_intr_callback_unregister_sync(const struct rte_intr_handle *intr_handle,
+		rte_intr_callback_fn cb_fn, void *cb_arg)
+{
+	int ret = 0;
+
+	while ((ret = rte_intr_callback_unregister(intr_handle, cb_fn, cb_arg)) == -EAGAIN)
+		rte_pause();
+
+	return ret;
+}
+
 int
 rte_intr_enable(const struct rte_intr_handle *intr_handle)
 {
diff --git a/lib/librte_eal/include/rte_interrupts.h b/lib/librte_eal/include/rte_interrupts.h
index e3b406abc..cc3bf45d8 100644
--- a/lib/librte_eal/include/rte_interrupts.h
+++ b/lib/librte_eal/include/rte_interrupts.h
@@ -94,6 +94,31 @@ rte_intr_callback_unregister_pending(const struct rte_intr_handle *intr_handle,
 				rte_intr_callback_fn cb_fn, void *cb_arg,
 				rte_intr_unregister_callback_fn ucb_fn);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ *
+ * Loop until rte_intr_callback_unregister() succeeds.
+ * After a call to this function,
+ * the callback provided by the specified interrupt handle is unregistered.
+ *
+ * @param intr_handle
+ *  pointer to the interrupt handle.
+ * @param cb
+ *  callback address.
+ * @param cb_arg
+ *  address of parameter for callback, (void *)-1 means to remove all
+ *  registered which has the same callback address.
+ *
+ * @return
+ *  - On success, return the number of callback entities removed.
+ *  - On failure, a negative value.
+ */
+__rte_experimental
+int
+rte_intr_callback_unregister_sync(const struct rte_intr_handle *intr_handle,
+				rte_intr_callback_fn cb, void *cb_arg);
+
 /**
  * It enables the interrupt for the specified handle.
  *
diff --git a/lib/librte_eal/linux/eal_interrupts.c b/lib/librte_eal/linux/eal_interrupts.c
index 1dd994bd1..22b3b7bcd 100644
--- a/lib/librte_eal/linux/eal_interrupts.c
+++ b/lib/librte_eal/linux/eal_interrupts.c
@@ -662,6 +662,18 @@ rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle,
 	return ret;
 }
 
+int
+rte_intr_callback_unregister_sync(const struct rte_intr_handle *intr_handle,
+			rte_intr_callback_fn cb_fn, void *cb_arg)
+{
+	int ret = 0;
+
+	while ((ret = rte_intr_callback_unregister(intr_handle, cb_fn, cb_arg)) == -EAGAIN)
+		rte_pause();
+
+	return ret;
+}
+
 int
 rte_intr_enable(const struct rte_intr_handle *intr_handle)
 {
diff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map
index fce90a112..56caa9cc9 100644
--- a/lib/librte_eal/version.map
+++ b/lib/librte_eal/version.map
@@ -318,6 +318,7 @@ EXPERIMENTAL {
 	rte_fbarray_find_rev_biggest_free;
 	rte_fbarray_find_rev_biggest_used;
 	rte_intr_callback_unregister_pending;
+	rte_intr_callback_unregister_sync;
 	rte_realloc_socket;
 
 	# added in 19.08
-- 
2.17.2