From patchwork Mon Aug 17 14:08:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Renata Saiakhova X-Patchwork-Id: 75581 X-Patchwork-Delegate: david.marchand@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id A370FA0351; Mon, 17 Aug 2020 16:09:16 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7812F1C121; Mon, 17 Aug 2020 16:09:16 +0200 (CEST) Received: from FRA01-MR2-obe.outbound.protection.outlook.com (mail-eopbgr90100.outbound.protection.outlook.com [40.107.9.100]) by dpdk.org (Postfix) with ESMTP id 0EA7F1C11B for ; Mon, 17 Aug 2020 16:09:15 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=n7Tvu6eDqUmrZdiOK46+XpFEMFyRHpIOA5nDbjiCeAysUXFqR+FihhzWZnCSY3fuU4Er2aDU0QtZTCCz/UsEbqGT3GKd00vvKOvTfV78OEZcIuyAXXBtH4hDa9W9JbGw68L9xg0xBxVYoXMw3Ee5romOnQkqrnY+9TQkQDekT4Cvwd+dsaIpJcMBkPafCrmrLoCi7jFJOhdcFWrwTugIQfUbETjbvq32v7SFjmbqSpDjAoETF3n7ut3PBUSVMlnF1BMhHVqk5Mof69wau3GLvWwtJbWMKEeE6psye1l6E10y1PbvR/+ihs+dT/bGCgiO9JWSCTYaOscjy63Q6YsXKQ== 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=jqD0PXyp/VpOFIndLo+8YYux/dJRj1obEkwibfAfaxQ=; b=CCjYDwuRWK0RlKioueuCf2J90TXavsFFqHS5JkLVv2GP8OnHdD0mnvWsitjPUNv1sDT3iDr+uZTyh5jDMPGDPvbyHkLUvABVR8XvykvMIdsRq/ADr4UkUL06wbnfgpYWBRbZi+1XvLsqg20D3+UC845/d+Qt68vPSprqn5hkvUCF+Y+OQ/gGZLl8mg8MbitPLmcLKaaZ+WTNLKOfWRTlZhzezSn7+YfdE5vdqmaVgyg678ZAOWWaotdpLxpBCwV4wt2yakI4hHvhjzkz3dE0QR5zHxIw3tpoIqKD5aC4mazov7p0PQFFiFugNvJWSppU6r34pCTZxqbHs1MjAYZeLw== 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=jqD0PXyp/VpOFIndLo+8YYux/dJRj1obEkwibfAfaxQ=; b=ZwXF44QE0uvX5/Gp8qDJtZo37WOKf4sD1yRBUINXYbXE++DVgyrmGv31TzrJZF+V283upF+/nLHdApD1hBt/0+6ybN3loFF6ft3K4T/JTGnBiBdvSii9A0MBkPG/H7iCNmO46ihO3LoDAtXagWqf+TRaB5P6KsPsEYQlUqehHxs= Authentication-Results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=ekinops.com; Received: from MRXP264MB0120.FRAP264.PROD.OUTLOOK.COM (2603:10a6:500:1b::10) by MR2P264MB0737.FRAP264.PROD.OUTLOOK.COM (2603:10a6:500:2::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3283.24; Mon, 17 Aug 2020 14:09:14 +0000 Received: from MRXP264MB0120.FRAP264.PROD.OUTLOOK.COM ([fe80::f1e9:2264:9185:a3e6]) by MRXP264MB0120.FRAP264.PROD.OUTLOOK.COM ([fe80::f1e9:2264:9185:a3e6%2]) with mapi id 15.20.3283.028; Mon, 17 Aug 2020 14:09:14 +0000 From: Renata Saiakhova To: Anatoly Burakov , Harman Kalra , Bruce Richardson , Ray Kinsella , Neil Horman Cc: dev@dpdk.org, Renata Saiakhova Date: Mon, 17 Aug 2020 16:08:27 +0200 Message-Id: <20200817140828.9769-2-Renata.Saiakhova@ekinops.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20200817140828.9769-1-Renata.Saiakhova@ekinops.com> References: <20200817140828.9769-1-Renata.Saiakhova@ekinops.com> X-ClientProxiedBy: AM0PR01CA0119.eurprd01.prod.exchangelabs.com (2603:10a6:208:168::24) To MRXP264MB0120.FRAP264.PROD.OUTLOOK.COM (2603:10a6:500:1b::10) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from renataOAB.oneaccess.intra (91.183.184.98) by AM0PR01CA0119.eurprd01.prod.exchangelabs.com (2603:10a6:208:168::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3283.15 via Frontend Transport; Mon, 17 Aug 2020 14:09:13 +0000 X-Mailer: git-send-email 2.17.2 X-Originating-IP: [91.183.184.98] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1dc7ab7f-d175-4a3c-6f7a-08d842b71f30 X-MS-TrafficTypeDiagnostic: MR2P264MB0737: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:5797; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 5NdsvommuLdk8I5cXqNKvR9+sv7uQLS2BLWIeaYOCz0e55Q9y0DGbf3efxVZRLyVtehznbYYh5In3Zyoejc0Gl2z0t29I4SLPAvi9xrWJbHYh1Vy75ADZyHGF0HYCEnCoT3qSGxIXWYOo/JkTHM/rdW718T9c/BJhj3smNR2Wd3ym8RmYTfhjENkDD233xbYGTpZLrJuOOcjMyBEil4iALBOC3Sqc7yc6tjPRHJkiMLVa0MwCSJ783Pw8tzGB8lF8k+05xwYVbOxgThkD8Rrdg+YARg8R2mOsQFZrkAGuEIS8hI5Rhm3hRdNtIOHtiofieOhi101qs7LPZpRqIOOjw== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:MRXP264MB0120.FRAP264.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(366004)(136003)(396003)(39850400004)(376002)(346002)(8936002)(52116002)(8676002)(6506007)(6486002)(36756003)(478600001)(107886003)(1076003)(5660300002)(6512007)(86362001)(110136005)(316002)(66556008)(6666004)(66946007)(66476007)(2906002)(956004)(2616005)(4326008)(26005)(83380400001)(186003)(16526019); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData: Oytg8b6HD+jef1qDta+8vmEwu+GJlfu5dBeQmOeFDH6Crpx7SGriB6RioS644UZmoCAagnaQPAJQFA0p5osMrTRHyo5MIp60XM8oHZqSp539fMZncwOeKcM4ZXUn3ZeijA1jsl6hVpQI0X432BIjCt2F+mYlKR1xqXHyAXmzgLlBNuUal+TR7Lx2VEmpuqVF+ER1GVLLITd5lvRh0RCB3q2jlIZGzGsn2JsRxq4Ef0KfwIVJBZ/ZHoKYTnwUZicydSCt1nIpcShgeLxr0IhSKUncBsJ9grBSOZN9qcJoeZkKt05LprcoQpV7opRtQyyO746CUlRgzf7B/gBPR+1ohYgNFuRBYwTitbMo24FExTacMreFP7dg6d65S2Yra5qQyvumlnN7AWbUCTVgZynO5looBvIKz73xlPmGzmAFhpVy343zF1MRTzb2ItHG2cV5g+3roPogf2R0YF3g0HJBXho2q+5bAXEB8j08Gi7JA3/nsYbOdcYizaAhLMbhT/Ba9HZjRvv3TrLxlf0YHG38wOTzCLMDhRo5laQeva90Hwe7wYNKrWqVMUJ1odGuI020qTr2Nqm3Sz5xOx/ICs4oQKZihL4rgH1aL5WMWXKFs1aKDtm/zDK5qI2vxAnmCz1dsOpSU6gnUacsJRId4kEg4A== X-OriginatorOrg: ekinops.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1dc7ab7f-d175-4a3c-6f7a-08d842b71f30 X-MS-Exchange-CrossTenant-AuthSource: MRXP264MB0120.FRAP264.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Aug 2020 14:09:14.4220 (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: r2g7DnNj0o5Oi/xUYK2ylu+KctdUvUVw/B5WOVQGwyQqCpYceqx4YVpWVsA5TyKeGX+kQof8+2MGgIDrr6YW4h27gKdhuuqJHDpE+8dxgzE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: MR2P264MB0737 Subject: [dpdk-dev] [PATCH v2 1/1] librte_eal: rte_intr_callback_unregister_sync() - wrapper around rte_intr_callback_unregister(). 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" Avoid race with unregister interrupt hanlder 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 Acked-by: Anatoly Burakov --- 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/rte_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 07e072e13..a4bfdf553 100644 --- a/drivers/bus/pci/linux/pci_vfio.c +++ b/drivers/bus/pci/linux/pci_vfio.c @@ -415,7 +415,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 6d53d33c8..7d99bdaff 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 13db5c4e8..c99d5dbd4 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/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index bf0c17c23..b1d824f59 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -325,6 +325,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