mirror of
https://github.com/openvswitch/ovs
synced 2025-09-01 06:45:17 +00:00
Configurable Link State Change (LSC) detection mode
It is possible to set LSC detection mode to polling or interrupt mode for DPDK interfaces. The default is polling mode. To set interrupt mode, option dpdk-lsc-interrupt has to be set to true. For detailed description and usage see the dpdk install documentation. Signed-off-by: Robert Mulik <robert.mulik@ericsson.com> Signed-off-by: Ian Stokes <ian.stokes@intel.com>
This commit is contained in:
@@ -444,6 +444,12 @@ struct netdev_dpdk {
|
||||
/* DPDK-ETH hardware offload features,
|
||||
* from the enum set 'dpdk_hw_ol_features' */
|
||||
uint32_t hw_ol_features;
|
||||
|
||||
/* Properties for link state change detection mode.
|
||||
* If lsc_interrupt_mode is set to false, poll mode is used,
|
||||
* otherwise interrupt mode is used. */
|
||||
bool requested_lsc_interrupt_mode;
|
||||
bool lsc_interrupt_mode;
|
||||
);
|
||||
|
||||
PADDED_MEMBERS(CACHE_LINE_SIZE,
|
||||
@@ -765,7 +771,7 @@ dpdk_watchdog(void *dummy OVS_UNUSED)
|
||||
}
|
||||
|
||||
static int
|
||||
dpdk_eth_dev_queue_setup(struct netdev_dpdk *dev, int n_rxq, int n_txq)
|
||||
dpdk_eth_dev_port_config(struct netdev_dpdk *dev, int n_rxq, int n_txq)
|
||||
{
|
||||
int diag = 0;
|
||||
int i;
|
||||
@@ -785,6 +791,7 @@ dpdk_eth_dev_queue_setup(struct netdev_dpdk *dev, int n_rxq, int n_txq)
|
||||
}
|
||||
}
|
||||
|
||||
conf.intr_conf.lsc = dev->lsc_interrupt_mode;
|
||||
conf.rxmode.hw_ip_checksum = (dev->hw_ol_features &
|
||||
NETDEV_RX_CHECKSUM_OFFLOAD) != 0;
|
||||
/* A device may report more queues than it makes available (this has
|
||||
@@ -888,10 +895,13 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
|
||||
n_rxq = MIN(info.max_rx_queues, dev->up.n_rxq);
|
||||
n_txq = MIN(info.max_tx_queues, dev->up.n_txq);
|
||||
|
||||
diag = dpdk_eth_dev_queue_setup(dev, n_rxq, n_txq);
|
||||
diag = dpdk_eth_dev_port_config(dev, n_rxq, n_txq);
|
||||
if (diag) {
|
||||
VLOG_ERR("Interface %s(rxq:%d txq:%d) configure error: %s",
|
||||
dev->up.name, n_rxq, n_txq, rte_strerror(-diag));
|
||||
VLOG_ERR("Interface %s(rxq:%d txq:%d lsc interrupt mode:%s) "
|
||||
"configure error: %s",
|
||||
dev->up.name, n_rxq, n_txq,
|
||||
dev->lsc_interrupt_mode ? "true" : "false",
|
||||
rte_strerror(-diag));
|
||||
return -diag;
|
||||
}
|
||||
|
||||
@@ -984,6 +994,7 @@ common_construct(struct netdev *netdev, dpdk_port_t port_no,
|
||||
dev->flags = 0;
|
||||
dev->requested_mtu = ETHER_MTU;
|
||||
dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);
|
||||
dev->requested_lsc_interrupt_mode = 0;
|
||||
ovsrcu_index_init(&dev->vid, -1);
|
||||
dev->vhost_reconfigured = false;
|
||||
dev->attached = false;
|
||||
@@ -1408,6 +1419,8 @@ netdev_dpdk_get_config(const struct netdev *netdev, struct smap *args)
|
||||
} else {
|
||||
smap_add(args, "rx_csum_offload", "false");
|
||||
}
|
||||
smap_add(args, "lsc_interrupt_mode",
|
||||
dev->lsc_interrupt_mode ? "true" : "false");
|
||||
}
|
||||
ovs_mutex_unlock(&dev->mutex);
|
||||
|
||||
@@ -1531,7 +1544,7 @@ netdev_dpdk_set_config(struct netdev *netdev, const struct smap *args,
|
||||
char **errp)
|
||||
{
|
||||
struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
|
||||
bool rx_fc_en, tx_fc_en, autoneg;
|
||||
bool rx_fc_en, tx_fc_en, autoneg, lsc_interrupt_mode;
|
||||
enum rte_eth_fc_mode fc_mode;
|
||||
static const enum rte_eth_fc_mode fc_mode_set[2][2] = {
|
||||
{RTE_FC_NONE, RTE_FC_TX_PAUSE},
|
||||
@@ -1608,6 +1621,12 @@ netdev_dpdk_set_config(struct netdev *netdev, const struct smap *args,
|
||||
goto out;
|
||||
}
|
||||
|
||||
lsc_interrupt_mode = smap_get_bool(args, "dpdk-lsc-interrupt", false);
|
||||
if (dev->requested_lsc_interrupt_mode != lsc_interrupt_mode) {
|
||||
dev->requested_lsc_interrupt_mode = lsc_interrupt_mode;
|
||||
netdev_request_reconfigure(netdev);
|
||||
}
|
||||
|
||||
rx_fc_en = smap_get_bool(args, "rx-flow-ctrl", false);
|
||||
tx_fc_en = smap_get_bool(args, "tx-flow-ctrl", false);
|
||||
autoneg = smap_get_bool(args, "flow-ctrl-autoneg", false);
|
||||
@@ -3669,6 +3688,7 @@ netdev_dpdk_reconfigure(struct netdev *netdev)
|
||||
if (netdev->n_txq == dev->requested_n_txq
|
||||
&& netdev->n_rxq == dev->requested_n_rxq
|
||||
&& dev->mtu == dev->requested_mtu
|
||||
&& dev->lsc_interrupt_mode == dev->requested_lsc_interrupt_mode
|
||||
&& dev->rxq_size == dev->requested_rxq_size
|
||||
&& dev->txq_size == dev->requested_txq_size
|
||||
&& dev->socket_id == dev->requested_socket_id) {
|
||||
@@ -3684,6 +3704,8 @@ netdev_dpdk_reconfigure(struct netdev *netdev)
|
||||
goto out;
|
||||
}
|
||||
|
||||
dev->lsc_interrupt_mode = dev->requested_lsc_interrupt_mode;
|
||||
|
||||
netdev->n_txq = dev->requested_n_txq;
|
||||
netdev->n_rxq = dev->requested_n_rxq;
|
||||
|
||||
|
Reference in New Issue
Block a user