From patchwork Fri Mar 3 15:40:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Ga=C3=ABtan_Rivet?= X-Patchwork-Id: 21338 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 [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 9A502F954; Fri, 3 Mar 2017 16:40:44 +0100 (CET) Received: from mail-wm0-f44.google.com (mail-wm0-f44.google.com [74.125.82.44]) by dpdk.org (Postfix) with ESMTP id 330B2F937 for ; Fri, 3 Mar 2017 16:40:36 +0100 (CET) Received: by mail-wm0-f44.google.com with SMTP id t193so18340632wmt.1 for ; Fri, 03 Mar 2017 07:40:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=vgCUOsJMaabhY2jVdcbaJLkJ6FbNkpwDmLC1N6bVFIE=; b=0y8mnf9iUDTs3vnDxObt4hMNLZUWS8qYbU+ttYZ1MMcmkZtK/kqHPKacTmiyQxnC+s aM3IKRudqqnBkiG9HlkwFeqEYS2S2c7wH7PYQjbBP8R1mTuGhtE+mXJL1RTsvIQCv+l4 d6VPYViAD8HfFOWb+jZGomldV4GLxrYUh3iNX2poe8Wjg/wzQbjlGdihm7qgVkErQjdD WmByczimVSI49o8fEuOJ4NYwcZep+RABMcXcKEGeEZ17emsE53jqnoLsw9pHpceVX7eH 9N7n+tjzwwJAkZanozuXUOyJXw81dTXBFXt4i2MWJ0gfdIZQFTqAqPwRvxTFUKBvyNzc Pnsg== 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=vgCUOsJMaabhY2jVdcbaJLkJ6FbNkpwDmLC1N6bVFIE=; b=f7Ld8MJ8BThe0pL8JlOwFr6jvfEIyLJ/fjGgSkTAI4DYaaBCSkHJvwxbt+uEM6FQ4q iKlHXEKKwUf0SFc6twiahHWX1fSHGspU6z+kpu6GQT16tQaJvEUAk+3jMDVfGBMw2W0y zZrMg3OGIGP0pczJjGj2uHPlitCq1U8InTCVDblTNJTEvRjMcr2PY4Li3Iar6uAwsyaG RE9K03ITSpDcTg+vi9XEEK9N8dM9u4/5g2dK2xtvMY2koY4pPCGSLDv0+Zgh2Fd3Y4tC m4hFuA1I+3cFNNKv9hVeZ0e9fyU3dzvf2BXRCzE8MjjBVpxDaXGh+6H4uLt35LnSO42W uthA== X-Gm-Message-State: AMke39mHmqdEySOJInGODkcNUV9bL/sO7iMwI3RygMeEHko5jYiQFdNUoevnw0PDZ6K5q+Bx X-Received: by 10.28.207.7 with SMTP id f7mr3696816wmg.112.1488555635619; Fri, 03 Mar 2017 07:40:35 -0800 (PST) Received: from bidouze.dev.6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id i15sm3486899wmf.21.2017.03.03.07.40.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 03 Mar 2017 07:40:35 -0800 (PST) From: Gaetan Rivet To: dev@dpdk.org Cc: Elad Persiko Date: Fri, 3 Mar 2017 16:40:19 +0100 Message-Id: X-Mailer: git-send-email 2.1.4 In-Reply-To: References: Subject: [dpdk-dev] [PATCH 1/5] ethdev: introduce device removal event 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" This new API allows reacting to a device removal. A device removal is the sudden disappearance of a device from its bus. PMDs implementing support for this notification guarantee that the removal of the underlying device does not incur a risk to the application. In particular, Rx/Tx bursts and all other functions can still be called (albeit likely returning errors) without triggering a crash, irrespective of an application handling this event. Signed-off-by: Gaetan Rivet Signed-off-by: Elad Persiko --- doc/guides/nics/features/default.ini | 1 + doc/guides/prog_guide/env_abstraction_layer.rst | 21 +++++++++++++++++++-- lib/librte_eal/common/include/rte_pci.h | 2 ++ lib/librte_ether/rte_ethdev.c | 13 +++++++++---- lib/librte_ether/rte_ethdev.h | 9 +++++++-- 5 files changed, 38 insertions(+), 8 deletions(-) diff --git a/doc/guides/nics/features/default.ini b/doc/guides/nics/features/default.ini index 9e363ff..7bb56ec 100644 --- a/doc/guides/nics/features/default.ini +++ b/doc/guides/nics/features/default.ini @@ -9,6 +9,7 @@ Speed capabilities = Link status = Link status event = +Removal event = Queue status event = Rx interrupt = Queue start/stop = diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst index 10a10a8..f72674f 100644 --- a/doc/guides/prog_guide/env_abstraction_layer.rst +++ b/doc/guides/prog_guide/env_abstraction_layer.rst @@ -178,8 +178,8 @@ The EAL also allows timed callbacks to be used in the same way as for NIC interr .. note:: - In DPDK PMD, the only interrupts handled by the dedicated host thread are those for link status change, - i.e. link up and link down notification. + In DPDK PMD, the only interrupts handled by the dedicated host thread are those for link status change + (link up and link down notification) and for sudden device removal. + RX Interrupt Event @@ -207,6 +207,23 @@ The eth_dev driver takes responsibility to program the latter mapping. The RX interrupt are controlled/enabled/disabled by ethdev APIs - 'rte_eth_dev_rx_intr_*'. They return failure if the PMD hasn't support them yet. The intr_conf.rxq flag is used to turn on the capability of RX interrupt per device. ++ Device Removal Event + +This event is triggered by a device being removed at a bus level. Its +underlying resources may have been made unavailable (i.e. PCI mappings +unmapped). The PMD must make sure that on such occurrence, the application can +still safely use its callbacks. + +This event can be subscribed to in the same way one would subscribe to a link +status change event. The execution context is thus the same, i.e. it is the +dedicated interrupt host thread. + +Considering this, it is likely that an application would want to close a +device having emitted a Device Removal Event. In such case, calling +``rte_eth_dev_close()`` can trigger it to unregister its own Device Removal Event +callback. Care must be taken not to close the device from the interrupt handler +context. It is necessary to reschedule such closing operation. + Blacklisting ~~~~~~~~~~~~ diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h index 8557e47..4a67883 100644 --- a/lib/librte_eal/common/include/rte_pci.h +++ b/lib/librte_eal/common/include/rte_pci.h @@ -216,6 +216,8 @@ struct rte_pci_driver { #define RTE_PCI_DRV_NEED_MAPPING 0x0001 /** Device driver supports link state interrupt */ #define RTE_PCI_DRV_INTR_LSC 0x0008 +/** Device driver supports device removal interrupt */ +#define RTE_PCI_DRV_INTR_RMV 0x0010 /** * A structure describing a PCI mapping. diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 3a52d0a..6c4b796 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -848,16 +848,19 @@ rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q, return -EINVAL; } - /* - * If link state interrupt is enabled, check that the - * device supports it. - */ + /* Check that the device supports requested interrupts */ if ((dev_conf->intr_conf.lsc == 1) && (!(dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC))) { RTE_PMD_DEBUG_TRACE("driver %s does not support lsc\n", dev->data->drv_name); return -EINVAL; } + if ((dev_conf->intr_conf.rmv == 1) && + (!(dev->data->dev_flags & RTE_ETH_DEV_INTR_RMV))) { + RTE_PMD_DEBUG_TRACE("driver %s does not support rmv\n", + dev->data->drv_name); + return -EINVAL; + } /* * If jumbo frames are enabled, check that the maximum RX packet @@ -3222,6 +3225,8 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, struct rte_pci_device *pci_de eth_dev->data->dev_flags = 0; if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC) eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC; + if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV) + eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV; eth_dev->data->kdrv = pci_dev->kdrv; eth_dev->data->numa_node = pci_dev->device.numa_node; diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index bdad81b..ed99660 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -816,9 +816,11 @@ struct rte_eth_udp_tunnel { */ struct rte_intr_conf { /** enable/disable lsc interrupt. 0 (default) - disable, 1 enable */ - uint16_t lsc; + uint32_t lsc:1; /** enable/disable rxq interrupt. 0 (default) - disable, 1 enable */ - uint16_t rxq; + uint32_t rxq:1; + /** enable/disable rmv interrupt. 0 (default) - disable, 1 enable */ + uint32_t rmv:1; }; /** @@ -1722,6 +1724,8 @@ struct rte_eth_dev_data { #define RTE_ETH_DEV_INTR_LSC 0x0002 /** Device is a bonded slave */ #define RTE_ETH_DEV_BONDED_SLAVE 0x0004 +/** Device supports device removal interrupt */ +#define RTE_ETH_DEV_INTR_RMV 0x0008 /** * @internal @@ -3212,6 +3216,7 @@ enum rte_eth_event_type { /**< reset interrupt event, sent to VF on PF reset */ RTE_ETH_EVENT_VF_MBOX, /**< message from the VF received by PF */ RTE_ETH_EVENT_MACSEC, /**< MACsec offload related event */ + RTE_ETH_EVENT_INTR_RMV, /**< device removal event */ RTE_ETH_EVENT_MAX /**< max value of this enum */ };