ethdev: introduce device removal event
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 <gaetan.rivet@6wind.com> Signed-off-by: Elad Persiko <eladpe@mellanox.com>
This commit is contained in:
parent
923419333f
commit
b5ece77212
@ -10,6 +10,7 @@
|
||||
Speed capabilities =
|
||||
Link status =
|
||||
Link status event =
|
||||
Removal event =
|
||||
Queue status event =
|
||||
Rx interrupt =
|
||||
Free Tx mbuf on demand =
|
||||
|
@ -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
|
||||
~~~~~~~~~~~~
|
||||
|
||||
|
@ -239,6 +239,8 @@ struct rte_pci_bus {
|
||||
#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.
|
||||
|
@ -749,16 +749,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
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -1759,6 +1761,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
|
||||
@ -3466,6 +3470,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 */
|
||||
};
|
||||
|
||||
|
@ -64,6 +64,8 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user