From patchwork Thu Aug 16 13:50:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Boccassi X-Patchwork-Id: 43737 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B8CFE4C87; Thu, 16 Aug 2018 15:50:52 +0200 (CEST) Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by dpdk.org (Postfix) with ESMTP id 4ADE849CF; Thu, 16 Aug 2018 15:50:51 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id a108-v6so1573452wrc.13; Thu, 16 Aug 2018 06:50:51 -0700 (PDT) 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; bh=jdlSLGN2bUj4gZzylPUKxXMDsg7i4UbGUSUDmqgIIW4=; b=YcznK6gOuCu3JpvbupalZ25aOh36B51UubZ7PCM7PGJrsD2bBtHSYwvt2pyof+s5kj mfCNca9Nb2gu504tURc+cupvBImnzbO3gqbdXIjviMB2IdY+wUyX62WUadXIgOti0+W2 pGTiQDkKJUYXM9d8OaUpHpJ+e15XdUQbEtQcE5f9OHOPa7HnBkz3sjvSgLl4j+cs2MUX V9dO9azfJSU3lEO1Zs9f9qcj9R4RXhzfCccDoQ86Oj0VbnRuKSJ5l41lDWW4t3S9CTNS P6504nw19nAJDykZ+MBN2TE6zfW6U/VHhJ+i/9AtBytfLKmvrQIgfc69QMkkHouMB8D/ +lWA== X-Gm-Message-State: AOUpUlF+n0tJvOiR0H8bNxPnq8pc+QNeX9F4IJWWPluJoHNqjiaViBUE VbskHBazDnAlDCINd7xb/fQLssn4J7w= X-Google-Smtp-Source: AA+uWPySk69tGSagw7BDY+VUWHKR/ueSH3UKV4z8cm+zAixhwiwAdneRXTHWqTbuCgR7D14h7dcKPw== X-Received: by 2002:adf:f410:: with SMTP id g16-v6mr19119619wro.256.1534427450644; Thu, 16 Aug 2018 06:50:50 -0700 (PDT) Received: from localhost ([2001:1be0:110d:fcfe:41aa:5bfa:6cf3:7531]) by smtp.gmail.com with ESMTPSA id n12-v6sm17727825wrm.62.2018.08.16.06.50.49 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 16 Aug 2018 06:50:49 -0700 (PDT) From: Luca Boccassi To: dev@dpdk.org Cc: maxime.coquelin@redhat.com, tiwei.bie@intel.com, yongwang@vmware.com, 3chas3@gmail.com, bruce.richardson@intel.com, jianfeng.tan@intel.com, anatoly.burakov@intel.com, Luca Boccassi , stable@dpdk.org, Brian Russell Date: Thu, 16 Aug 2018 14:50:30 +0100 Message-Id: <20180816135032.28283-2-bluca@debian.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180816135032.28283-1-bluca@debian.org> References: <20180816135032.28283-1-bluca@debian.org> Subject: [dpdk-dev] [PATCH 1/3] net/virtio: register/unregister intr handler on start/stop 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" Register and unregister the virtio interrupt handler when the device is started and stopped. This allows a virtio device to be hotplugged or unplugged. Fixes: c1f86306a026 ("virtio: add new driver") Cc: stable@dpdk.org Signed-off-by: Brian Russell Signed-off-by: Luca Boccassi --- drivers/net/virtio/virtio_ethdev.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 614357da74..3195443a1b 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1679,11 +1679,6 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) if (ret < 0) goto out; - /* Setup interrupt callback */ - if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) - rte_intr_callback_register(eth_dev->intr_handle, - virtio_interrupt_handler, eth_dev); - return 0; out: @@ -1709,11 +1704,6 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev) rte_free(eth_dev->data->mac_addrs); eth_dev->data->mac_addrs = NULL; - /* reset interrupt callback */ - if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) - rte_intr_callback_unregister(eth_dev->intr_handle, - virtio_interrupt_handler, - eth_dev); if (eth_dev->device) rte_pci_unmap_device(RTE_ETH_DEV_TO_PCI(eth_dev)); @@ -1972,6 +1962,12 @@ virtio_dev_start(struct rte_eth_dev *dev) dev->data->dev_conf.intr_conf.rxq) { virtio_intr_disable(dev); + /* Setup interrupt callback */ + if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) + rte_intr_callback_register(dev->intr_handle, + virtio_interrupt_handler, + dev); + if (virtio_intr_enable(dev) < 0) { PMD_DRV_LOG(ERR, "interrupt enable failed"); return -EIO; @@ -2081,9 +2077,17 @@ virtio_dev_stop(struct rte_eth_dev *dev) PMD_INIT_LOG(DEBUG, "stop"); rte_spinlock_lock(&hw->state_lock); - if (intr_conf->lsc || intr_conf->rxq) + if (intr_conf->lsc || intr_conf->rxq) { virtio_intr_disable(dev); + /* Reset interrupt callback */ + if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC) { + rte_intr_callback_unregister(dev->intr_handle, + virtio_interrupt_handler, + dev); + } + } + hw->started = 0; memset(&link, 0, sizeof(link)); rte_eth_linkstatus_set(dev, &link); From patchwork Thu Aug 16 13:50:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Boccassi X-Patchwork-Id: 43738 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 4D1174CBB; Thu, 16 Aug 2018 15:50:55 +0200 (CEST) Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by dpdk.org (Postfix) with ESMTP id 457AA4C8D; Thu, 16 Aug 2018 15:50:53 +0200 (CEST) Received: by mail-wr1-f66.google.com with SMTP id w11-v6so1663163wrc.5; Thu, 16 Aug 2018 06:50:53 -0700 (PDT) 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; bh=7Wr9677b5iwdExfPwcV+czGu85hikIoJgd8K24KjYBU=; b=S0ERiDQPWWezUAJmPrrkpCTfxYmIdzfGP19rW/jZcRae4en+6LOT8C+6JQcFOe7Qm2 ioyPB2hYmduLA+H9WKDZEKS95+1o+i0CoIPVc3L609eGLqYNpcg+NDpA4V9kQ0dIWvIZ mrt4m3RQO3cl7IRql700BvETDqZqjfRpI3g/5iSJDVjZ58klIGiq7Vwp54DO5h/RhxoF 2CFlxp7j9kvI8QRsdI7uD/bsChjfyAKKPpFdsQFrKzyLSjsyzDqP9jqeXWiPXwEEIIUw ydddrjR5lPaUSTLP83lQjvrsYrDadq9bUVP1yGM1pI65DEZcpmVRj9dak/Zw+/eCXiZx G1Ig== X-Gm-Message-State: AOUpUlGM3VlcMiipwsGfbaUrtcanlFaSVYa8iVmr3EyyyGxOwm2P7ATO Mr77PZOk6oqFAXFN/YvmkIHRNGRuOGI= X-Google-Smtp-Source: AA+uWPyM0F2FYYwdVxK19m2WlGE2Uh1+gBYqmuO8xgxaRHAGOSGtXpKbaAZcGReKgpRlzTBR59qDsw== X-Received: by 2002:adf:ee4e:: with SMTP id w14-v6mr19637957wro.63.1534427452431; Thu, 16 Aug 2018 06:50:52 -0700 (PDT) Received: from localhost ([2001:1be0:110d:fcfe:41aa:5bfa:6cf3:7531]) by smtp.gmail.com with ESMTPSA id t19-v6sm736489wmi.42.2018.08.16.06.50.51 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 16 Aug 2018 06:50:51 -0700 (PDT) From: Luca Boccassi To: dev@dpdk.org Cc: maxime.coquelin@redhat.com, tiwei.bie@intel.com, yongwang@vmware.com, 3chas3@gmail.com, bruce.richardson@intel.com, jianfeng.tan@intel.com, anatoly.burakov@intel.com, Luca Boccassi , stable@dpdk.org, Brian Russell Date: Thu, 16 Aug 2018 14:50:31 +0100 Message-Id: <20180816135032.28283-3-bluca@debian.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180816135032.28283-1-bluca@debian.org> References: <20180816135032.28283-1-bluca@debian.org> Subject: [dpdk-dev] [PATCH 2/3] net/vmxnet3: fix vmxnet3 dev_uninit() hot-unplug 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" The vmxnet3 driver can't call back into dev_close(), and possibly dev_stop(), in dev_uninit(). When dev_uninit() is called, anything that those routines would want to clean up has already been released. Further, for complete cleanup, it is necessary to release any of the queue resources during dev_close(). This allows a vmxnet3 device to be hot-unplugged without leaking queues. Fixes: dfaff37fc46d ("vmxnet3: import new vmxnet3 poll mode driver implementation") Cc: stable@dpdk.org Signed-off-by: Brian Russell Signed-off-by: Luca Boccassi --- drivers/net/vmxnet3/vmxnet3_ethdev.c | 36 ++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c index 2613cd1358..b5d4be5e24 100644 --- a/drivers/net/vmxnet3/vmxnet3_ethdev.c +++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c @@ -348,16 +348,11 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev) static int eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev) { - struct vmxnet3_hw *hw = eth_dev->data->dev_private; - PMD_INIT_FUNC_TRACE(); if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; - if (hw->adapter_stopped == 0) - vmxnet3_dev_close(eth_dev); - eth_dev->dev_ops = NULL; eth_dev->rx_pkt_burst = NULL; eth_dev->tx_pkt_burst = NULL; @@ -803,7 +798,7 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); if (hw->adapter_stopped == 1) { - PMD_INIT_LOG(DEBUG, "Device already closed."); + PMD_INIT_LOG(DEBUG, "Device already stopped."); return; } @@ -827,7 +822,6 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev) /* reset the device */ VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV); PMD_INIT_LOG(DEBUG, "Device reset."); - hw->adapter_stopped = 0; vmxnet3_dev_clear_queues(dev); @@ -837,6 +831,30 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev) link.link_speed = ETH_SPEED_NUM_10G; link.link_autoneg = ETH_LINK_FIXED; rte_eth_linkstatus_set(dev, &link); + + hw->adapter_stopped = 1; +} + +static void +vmxnet3_free_queues(struct rte_eth_dev *dev) +{ + int i; + + PMD_INIT_FUNC_TRACE(); + + for (i = 0; i < dev->data->nb_rx_queues; i++) { + void *rxq = dev->data->rx_queues[i]; + + vmxnet3_dev_rx_queue_release(rxq); + } + dev->data->nb_rx_queues = 0; + + for (i = 0; i < dev->data->nb_tx_queues; i++) { + void *txq = dev->data->tx_queues[i]; + + vmxnet3_dev_tx_queue_release(txq); + } + dev->data->nb_tx_queues = 0; } /* @@ -845,12 +863,10 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev) static void vmxnet3_dev_close(struct rte_eth_dev *dev) { - struct vmxnet3_hw *hw = dev->data->dev_private; - PMD_INIT_FUNC_TRACE(); vmxnet3_dev_stop(dev); - hw->adapter_stopped = 1; + vmxnet3_free_queues(dev); } static void From patchwork Thu Aug 16 13:50:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luca Boccassi X-Patchwork-Id: 43739 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E6AD14F91; Thu, 16 Aug 2018 15:50:57 +0200 (CEST) Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by dpdk.org (Postfix) with ESMTP id C02404CA1; Thu, 16 Aug 2018 15:50:54 +0200 (CEST) Received: by mail-wr1-f65.google.com with SMTP id u12-v6so4239091wrr.4; Thu, 16 Aug 2018 06:50:54 -0700 (PDT) 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; bh=OoN1luTMKuIv4XtXNZbAo4G+yixREYqmXo693o6dr9w=; b=mMg1IbkSEMRj16T9JI6psVrrlAyayrcP5pgO8MlKeuakImBzcW7UZwQWkKRVAelvNl bJ7evH/LAfiGCSSMMF5ezQgTMPvHgm5BSePSRZyxuIBuq8mPUNr1Aq+a8NylSp2ff3ec y8A78HKc9nUACHT8/eY21nqB0Z8+3nuqPScQv+pfv6eAYpv2+AdhdtU6IzmFn1McEL2W MwlHXXO/5EYtPD8qib5O8l6g9PGtUUnb21T0d37H3IjkN/dLO7FnmFhLVz6bGG8eQr+N ty/o7xeNf3myG8T8IlnovRjaq7KSpdyRJFYk6kLpAh2pqQ69t7JQ7Alio4HVjAPIJFeY iy1g== X-Gm-Message-State: AOUpUlH4OqZVo/MS0GZOe39brWcJFgpdmkJ/CoL+jZivl1AVcMysWYDp Ig5tQVqdpdBpSBRTBxpYPDLIOUssysg= X-Google-Smtp-Source: AA+uWPwsfDbBj+42Ugf61gyC8OWfQZ5ePRtcg1vR01OZocHA3neXba5sZxMCUryhMybBUw3BilyMEQ== X-Received: by 2002:adf:c890:: with SMTP id k16-v6mr697787wrh.6.1534427454171; Thu, 16 Aug 2018 06:50:54 -0700 (PDT) Received: from localhost ([2001:1be0:110d:fcfe:41aa:5bfa:6cf3:7531]) by smtp.gmail.com with ESMTPSA id n8-v6sm18450369wrt.56.2018.08.16.06.50.52 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 16 Aug 2018 06:50:53 -0700 (PDT) From: Luca Boccassi To: dev@dpdk.org Cc: maxime.coquelin@redhat.com, tiwei.bie@intel.com, yongwang@vmware.com, 3chas3@gmail.com, bruce.richardson@intel.com, jianfeng.tan@intel.com, anatoly.burakov@intel.com, Luca Boccassi , stable@dpdk.org, Brian Russell Date: Thu, 16 Aug 2018 14:50:32 +0100 Message-Id: <20180816135032.28283-4-bluca@debian.org> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180816135032.28283-1-bluca@debian.org> References: <20180816135032.28283-1-bluca@debian.org> Subject: [dpdk-dev] [PATCH 3/3] eal/linux: handle uio read failure in interrupt handler 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" If a device is unplugged while an interrupt is pending, the read call to the uio device to remove it from the poll wait list can fail resulting in it being continually polled forever. This change checks for the read failing and if so, unregisters the device as an interrupt source and causes the wait list to be rebuilt. This race has been reported and observed in production. Fixes: 0a45657a6794 ("pci: rework interrupt handling") Cc: stable@dpdk.org Signed-off-by: Brian Russell Signed-off-by: Luca Boccassi --- lib/librte_eal/linuxapp/eal/eal_interrupts.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c index 4076c6d6ca..34584db883 100644 --- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c +++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c @@ -627,7 +627,7 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds) bool call = false; int n, bytes_read; struct rte_intr_source *src; - struct rte_intr_callback *cb; + struct rte_intr_callback *cb, *next; union rte_intr_read_buffer buf; struct rte_intr_callback active_cb; @@ -701,6 +701,23 @@ eal_intr_process_interrupts(struct epoll_event *events, int nfds) "descriptor %d: %s\n", events[n].data.fd, strerror(errno)); + /* + * The device is unplugged or buggy, remove + * it as an interrupt source and return to + * force the wait list to be rebuilt. + */ + rte_spinlock_lock(&intr_lock); + TAILQ_REMOVE(&intr_sources, src, next); + rte_spinlock_unlock(&intr_lock); + + for (cb = TAILQ_FIRST(&src->callbacks); cb; + cb = next) { + next = TAILQ_NEXT(cb, next); + TAILQ_REMOVE(&src->callbacks, cb, next); + free(cb); + } + free(src); + return -1; } else if (bytes_read == 0) RTE_LOG(ERR, EAL, "Read nothing from file " "descriptor %d\n", events[n].data.fd);