From: Gaetan Rivet <gaetan.rivet@6wind.com>
To: dev@dpdk.org
Cc: Gaetan Rivet <gaetan.rivet@6wind.com>
Subject: [dpdk-dev] [PATCH v6 20/22] net/failsafe: support device removal
Date: Fri, 7 Jul 2017 02:09:37 +0200 [thread overview]
Message-ID: <edcae6f79d31cc85018f2b4fb96141a0ede2a8c8.1499385282.git.gaetan.rivet@6wind.com> (raw)
In-Reply-To: <cover.1499385281.git.gaetan.rivet@6wind.com>
In-Reply-To: <cover.1499385281.git.gaetan.rivet@6wind.com>
Listen to INTR_RMV events issued by slaves.
Add atomic flags on slave queues to detect use of slave bursts function.
If a removal is detected, set the recollection flag on this slave.
During a slave upkeep round, if its recollection flag is set and its
burst functions are not in use by any thread, remove that slave.
Signed-off-by: Gaetan Rivet <gaetan.rivet@6wind.com>
Acked-by: Olga Shern <olgas@mellanox.com>
---
doc/guides/nics/fail_safe.rst | 14 +++++
drivers/net/failsafe/failsafe.c | 1 +
drivers/net/failsafe/failsafe_args.c | 13 +++++
drivers/net/failsafe/failsafe_eal.c | 3 +-
drivers/net/failsafe/failsafe_ether.c | 96 ++++++++++++++++++++++++++++++---
drivers/net/failsafe/failsafe_ops.c | 38 +++++++++++--
drivers/net/failsafe/failsafe_private.h | 72 ++++++++++++++++++++++---
drivers/net/failsafe/failsafe_rxtx.c | 17 +++++-
8 files changed, 234 insertions(+), 20 deletions(-)
diff --git a/doc/guides/nics/fail_safe.rst b/doc/guides/nics/fail_safe.rst
index 1b6e110..4154f0a 100644
--- a/doc/guides/nics/fail_safe.rst
+++ b/doc/guides/nics/fail_safe.rst
@@ -51,6 +51,12 @@ The Fail-safe PMD only supports a limited set of features. If you plan to use a
device underneath the Fail-safe PMD with a specific feature, this feature must
be supported by the Fail-safe PMD to avoid throwing any error.
+A notable exception is the device removal feature. The fail-safe PMD being a
+virtual device, it cannot currently be removed in the sense of a specific bus
+hotplug, like for PCI for example. It will however enable this feature for its
+sub-device automatically, detecting those that are capable and register the
+relevant callback for such event.
+
Check the feature matrix for the complete set of supported features.
Compilation options
@@ -170,3 +176,11 @@ emit and receive packets. It will store any applied configuration, and try to
apply it upon the probing of its missing sub-device. After this configuration
pass, the new sub-device will be synchronized with other sub-devices, i.e. be
started if the fail-safe PMD has been started by the user before.
+
+Plug-out feature
+----------------
+
+A sub-device supporting the device removal event can be removed from its bus at
+any time. The fail-safe PMD will register a callback for such event and react
+accordingly. It will try to safely stop, close and uninit the sub-device having
+emitted this event, allowing it to free its eventual resources.
diff --git a/drivers/net/failsafe/failsafe.c b/drivers/net/failsafe/failsafe.c
index 6557255..4d35860 100644
--- a/drivers/net/failsafe/failsafe.c
+++ b/drivers/net/failsafe/failsafe.c
@@ -132,6 +132,7 @@ fs_hotplug_alarm(void *arg)
if (!PRIV(dev)->pending_alarm)
return;
PRIV(dev)->pending_alarm = 0;
+ failsafe_dev_remove(dev);
FOREACH_SUBDEV(sdev, i, dev)
if (sdev->state != PRIV(dev)->state)
break;
diff --git a/drivers/net/failsafe/failsafe_args.c b/drivers/net/failsafe/failsafe_args.c
index c723ca3..dd55aaf 100644
--- a/drivers/net/failsafe/failsafe_args.c
+++ b/drivers/net/failsafe/failsafe_args.c
@@ -443,6 +443,17 @@ failsafe_args_count_subdevice(struct rte_eth_dev *dev,
dev, params);
}
+static int
+fs_parse_sub_device(struct sub_device *sdev)
+{
+ struct rte_devargs *da;
+ char devstr[DEVARGS_MAXLEN] = "";
+
+ da = &sdev->devargs;
+ snprintf(devstr, sizeof(devstr), "%s,%s", da->name, da->args);
+ return fs_parse_device(sdev, devstr);
+}
+
int
failsafe_args_parse_subs(struct rte_eth_dev *dev)
{
@@ -455,6 +466,8 @@ failsafe_args_parse_subs(struct rte_eth_dev *dev)
continue;
if (sdev->cmdline)
ret = fs_execute_cmd(sdev, sdev->cmdline);
+ else
+ ret = fs_parse_sub_device(sdev);
if (ret == 0)
sdev->state = DEV_PARSED;
}
diff --git a/drivers/net/failsafe/failsafe_eal.c b/drivers/net/failsafe/failsafe_eal.c
index 86e16a6..3321dda 100644
--- a/drivers/net/failsafe/failsafe_eal.c
+++ b/drivers/net/failsafe/failsafe_eal.c
@@ -79,6 +79,7 @@ fs_bus_init(struct rte_eth_dev *dev)
return -ENODEV;
}
SUB_ID(sdev) = i;
+ sdev->fs_dev = dev;
sdev->dev = ETH(sdev)->device;
ETH(sdev)->state = RTE_ETH_DEV_DEFERRED;
sdev->state = DEV_PROBED;
@@ -96,7 +97,7 @@ failsafe_eal_init(struct rte_eth_dev *dev)
return ret;
if (PRIV(dev)->state < DEV_PROBED)
PRIV(dev)->state = DEV_PROBED;
- fs_switch_dev(dev);
+ fs_switch_dev(dev, NULL);
return 0;
}
diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c
index 2958207..ea3105c 100644
--- a/drivers/net/failsafe/failsafe_ether.c
+++ b/drivers/net/failsafe/failsafe_ether.c
@@ -250,6 +250,67 @@ fs_eth_dev_conf_apply(struct rte_eth_dev *dev,
return 0;
}
+static void
+fs_dev_remove(struct sub_device *sdev)
+{
+ int ret;
+
+ if (sdev == NULL)
+ return;
+ switch (sdev->state) {
+ case DEV_STARTED:
+ rte_eth_dev_stop(PORT_ID(sdev));
+ sdev->state = DEV_ACTIVE;
+ /* fallthrough */
+ case DEV_ACTIVE:
+ rte_eth_dev_close(PORT_ID(sdev));
+ sdev->state = DEV_PROBED;
+ /* fallthrough */
+ case DEV_PROBED:
+ ret = rte_eal_hotplug_remove(sdev->bus->name,
+ sdev->dev->name);
+ if (ret) {
+ ERROR("Bus detach failed for sub_device %u",
+ SUB_ID(sdev));
+ } else {
+ ETH(sdev)->state = RTE_ETH_DEV_UNUSED;
+ }
+ sdev->state = DEV_PARSED;
+ /* fallthrough */
+ case DEV_PARSED:
+ case DEV_UNDEFINED:
+ sdev->state = DEV_UNDEFINED;
+ /* the end */
+ break;
+ }
+ failsafe_hotplug_alarm_install(sdev->fs_dev);
+}
+
+static inline int
+fs_rxtx_clean(struct sub_device *sdev)
+{
+ uint16_t i;
+
+ for (i = 0; i < ETH(sdev)->data->nb_rx_queues; i++)
+ if (FS_ATOMIC_RX(sdev, i))
+ return 0;
+ for (i = 0; i < ETH(sdev)->data->nb_tx_queues; i++)
+ if (FS_ATOMIC_TX(sdev, i))
+ return 0;
+ return 1;
+}
+
+void
+failsafe_dev_remove(struct rte_eth_dev *dev)
+{
+ struct sub_device *sdev;
+ uint8_t i;
+
+ FOREACH_SUBDEV_ST(sdev, i, dev, DEV_ACTIVE)
+ if (sdev->remove && fs_rxtx_clean(sdev))
+ fs_dev_remove(sdev);
+}
+
int
failsafe_eth_dev_state_sync(struct rte_eth_dev *dev)
{
@@ -263,13 +324,13 @@ failsafe_eth_dev_state_sync(struct rte_eth_dev *dev)
ret = failsafe_args_parse_subs(dev);
if (ret)
- return ret;
+ goto err_remove;
if (PRIV(dev)->state < DEV_PROBED)
return 0;
ret = failsafe_eal_init(dev);
if (ret)
- return ret;
+ goto err_remove;
if (PRIV(dev)->state < DEV_ACTIVE)
return 0;
inactive = 0;
@@ -278,15 +339,14 @@ failsafe_eth_dev_state_sync(struct rte_eth_dev *dev)
inactive |= UINT32_C(1) << i;
ret = dev->dev_ops->dev_configure(dev);
if (ret)
- return ret;
+ goto err_remove;
FOREACH_SUBDEV(sdev, i, dev) {
if (inactive & (UINT32_C(1) << i)) {
ret = fs_eth_dev_conf_apply(dev, sdev);
if (ret) {
ERROR("Could not apply configuration to sub_device %d",
i);
- /* TODO: disable device */
- return ret;
+ goto err_remove;
}
}
}
@@ -300,6 +360,30 @@ failsafe_eth_dev_state_sync(struct rte_eth_dev *dev)
return 0;
ret = dev->dev_ops->dev_start(dev);
if (ret)
- return ret;
+ goto err_remove;
+ return 0;
+err_remove:
+ FOREACH_SUBDEV(sdev, i, dev)
+ if (sdev->state != PRIV(dev)->state)
+ sdev->remove = 1;
+ return ret;
+}
+
+int
+failsafe_eth_rmv_event_callback(uint8_t port_id __rte_unused,
+ enum rte_eth_event_type event __rte_unused,
+ void *cb_arg, void *out __rte_unused)
+{
+ struct sub_device *sdev = cb_arg;
+
+ /* Switch as soon as possible tx_dev. */
+ fs_switch_dev(sdev->fs_dev, sdev);
+ /* Use safe bursts in any case. */
+ set_burst_fn(sdev->fs_dev, 1);
+ /*
+ * Async removal, the sub-PMD will try to unregister
+ * the callback at the source of the current thread context.
+ */
+ sdev->remove = 1;
return 0;
}
diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c
index 5fb0135..2e1c798 100644
--- a/drivers/net/failsafe/failsafe_ops.c
+++ b/drivers/net/failsafe/failsafe_ops.c
@@ -33,6 +33,8 @@
#include <assert.h>
#include <stdint.h>
+
+#include <rte_atomic.h>
#include <rte_ethdev.h>
#include <rte_malloc.h>
#include <rte_flow.h>
@@ -204,9 +206,21 @@ fs_dev_configure(struct rte_eth_dev *dev)
}
}
FOREACH_SUBDEV(sdev, i, dev) {
+ int rmv_interrupt = 0;
+
if (sdev->state != DEV_PROBED)
continue;
+
+ rmv_interrupt = ETH(sdev)->data->dev_flags &
+ RTE_ETH_DEV_INTR_RMV;
+ if (rmv_interrupt) {
+ DEBUG("Enabling RMV interrupts for sub_device %d", i);
+ dev->data->dev_conf.intr_conf.rmv = 1;
+ } else {
+ DEBUG("sub_device %d does not support RMV event", i);
+ }
DEBUG("Configuring sub-device %d", i);
+ sdev->remove = 0;
ret = rte_eth_dev_configure(PORT_ID(sdev),
dev->data->nb_rx_queues,
dev->data->nb_tx_queues,
@@ -215,6 +229,16 @@ fs_dev_configure(struct rte_eth_dev *dev)
ERROR("Could not configure sub_device %d", i);
return ret;
}
+ if (rmv_interrupt) {
+ ret = rte_eth_dev_callback_register(PORT_ID(sdev),
+ RTE_ETH_EVENT_INTR_RMV,
+ failsafe_eth_rmv_event_callback,
+ sdev);
+ if (ret)
+ WARN("Failed to register RMV callback for sub_device %d",
+ SUB_ID(sdev));
+ }
+ dev->data->dev_conf.intr_conf.rmv = 0;
sdev->state = DEV_ACTIVE;
}
if (PRIV(dev)->state < DEV_ACTIVE)
@@ -240,7 +264,7 @@ fs_dev_start(struct rte_eth_dev *dev)
}
if (PRIV(dev)->state < DEV_STARTED)
PRIV(dev)->state = DEV_STARTED;
- fs_switch_dev(dev);
+ fs_switch_dev(dev, NULL);
return 0;
}
@@ -351,10 +375,14 @@ fs_rx_queue_setup(struct rte_eth_dev *dev,
fs_rx_queue_release(rxq);
dev->data->rx_queues[rx_queue_id] = NULL;
}
- rxq = rte_zmalloc(NULL, sizeof(*rxq),
+ rxq = rte_zmalloc(NULL,
+ sizeof(*rxq) +
+ sizeof(rte_atomic64_t) * PRIV(dev)->subs_tail,
RTE_CACHE_LINE_SIZE);
if (rxq == NULL)
return -ENOMEM;
+ FOREACH_SUBDEV(sdev, i, dev)
+ rte_atomic64_init(&rxq->refcnt[i]);
rxq->qid = rx_queue_id;
rxq->socket_id = socket_id;
rxq->info.mp = mb_pool;
@@ -414,10 +442,14 @@ fs_tx_queue_setup(struct rte_eth_dev *dev,
fs_tx_queue_release(txq);
dev->data->tx_queues[tx_queue_id] = NULL;
}
- txq = rte_zmalloc("ethdev TX queue", sizeof(*txq),
+ txq = rte_zmalloc("ethdev TX queue",
+ sizeof(*txq) +
+ sizeof(rte_atomic64_t) * PRIV(dev)->subs_tail,
RTE_CACHE_LINE_SIZE);
if (txq == NULL)
return -ENOMEM;
+ FOREACH_SUBDEV(sdev, i, dev)
+ rte_atomic64_init(&txq->refcnt[i]);
txq->qid = tx_queue_id;
txq->socket_id = socket_id;
txq->info.conf = *tx_conf;
diff --git a/drivers/net/failsafe/failsafe_private.h b/drivers/net/failsafe/failsafe_private.h
index 25a4dac..6a8041d 100644
--- a/drivers/net/failsafe/failsafe_private.h
+++ b/drivers/net/failsafe/failsafe_private.h
@@ -36,6 +36,7 @@
#include <sys/queue.h>
+#include <rte_atomic.h>
#include <rte_dev.h>
#include <rte_ethdev.h>
#include <rte_devargs.h>
@@ -65,6 +66,7 @@ struct rxq {
uint8_t last_polled;
unsigned int socket_id;
struct rte_eth_rxq_info info;
+ rte_atomic64_t refcnt[];
};
struct txq {
@@ -72,6 +74,7 @@ struct txq {
uint16_t qid;
unsigned int socket_id;
struct rte_eth_txq_info info;
+ rte_atomic64_t refcnt[];
};
struct rte_flow {
@@ -101,6 +104,10 @@ struct sub_device {
enum dev_state state;
/* Some device are defined as a command line */
char *cmdline;
+ /* fail-safe device backreference */
+ struct rte_eth_dev *fs_dev;
+ /* flag calling for recollection */
+ volatile unsigned int remove:1;
};
struct fs_priv {
@@ -168,6 +175,10 @@ int failsafe_eal_uninit(struct rte_eth_dev *dev);
/* ETH_DEV */
int failsafe_eth_dev_state_sync(struct rte_eth_dev *dev);
+void failsafe_dev_remove(struct rte_eth_dev *dev);
+int failsafe_eth_rmv_event_callback(uint8_t port_id,
+ enum rte_eth_event_type type,
+ void *arg, void *out);
/* GLOBALS */
@@ -233,6 +244,39 @@ extern int mac_from_arg;
#define SUBOPS(s, ops) \
(ETH(s)->dev_ops->ops)
+/**
+ * Atomic guard
+ */
+
+/**
+ * a: (rte_atomic64_t *)
+ */
+#define FS_ATOMIC_P(a) \
+ rte_atomic64_add(&(a), 1)
+
+/**
+ * a: (rte_atomic64_t *)
+ */
+#define FS_ATOMIC_V(a) \
+ rte_atomic64_sub(&(a), 1)
+
+/**
+ * s: (struct sub_device *)
+ * i: uint16_t qid
+ */
+#define FS_ATOMIC_RX(s, i) \
+ rte_atomic64_read( \
+ &((struct rxq *)((s)->fs_dev->data->rx_queues[i]))->refcnt[(s)->sid] \
+ )
+/**
+ * s: (struct sub_device *)
+ * i: uint16_t qid
+ */
+#define FS_ATOMIC_TX(s, i) \
+ rte_atomic64_read( \
+ &((struct txq *)((s)->fs_dev->data->tx_queues[i]))->refcnt[(s)->sid] \
+ )
+
#ifndef NDEBUG
#include <stdio.h>
#define DEBUG__(m, ...) \
@@ -274,33 +318,45 @@ fs_find_next(struct rte_eth_dev *dev, uint8_t sid,
return sid;
}
+/*
+ * Switch emitting device.
+ * If banned is set, banned must not be considered for
+ * the role of emitting device.
+ */
static inline void
-fs_switch_dev(struct rte_eth_dev *dev)
+fs_switch_dev(struct rte_eth_dev *dev,
+ struct sub_device *banned)
{
+ struct sub_device *txd;
enum dev_state req_state;
req_state = PRIV(dev)->state;
- if (PREFERRED_SUBDEV(dev)->state >= req_state) {
- if (TX_SUBDEV(dev) != PREFERRED_SUBDEV(dev) &&
- (TX_SUBDEV(dev) == NULL ||
+ txd = TX_SUBDEV(dev);
+ if (PREFERRED_SUBDEV(dev)->state >= req_state &&
+ PREFERRED_SUBDEV(dev) != banned) {
+ if (txd != PREFERRED_SUBDEV(dev) &&
+ (txd == NULL ||
(req_state == DEV_STARTED) ||
- (TX_SUBDEV(dev) && TX_SUBDEV(dev)->state < DEV_STARTED))) {
+ (txd && txd->state < DEV_STARTED))) {
DEBUG("Switching tx_dev to preferred sub_device");
PRIV(dev)->subs_tx = 0;
}
- } else if ((TX_SUBDEV(dev) && TX_SUBDEV(dev)->state < req_state) ||
- TX_SUBDEV(dev) == NULL) {
+ } else if ((txd && txd->state < req_state) ||
+ txd == NULL ||
+ txd == banned) {
struct sub_device *sdev;
uint8_t i;
/* Using acceptable device */
FOREACH_SUBDEV_ST(sdev, i, dev, req_state) {
+ if (sdev == banned)
+ continue;
DEBUG("Switching tx_dev to sub_device %d",
i);
PRIV(dev)->subs_tx = i;
break;
}
- } else if (TX_SUBDEV(dev) && TX_SUBDEV(dev)->state < req_state) {
+ } else if (txd && txd->state < req_state) {
DEBUG("No device ready, deactivating tx_dev");
PRIV(dev)->subs_tx = PRIV(dev)->subs_tail;
} else {
diff --git a/drivers/net/failsafe/failsafe_rxtx.c b/drivers/net/failsafe/failsafe_rxtx.c
index c15025f..82a8c4e 100644
--- a/drivers/net/failsafe/failsafe_rxtx.c
+++ b/drivers/net/failsafe/failsafe_rxtx.c
@@ -33,6 +33,7 @@
#include <assert.h>
+#include <rte_atomic.h>
#include <rte_mbuf.h>
#include <rte_ethdev.h>
@@ -113,8 +114,10 @@ failsafe_rx_burst(void *queue,
if (unlikely(fs_rx_unsafe(sdev)))
continue;
sub_rxq = ETH(sdev)->data->rx_queues[rxq->qid];
+ FS_ATOMIC_P(rxq->refcnt[sdev->sid]);
nb_rx = ETH(sdev)->
rx_pkt_burst(sub_rxq, rx_pkts, nb_pkts);
+ FS_ATOMIC_V(rxq->refcnt[sdev->sid]);
if (nb_rx) {
rxq->last_polled = i;
return nb_rx;
@@ -147,8 +150,10 @@ failsafe_rx_burst_fast(void *queue,
sdev = &priv->subs[i];
assert(!fs_rx_unsafe(sdev));
sub_rxq = ETH(sdev)->data->rx_queues[rxq->qid];
+ FS_ATOMIC_P(rxq->refcnt[sdev->sid]);
nb_rx = ETH(sdev)->
rx_pkt_burst(sub_rxq, rx_pkts, nb_pkts);
+ FS_ATOMIC_V(rxq->refcnt[sdev->sid]);
if (nb_rx) {
rxq->last_polled = i;
return nb_rx;
@@ -165,13 +170,17 @@ failsafe_tx_burst(void *queue,
struct sub_device *sdev;
struct txq *txq;
void *sub_txq;
+ uint16_t nb_tx;
txq = queue;
sdev = TX_SUBDEV(txq->priv->dev);
if (unlikely(fs_tx_unsafe(sdev)))
return 0;
sub_txq = ETH(sdev)->data->tx_queues[txq->qid];
- return ETH(sdev)->tx_pkt_burst(sub_txq, tx_pkts, nb_pkts);
+ FS_ATOMIC_P(txq->refcnt[sdev->sid]);
+ nb_tx = ETH(sdev)->tx_pkt_burst(sub_txq, tx_pkts, nb_pkts);
+ FS_ATOMIC_V(txq->refcnt[sdev->sid]);
+ return nb_tx;
}
uint16_t
@@ -182,10 +191,14 @@ failsafe_tx_burst_fast(void *queue,
struct sub_device *sdev;
struct txq *txq;
void *sub_txq;
+ uint16_t nb_tx;
txq = queue;
sdev = TX_SUBDEV(txq->priv->dev);
assert(!fs_tx_unsafe(sdev));
sub_txq = ETH(sdev)->data->tx_queues[txq->qid];
- return ETH(sdev)->tx_pkt_burst(sub_txq, tx_pkts, nb_pkts);
+ FS_ATOMIC_P(txq->refcnt[sdev->sid]);
+ nb_tx = ETH(sdev)->tx_pkt_burst(sub_txq, tx_pkts, nb_pkts);
+ FS_ATOMIC_V(txq->refcnt[sdev->sid]);
+ return nb_tx;
}
--
2.1.4
next prev parent reply other threads:[~2017-07-07 0:10 UTC|newest]
Thread overview: 195+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-24 15:19 [dpdk-dev] [PATCH v3 00/11] introduce fail-safe PMD Gaetan Rivet
2017-05-24 15:19 ` [dpdk-dev] [PATCH v3 01/11] ethdev: save VLAN filter setting Gaetan Rivet
2017-05-24 15:20 ` [dpdk-dev] [PATCH v3 02/11] ethdev: add deferred intermediate device state Gaetan Rivet
2017-05-24 15:20 ` [dpdk-dev] [PATCH v3 03/11] ethdev: count devices consistently Gaetan Rivet
2017-05-24 15:20 ` [dpdk-dev] [PATCH v3 04/11] net/failsafe: add fail-safe PMD Gaetan Rivet
2017-05-24 15:20 ` [dpdk-dev] [PATCH v3 05/11] net/failsafe: add plug-in support Gaetan Rivet
2017-05-24 15:20 ` [dpdk-dev] [PATCH v3 06/11] net/failsafe: add flexible device definition Gaetan Rivet
2017-05-24 15:20 ` [dpdk-dev] [PATCH v3 07/11] net/failsafe: support flow API Gaetan Rivet
2017-05-24 15:20 ` [dpdk-dev] [PATCH v3 08/11] net/failsafe: support offload capabilities Gaetan Rivet
2017-05-24 15:20 ` [dpdk-dev] [PATCH v3 09/11] net/failsafe: add fast burst functions Gaetan Rivet
2017-05-24 15:20 ` [dpdk-dev] [PATCH v3 10/11] net/failsafe: support link status change event Gaetan Rivet
2017-05-24 15:20 ` [dpdk-dev] [PATCH v3 11/11] net/failsafe: support flow API isolation mode Gaetan Rivet
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 00/12] introduce fail-safe PMD Gaetan Rivet
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 01/12] ethdev: save VLAN filter setting Gaetan Rivet
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 02/12] ethdev: add deferred intermediate device state Gaetan Rivet
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 03/12] ethdev: count devices consistently Gaetan Rivet
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 04/12] net/failsafe: add fail-safe PMD Gaetan Rivet
2017-05-31 15:13 ` Stephen Hemminger
2017-06-01 14:01 ` Gaëtan Rivet
2017-06-01 17:57 ` Stephen Hemminger
2017-06-04 23:04 ` Gaëtan Rivet
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 05/12] net/failsafe: add plug-in support Gaetan Rivet
2017-05-31 15:15 ` Stephen Hemminger
2017-06-01 14:12 ` Gaëtan Rivet
2017-06-01 18:00 ` Stephen Hemminger
2017-06-04 23:09 ` Gaëtan Rivet
2017-06-05 15:25 ` Stephen Hemminger
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 06/12] net/failsafe: add flexible device definition Gaetan Rivet
2017-05-31 15:19 ` Stephen Hemminger
2017-06-01 14:24 ` Gaëtan Rivet
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 07/12] net/failsafe: support flow API Gaetan Rivet
2017-05-31 15:21 ` Stephen Hemminger
2017-06-01 14:28 ` Gaëtan Rivet
2017-06-01 18:02 ` Stephen Hemminger
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 08/12] net/failsafe: support offload capabilities Gaetan Rivet
2017-05-31 15:23 ` Stephen Hemminger
2017-06-01 14:38 ` Gaëtan Rivet
2017-06-01 14:55 ` Olga Shern
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 09/12] net/failsafe: add fast burst functions Gaetan Rivet
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 10/12] net/failsafe: support device removal Gaetan Rivet
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 11/12] net/failsafe: support link status change event Gaetan Rivet
2017-05-29 13:42 ` [dpdk-dev] [PATCH v4 12/12] net/failsafe: support flow API isolation mode Gaetan Rivet
2017-05-29 14:03 ` [dpdk-dev] [PATCH v4 00/12] introduce fail-safe PMD Ferruh Yigit
2017-05-31 15:24 ` Stephen Hemminger
2017-06-07 17:30 ` Stephen Hemminger
2017-06-07 23:59 ` [dpdk-dev] [PATCH v5 " Gaetan Rivet
2017-06-07 23:59 ` [dpdk-dev] [PATCH v5 01/12] ethdev: save VLAN filter setting Gaetan Rivet
2017-06-07 23:59 ` [dpdk-dev] [PATCH v5 02/12] ethdev: add deferred intermediate device state Gaetan Rivet
2017-06-07 23:59 ` [dpdk-dev] [PATCH v5 03/12] ethdev: count devices consistently Gaetan Rivet
2017-06-07 23:59 ` [dpdk-dev] [PATCH v5 04/12] net/failsafe: add fail-safe PMD Gaetan Rivet
2017-06-28 9:18 ` Thomas Monjalon
2017-06-07 23:59 ` [dpdk-dev] [PATCH v5 05/12] net/failsafe: add plug-in support Gaetan Rivet
2017-06-07 23:59 ` [dpdk-dev] [PATCH v5 06/12] net/failsafe: add flexible device definition Gaetan Rivet
2017-06-07 23:59 ` [dpdk-dev] [PATCH v5 07/12] net/failsafe: support flow API Gaetan Rivet
2017-06-07 23:59 ` [dpdk-dev] [PATCH v5 08/12] net/failsafe: support offload capabilities Gaetan Rivet
2017-06-07 23:59 ` [dpdk-dev] [PATCH v5 09/12] net/failsafe: add fast burst functions Gaetan Rivet
2017-06-08 0:00 ` [dpdk-dev] [PATCH v5 10/12] net/failsafe: support device removal Gaetan Rivet
2017-07-05 6:42 ` Thomas Monjalon
2017-06-08 0:00 ` [dpdk-dev] [PATCH v5 11/12] net/failsafe: support link status change event Gaetan Rivet
2017-07-05 6:43 ` Thomas Monjalon
2017-06-08 0:00 ` [dpdk-dev] [PATCH v5 12/12] net/failsafe: support flow API isolation mode Gaetan Rivet
2017-06-08 10:56 ` [dpdk-dev] [PATCH v5 00/12] introduce fail-safe PMD Ferruh Yigit
2017-06-08 13:30 ` Gaëtan Rivet
2017-06-08 14:20 ` Ferruh Yigit
2017-06-08 14:25 ` Ferruh Yigit
2017-06-08 15:02 ` Gaëtan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 00/22] " Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 01/22] eal: return device handle upon plugin Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 02/22] eal: fix hotplug add Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 03/22] devargs: introduce removal function Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 04/22] eal: release devargs on device removal Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 05/22] pci: use given name as generic name Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 06/22] pci: fix generic driver pointer on probe error Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 07/22] pci: fix hotplug operations Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 08/22] vdev: add dev to vdev macro Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 09/22] vdev: implement plug operation Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 10/22] bus: remove useless plug parameter Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 11/22] ethdev: save VLAN filter setting Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 12/22] ethdev: add deferred intermediate device state Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 13/22] ethdev: count devices consistently Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 14/22] net/failsafe: add fail-safe PMD Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 15/22] net/failsafe: add plug-in support Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 16/22] net/failsafe: add flexible device definition Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 17/22] net/failsafe: support flow API Gaetan Rivet
[not found] ` <cover.1499384906.git.gaetan.rivet@6wind.com>
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 11/23] ethdev: add flow API rule copy function Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 12/23] ethdev: save VLAN filter setting Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 13/23] ethdev: add deferred intermediate device state Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 14/23] ethdev: count devices consistently Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 15/23] net/failsafe: add fail-safe PMD Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 16/23] net/failsafe: add plug-in support Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 17/23] net/failsafe: add flexible device definition Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 18/23] net/failsafe: support flow API Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 19/23] net/failsafe: support offload capabilities Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 20/23] net/failsafe: add fast burst functions Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 21/23] net/failsafe: support device removal Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 22/23] net/failsafe: support link status change event Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 23/23] net/failsafe: support flow API isolation mode Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 18/22] net/failsafe: support offload capabilities Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 19/22] net/failsafe: add fast burst functions Gaetan Rivet
2017-07-07 0:09 ` Gaetan Rivet [this message]
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 21/22] net/failsafe: support link status change event Gaetan Rivet
2017-07-07 0:09 ` [dpdk-dev] [PATCH v6 22/22] net/failsafe: support flow API isolation mode Gaetan Rivet
2017-07-07 10:05 ` [dpdk-dev] [PATCH v6 00/22] introduce fail-safe PMD Ferruh Yigit
2017-07-07 10:08 ` Gaëtan Rivet
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 00/11] " Gaetan Rivet
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 01/11] ethdev: add deferred intermediate device state Gaetan Rivet
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 02/11] ethdev: count devices consistently Gaetan Rivet
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 03/11] net/failsafe: add fail-safe PMD Gaetan Rivet
2017-07-09 11:10 ` Jan Blunck
2017-07-09 12:35 ` Gaëtan Rivet
2017-07-09 15:02 ` Thomas Monjalon
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 04/11] net/failsafe: add plug-in support Gaetan Rivet
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 05/11] net/failsafe: add flexible device definition Gaetan Rivet
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 06/11] net/failsafe: support flow API Gaetan Rivet
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 07/11] net/failsafe: support offload capabilities Gaetan Rivet
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 08/11] net/failsafe: add fast burst functions Gaetan Rivet
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 09/11] net/failsafe: support device removal Gaetan Rivet
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 10/11] net/failsafe: support link status change event Gaetan Rivet
2017-07-09 1:47 ` [dpdk-dev] [PATCH v7 11/11] net/failsafe: support flow API isolation mode Gaetan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 00/11] introduce fail-safe PMD Gaetan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 01/11] ethdev: add deferred intermediate device state Gaetan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 02/11] ethdev: count devices consistently Gaetan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 03/11] net/failsafe: add fail-safe PMD Gaetan Rivet
2017-07-11 19:57 ` Thomas Monjalon
2017-07-11 21:48 ` Gaëtan Rivet
2017-07-11 22:21 ` Thomas Monjalon
2017-07-11 22:25 ` Gaëtan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 04/11] net/failsafe: add plug-in support Gaetan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 05/11] net/failsafe: add flexible device definition Gaetan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 06/11] net/failsafe: support flow API Gaetan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 07/11] net/failsafe: support offload capabilities Gaetan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 08/11] net/failsafe: add fast burst functions Gaetan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 09/11] net/failsafe: support device removal Gaetan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 10/11] net/failsafe: support link status change event Gaetan Rivet
2017-07-10 23:19 ` [dpdk-dev] [PATCH v8 11/11] net/failsafe: support flow API isolation mode Gaetan Rivet
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 00/11] introduce fail-safe PMD Gaetan Rivet
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 01/11] ethdev: add deferred intermediate device state Gaetan Rivet
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 02/11] ethdev: count devices consistently Gaetan Rivet
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 03/11] net/failsafe: add fail-safe PMD Gaetan Rivet
2017-07-13 7:43 ` Thomas Monjalon
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 04/11] net/failsafe: add plug-in support Gaetan Rivet
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 05/11] net/failsafe: add flexible device definition Gaetan Rivet
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 06/11] net/failsafe: support flow API Gaetan Rivet
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 07/11] net/failsafe: support offload capabilities Gaetan Rivet
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 08/11] net/failsafe: add fast burst functions Gaetan Rivet
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 09/11] net/failsafe: support device removal Gaetan Rivet
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 10/11] net/failsafe: support link status change event Gaetan Rivet
2017-07-11 23:26 ` [dpdk-dev] [PATCH v9 11/11] net/failsafe: support flow API isolation mode Gaetan Rivet
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 00/11] introduce fail-safe PMD Gaetan Rivet
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 01/11] ethdev: add deferred intermediate device state Gaetan Rivet
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 02/11] ethdev: count devices consistently Gaetan Rivet
2017-07-17 13:58 ` Ferruh Yigit
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 03/11] net/failsafe: add fail-safe PMD Gaetan Rivet
2017-07-16 15:58 ` Thomas Monjalon
2017-07-16 20:00 ` Gaëtan Rivet
2017-07-17 13:56 ` Ferruh Yigit
2017-07-17 17:11 ` Gaëtan Rivet
2017-07-17 23:17 ` Gaëtan Rivet
2017-07-18 10:13 ` Ferruh Yigit
2017-07-18 11:01 ` Gaëtan Rivet
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 04/11] net/failsafe: add plug-in support Gaetan Rivet
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 05/11] net/failsafe: add flexible device definition Gaetan Rivet
2017-07-17 15:45 ` Ferruh Yigit
2017-07-17 15:52 ` Gaëtan Rivet
2017-07-17 16:04 ` Ferruh Yigit
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 06/11] net/failsafe: support flow API Gaetan Rivet
2017-07-17 16:03 ` Ferruh Yigit
2017-07-17 16:19 ` Gaëtan Rivet
2017-07-17 16:34 ` Ferruh Yigit
2017-07-17 17:15 ` Gaëtan Rivet
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 07/11] net/failsafe: support offload capabilities Gaetan Rivet
2017-07-17 16:22 ` Ferruh Yigit
2017-07-17 22:47 ` Gaëtan Rivet
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 08/11] net/failsafe: add fast burst functions Gaetan Rivet
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 09/11] net/failsafe: support device removal Gaetan Rivet
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 10/11] net/failsafe: support link status change event Gaetan Rivet
2017-07-15 17:57 ` [dpdk-dev] [PATCH v10 11/11] net/failsafe: support flow API isolation mode Gaetan Rivet
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 00/11] introduce fail-safe PMD Gaetan Rivet
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 01/11] ethdev: add deferred intermediate device state Gaetan Rivet
2017-07-18 16:04 ` Thomas Monjalon
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 02/11] ethdev: count devices consistently Gaetan Rivet
2017-07-18 16:04 ` Thomas Monjalon
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 03/11] net/failsafe: add fail-safe PMD Gaetan Rivet
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 04/11] net/failsafe: add plug-in support Gaetan Rivet
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 05/11] net/failsafe: add flexible device definition Gaetan Rivet
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 06/11] net/failsafe: support flow API Gaetan Rivet
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 07/11] net/failsafe: support Rx offload capabilities Gaetan Rivet
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 08/11] net/failsafe: add fast burst functions Gaetan Rivet
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 09/11] net/failsafe: support device removal Gaetan Rivet
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 10/11] net/failsafe: support link status change event Gaetan Rivet
2017-07-18 12:48 ` [dpdk-dev] [PATCH v11 11/11] net/failsafe: support flow API isolation mode Gaetan Rivet
2017-07-18 16:08 ` [dpdk-dev] [PATCH v11 00/11] introduce fail-safe PMD Ferruh Yigit
2017-08-03 13:00 ` Ferruh Yigit
2017-08-03 13:49 ` Gaëtan Rivet
2017-08-03 15:48 ` Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=edcae6f79d31cc85018f2b4fb96141a0ede2a8c8.1499385282.git.gaetan.rivet@6wind.com \
--to=gaetan.rivet@6wind.com \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).