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 B8086A0093 for ; Tue, 19 May 2020 15:00:02 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B10101C239; Tue, 19 May 2020 15:00:02 +0200 (CEST) Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) by dpdk.org (Postfix) with ESMTP id CEAF81D5DE for ; Tue, 19 May 2020 14:59:59 +0200 (CEST) Received: by mail-wr1-f50.google.com with SMTP id v12so15746874wrp.12 for ; Tue, 19 May 2020 05:59:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=tp7JEJwBke99WXyfzUvgtuyFSOmYybLaNs4jfGKRwyI=; b=ibnkKScJJ8BldNS5pbk3zjTpi0QmtlFvs6s6TeDSHxo/sp49nA6jh3NAnD0/CBKKCk VedZXZw1Y9kNCmjY+482UpToocyBKWorfHcMTnbN7QcTmkn+1s1Cd67Yyc2V5HZKp030 kqnSI65+YIWDc1ericQ7Mqa/R90dIXk8tXgye3uAvtliB5WkO9Jnnq/cuGppCD6Vepqw eFGY9CX1rMPtuSL6GnVmDgPbB6Hc/XDkAzwvwQXbbSVkfFB8zJc63LT6SemJ9RazuF8R Ijo5meMydKgi1nkUFvcuaJvFoB5N1KHli25Kp9JDywNb7rkz/UxRj4D0UBVRIw4ehmIc 3FHQ== 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=tp7JEJwBke99WXyfzUvgtuyFSOmYybLaNs4jfGKRwyI=; b=R/UFA7qInssBwAG6ARd7cUZla12nj/l8FU4zMM4keFDFThVhVkqSPDLkR8Z09M5o7d aww23cMGQ0ks9UfN2yo7W7FilbCLv9LiQJy1gP/FOGAB2DCCS2ji9Vpc2S8dlyXt6nfz WF5mObPg8zM/enQPCKCkxN4wcbUxTTuiBAUYPN+mquRKT1u3MdAGifavRLGihDDhPNqk JbfYLe/KbeK1posVTx0ckO/dYRwN6teM0VcIOnJa5z7QWBP5bIxvQdk7Yy25Ea5SWpb4 Ws4zKWwF5uM6lgxOjb4D8TiVu2DmIOTzb3FteQY5rEONCsf/6ZjJC3oEYmSjZcOX92xj YX3A== X-Gm-Message-State: AOAM530LlYWzqs8UoHwGSmjvJ8Cs5pDvRsUQzl/IlIx2BFJUIJpzKrJi ZajufqhEreTYuQDGwjrHxu8= X-Google-Smtp-Source: ABdhPJxKDojr0/PHJO/oeubEYrgiBb+jlWjU1oawD+JqrUSCO4GV+iK9DP63FtHtkNM5o0j5Ms8ABQ== X-Received: by 2002:adf:97db:: with SMTP id t27mr22790008wrb.261.1589893199524; Tue, 19 May 2020 05:59:59 -0700 (PDT) Received: from localhost ([88.98.246.218]) by smtp.gmail.com with ESMTPSA id z18sm3622152wmk.46.2020.05.19.05.59.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 May 2020 05:59:59 -0700 (PDT) From: luca.boccassi@gmail.com To: Mit Matelske Cc: Bruce Richardson , dpdk stable Date: Tue, 19 May 2020 13:54:02 +0100 Message-Id: <20200519125804.104349-52-luca.boccassi@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200519125804.104349-1-luca.boccassi@gmail.com> References: <20200519125804.104349-1-luca.boccassi@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] patch 'eal/freebsd: fix queuing duplicate alarm callbacks' has been queued to stable release 19.11.3 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 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 Sender: "stable" Hi, FYI, your patch has been queued to stable release 19.11.3 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 05/21/20. 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. Thanks. Luca Boccassi --- >From 46cd0c98bbb46a3548f291d800b7f80e1ac4965e Mon Sep 17 00:00:00 2001 From: Mit Matelske Date: Wed, 20 Nov 2019 14:10:56 -0600 Subject: [PATCH] eal/freebsd: fix queuing duplicate alarm callbacks [ upstream commit bcf789da7335b80e792ba926b5a95a12fa2e1e9a ] The source callback list grows infinitely when more than alarm is queued. This fix recognizes that an alarm interrupt in FreeBSD should never have more than one callback on its list, so if rte_intr_callback_register() is called with an interrupt handle type of RTE_INTR_HANDLE_ALARM, so if such an interrupt type already has a non-empty list, then a new callback is not created, but the kevent timer is restarted properly. Fixes: 23150bd8d8a8 ("eal/bsd: add interrupt thread") Signed-off-by: Mit Matelske Acked-by: Bruce Richardson --- lib/librte_eal/freebsd/eal/eal_interrupts.c | 79 +++++++++++---------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/lib/librte_eal/freebsd/eal/eal_interrupts.c b/lib/librte_eal/freebsd/eal/eal_interrupts.c index f6831b7902..3fee762be9 100644 --- a/lib/librte_eal/freebsd/eal/eal_interrupts.c +++ b/lib/librte_eal/freebsd/eal/eal_interrupts.c @@ -83,9 +83,9 @@ int rte_intr_callback_register(const struct rte_intr_handle *intr_handle, rte_intr_callback_fn cb, void *cb_arg) { - struct rte_intr_callback *callback = NULL; - struct rte_intr_source *src = NULL; - int ret, add_event; + struct rte_intr_callback *callback; + struct rte_intr_source *src; + int ret, add_event = 0; /* first do parameter checking */ if (intr_handle == NULL || intr_handle->fd < 0 || cb == NULL) { @@ -98,47 +98,53 @@ rte_intr_callback_register(const struct rte_intr_handle *intr_handle, return -ENODEV; } - /* allocate a new interrupt callback entity */ - callback = calloc(1, sizeof(*callback)); - if (callback == NULL) { - RTE_LOG(ERR, EAL, "Can not allocate memory\n"); - return -ENOMEM; - } - callback->cb_fn = cb; - callback->cb_arg = cb_arg; - callback->pending_delete = 0; - callback->ucb_fn = NULL; - rte_spinlock_lock(&intr_lock); - /* check if there is at least one callback registered for the fd */ + /* find the source for this intr_handle */ TAILQ_FOREACH(src, &intr_sources, next) { - if (src->intr_handle.fd == intr_handle->fd) { - /* we had no interrupts for this */ - if (TAILQ_EMPTY(&src->callbacks)) - add_event = 1; - - TAILQ_INSERT_TAIL(&(src->callbacks), callback, next); - ret = 0; + if (src->intr_handle.fd == intr_handle->fd) break; - } } - /* no existing callbacks for this - add new source */ - if (src == NULL) { - src = calloc(1, sizeof(*src)); - if (src == NULL) { + /* if this is an alarm interrupt and it already has a callback, + * then we don't want to create a new callback because the only + * thing on the list should be eal_alarm_callback() and we may + * be called just to reset the timer. + */ + if (src != NULL && src->intr_handle.type == RTE_INTR_HANDLE_ALARM && + !TAILQ_EMPTY(&src->callbacks)) { + callback = NULL; + } else { + /* allocate a new interrupt callback entity */ + callback = calloc(1, sizeof(*callback)); + if (callback == NULL) { RTE_LOG(ERR, EAL, "Can not allocate memory\n"); ret = -ENOMEM; goto fail; - } else { - src->intr_handle = *intr_handle; - TAILQ_INIT(&src->callbacks); - TAILQ_INSERT_TAIL(&(src->callbacks), callback, next); - TAILQ_INSERT_TAIL(&intr_sources, src, next); + } + callback->cb_fn = cb; + callback->cb_arg = cb_arg; + callback->pending_delete = 0; + callback->ucb_fn = NULL; + + if (src == NULL) { + src = calloc(1, sizeof(*src)); + if (src == NULL) { + RTE_LOG(ERR, EAL, "Can not allocate memory\n"); + ret = -ENOMEM; + goto fail; + } else { + src->intr_handle = *intr_handle; + TAILQ_INIT(&src->callbacks); + TAILQ_INSERT_TAIL(&intr_sources, src, next); + } + } + + /* we had no interrupts for this */ + if (TAILQ_EMPTY(&src->callbacks)) add_event = 1; - ret = 0; - } + + TAILQ_INSERT_TAIL(&(src->callbacks), callback, next); } /* add events to the queue. timer events are special as we need to @@ -178,11 +184,12 @@ rte_intr_callback_register(const struct rte_intr_handle *intr_handle, } rte_spinlock_unlock(&intr_lock); - return ret; + return 0; fail: /* clean up */ if (src != NULL) { - TAILQ_REMOVE(&(src->callbacks), callback, next); + if (callback != NULL) + TAILQ_REMOVE(&(src->callbacks), callback, next); if (TAILQ_EMPTY(&(src->callbacks))) { TAILQ_REMOVE(&intr_sources, src, next); free(src); -- 2.20.1 --- Diff of the applied patch vs upstream commit (please double-check if non-empty: --- --- - 2020-05-19 13:56:20.973900822 +0100 +++ 0052-eal-freebsd-fix-queuing-duplicate-alarm-callbacks.patch 2020-05-19 13:56:18.283502971 +0100 @@ -1,8 +1,10 @@ -From bcf789da7335b80e792ba926b5a95a12fa2e1e9a Mon Sep 17 00:00:00 2001 +From 46cd0c98bbb46a3548f291d800b7f80e1ac4965e Mon Sep 17 00:00:00 2001 From: Mit Matelske Date: Wed, 20 Nov 2019 14:10:56 -0600 Subject: [PATCH] eal/freebsd: fix queuing duplicate alarm callbacks +[ upstream commit bcf789da7335b80e792ba926b5a95a12fa2e1e9a ] + The source callback list grows infinitely when more than alarm is queued. @@ -14,7 +16,6 @@ timer is restarted properly. Fixes: 23150bd8d8a8 ("eal/bsd: add interrupt thread") -Cc: stable@dpdk.org Signed-off-by: Mit Matelske Acked-by: Bruce Richardson @@ -23,7 +24,7 @@ 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/lib/librte_eal/freebsd/eal/eal_interrupts.c b/lib/librte_eal/freebsd/eal/eal_interrupts.c -index ce2a27b4a5..00991f26a9 100644 +index f6831b7902..3fee762be9 100644 --- a/lib/librte_eal/freebsd/eal/eal_interrupts.c +++ b/lib/librte_eal/freebsd/eal/eal_interrupts.c @@ -83,9 +83,9 @@ int