From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?iso-8859-1?Q?Ga=EBtan?= Rivet Subject: Re: [PATCH] net/failsafe: fix Rx interrupt reinstallation Date: Wed, 14 Feb 2018 14:52:27 +0100 Message-ID: <20180214135227.o7lddtw5jmnnec7u@bidouze.vm.6wind.com> References: <1518562772-29823-1-git-send-email-matan@mellanox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit Cc: dev@dpdk.org To: Matan Azrad Return-path: Received: from mail-wr0-f195.google.com (mail-wr0-f195.google.com [209.85.128.195]) by dpdk.org (Postfix) with ESMTP id 522691B21E for ; Wed, 14 Feb 2018 14:52:42 +0100 (CET) Received: by mail-wr0-f195.google.com with SMTP id k32so16758wrk.4 for ; Wed, 14 Feb 2018 05:52:42 -0800 (PST) Content-Disposition: inline In-Reply-To: <1518562772-29823-1-git-send-email-matan@mellanox.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Hi Matan, On Tue, Feb 13, 2018 at 10:59:32PM +0000, Matan Azrad wrote: > Fail-safe dev_start() operation can be called by both the application > and the hot-plug alarm mechanism. > > The installation of Rx interrupt are triggered from dev_start() in any > time it is called while actually the Rx interrupt should be installed > only by the application calls. > > So, each plug-in event causes reinstallation which causes memory leak. > > Trigger the Rx interrupt installation only for application calls. > > Fixes: 9e0360aebf23 ("net/failsafe: register as Rx interrupt mode") > > Signed-off-by: Matan Azrad > --- > drivers/net/failsafe/failsafe_ops.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c > index 057e435..bbbd335 100644 > --- a/drivers/net/failsafe/failsafe_ops.c > +++ b/drivers/net/failsafe/failsafe_ops.c > @@ -181,10 +181,12 @@ > int ret; > > fs_lock(dev, 0); > - ret = failsafe_rx_intr_install(dev); > - if (ret) { > - fs_unlock(dev, 0); > - return ret; > + if (PRIV(dev)->alarm_lock == 0) { I dislike having to rely on unrelated context of execution to decide a code-path. I'd prefer to make interrupt installation dependent on the interrupt state instead. I think it should be possible to forbid reinstallation within failsafe_rx_intr_install directly, e.g. diff --git a/drivers/net/failsafe/failsafe_intr.c b/drivers/net/failsafe/failsafe_intr.c index f6ff04dc8..46c3aa5f2 100644 --- a/drivers/net/failsafe/failsafe_intr.c +++ b/drivers/net/failsafe/failsafe_intr.c @@ -523,7 +523,8 @@ failsafe_rx_intr_install(struct rte_eth_dev *dev) const struct rte_intr_conf *const intr_conf = &priv->dev->data->dev_conf.intr_conf; - if (intr_conf->rxq == 0) + if (intr_conf->rxq == 0 || + dev->intr_handle != NULL) return 0; if (fs_rx_intr_vec_install(priv) < 0) return -rte_errno; This way the logic is self-dependent and the check limited to this component. There might be better way to do this, it's only an example to explain my point. > + ret = failsafe_rx_intr_install(dev); > + if (ret) { > + fs_unlock(dev, 0); > + return ret; > + } > } > FOREACH_SUBDEV(sdev, i, dev) { > if (sdev->state != DEV_ACTIVE) > -- > 1.9.5 > -- Gaëtan Rivet 6WIND