[ovs-dev] [PATCH v5] Configurable Link State Change (LSC) detection mode

Róbert Mulik robert.mulik at ericsson.com
Fri Feb 16 15:46:10 UTC 2018


Hi Jan,

This is the diff between v4 and v5.

Regards,
Robert

diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst
index 14a6684..e3872e7 100644
--- a/Documentation/intro/install/dpdk.rst
+++ b/Documentation/intro/install/dpdk.rst
@@ -634,47 +634,34 @@ Link State Change (LSC) detection configuration
 There are two methods to get the information when Link State Change (LSC)
 happens on a network interface: by polling or interrupt.

-With polling method, a process is running in the background and repeatedly
-reads the link state with a short period. It continuously needs processor time
-and between 2 reading periods it can`t see the link state change, therefore
-the reaction time depends on the polling period. With higher rate, more
-processor time is needed. Another problem with the poll mode is that on some
-hardware a polling cycle takes too much time, which (in the end) leads to
-packet loss for certain systems.
+With the polling method, the main process checks the link state on a
+fixed interval. This fixed interval determines how fast a link change is
+detected. Another problem with the poll mode is that on some hardware a
+polling cycle takes too much time, which (in the end) leads to packet loss
+for certain systems.

 If interrupts are used to get LSC information, the hardware itself triggers
-an interrupt when link state change happens, the thread wakes up from sleep,
-updates the information, and goes back to sleep mode. When no link state
-change happens (most of the time), the thread remains in sleep mode and
+an interrupt when link state change happens, the interrupt thread wakes up
+from sleep, updates the information, and goes back to sleep mode. When no link
+state change happens (most of the time), the thread remains in sleep mode and
 doesn`t use processor time at all. The disadvantage of this method is that
-when interrupt happens, the processor has to handle it immediately, so it
+when an interrupt happens, the processor has to handle it immediately, so it
 puts the currently running process to background, handles the interrupt, and
-takes the background process back. Another disadvantage is that some hardware
-can`t be configured to generate LSC interrupts.
+takes the background process back.

-The default configuration is polling mode. To set interrupt mode, option
-dpdk-lsc-interrupt has to be set to true.
-
-Global settings
-
-Command to set interrupt mode for all interfaces:
-ovs-vsctl set Open_vSwitch . other_config:dpdk-lsc-interrupt=true
+Note that not all PMD drivers support LSC interrupts.

-Command to set polling mode for all interfaces:
-ovs-vsctl set Open_vSwitch . other_config:dpdk-lsc-interrupt=false
-or:
-ovs-vsctl remove Open_vSwitch . other_config dpdk-lsc-interrupt
-
-Interface specific settings (override global settings)
+The default configuration is polling mode. To set interrupt mode, option
+``dpdk-lsc-interrupt`` has to be set to ``true``.

-Command to set interrupt mode for a specific interface:
-ovs-vsctl set interface <interface_name> options:dpdk-lsc-interrupt=true
+Command to set interrupt mode for a specific interface::
+    $ ovs-vsctl set interface <iface_name> options:dpdk-lsc-interrupt=true

-Command to set polling mode for a specific interface:
-ovs-vsctl set interface <interface_name> options:dpdk-lsc-interrupt=false
+Command to set polling mode for a specific interface::
+    $ ovs-vsctl set interface <iface_name> options:dpdk-lsc-interrupt=false

-Command to reset to globally defined mode for a specific interface:
-ovs-vsctl remove interface <interface_name> options dpdk-lsc-interrupt
+Command to remove ``dpdk-lsc-interrupt`` option::
+    $ ovs-vsctl remove interface <iface_name> options dpdk-lsc-interrupt

 Limitations
 ------------
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 73d0d4b..d092ef1 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -148,7 +148,7 @@ typedef uint16_t dpdk_port_t;
 #define VHOST_ENQ_RETRY_NUM 8
 #define IF_NAME_SZ (PATH_MAX > IFNAMSIZ ? PATH_MAX : IFNAMSIZ)

-static struct rte_eth_conf port_conf = {
+static const struct rte_eth_conf port_conf = {
     .rxmode = {
         .mq_mode = ETH_MQ_RX_RSS,
         .split_hdr_size = 0,
@@ -167,10 +167,6 @@ static struct rte_eth_conf port_conf = {
     .txmode = {
         .mq_mode = ETH_MQ_TX_NONE,
     },
-    .intr_conf = {
-        /* LSC interrupt mode disabled, polling mode used. */
-        .lsc = 0,
-    },
 };

 /*
@@ -469,18 +465,6 @@ int netdev_dpdk_get_vid(const struct netdev_dpdk *dev);
 struct ingress_policer *
 netdev_dpdk_get_ingress_policer(const struct netdev_dpdk *dev);

-void
-netdev_dpdk_set_default_lsc_detect_mode(bool enabled)
-{
-    port_conf.intr_conf.lsc = enabled;
-}
-
-bool
-netdev_dpdk_get_def_lsc_int_mode_enabled(void)
-{
-    return port_conf.intr_conf.lsc;
-}
-
 static bool
 is_dpdk_class(const struct netdev_class *class)
 {
@@ -921,8 +905,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 =
-        netdev_dpdk_get_def_lsc_int_mode_enabled();
+    dev->requested_lsc_interrupt_mode = 0;
     ovsrcu_index_init(&dev->vid, -1);
     dev->vhost_reconfigured = false;
     dev->attached = false;
@@ -1546,8 +1529,7 @@ netdev_dpdk_set_config(struct netdev *netdev, const struct smap *args,
         goto out;
     }

-    bool lsc_interrupt_mode = smap_get_bool(args, "dpdk-lsc-interrupt",
-                              netdev_dpdk_get_def_lsc_int_mode_enabled());
+    bool 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);
diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h
index 8eb51bc..b7d02a7 100644
--- a/lib/netdev-dpdk.h
+++ b/lib/netdev-dpdk.h
@@ -27,8 +27,6 @@ struct dp_packet;

 void netdev_dpdk_register(void);
 void free_dpdk_buf(struct dp_packet *);
-void netdev_dpdk_set_def_lsc_int_mode_enabled(bool enabled);
-bool netdev_dpdk_get_def_lsc_int_mode_enabled(void);

 #else

diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index 87608a5..f44f950 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -68,9 +68,6 @@
 #include "lib/vswitch-idl.h"
 #include "xenserver.h"
 #include "vlan-bitmap.h"
-#ifdef DPDK_NETDEV
-#include "./lib/netdev-provider.h"
-#endif

 VLOG_DEFINE_THIS_MODULE(bridge);

@@ -604,11 +601,6 @@ bridge_reconfigure(const struct ovsrec_open_vswitch *ovs_cfg)
     ofproto_set_vlan_limit(smap_get_int(&ovs_cfg->other_config, "vlan-limit",
                                        LEGACY_MAX_VLAN_HEADERS));

-#ifdef DPDK_NETDEV
-    netdev_dpdk_set_def_lsc_int_mode_enabled(
-        smap_get_bool(&ovs_cfg->other_config, "dpdk-lsc-interrupt", false));
-#endif
-
     ofproto_set_threads(
         smap_get_int(&ovs_cfg->other_config, "n-handler-threads", 0),
         smap_get_int(&ovs_cfg->other_config, "n-revalidator-threads", 0));
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index 91a9003..3c9e637 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -320,29 +320,6 @@
         </p>
       </column>

-      <column name="other_config" key="dpdk-lsc-interrupt"
-              type='{"type": "boolean"}'>
-        <p>
-          Set this value to <code>true</code> to configure interrupt mode for
-          Link State Change (LSC) detection instead of poll mode for DPDK
-          interfaces.
-        </p>
-        <p>
-          The default value is <code>false</code>.
-        </p>
-        <p>
-          If this value is <code>false</code> at startup, poll mode is used for
-          all netdev dpdk interfaces.
-        </p>
-        <p>
-          This value can be overridden for a specific interface in the options
-          section of that interface.
-        </p>
-        <p>
-          This parameter has an effect only on netdev dpdk interfaces.
-        </p>
-      </column>
-
       <column name="other_config" key="dpdk-extra"
               type='{"type": "string"}'>
         <p>
@@ -3663,12 +3640,7 @@ ovs-vsctl add-port br0 p0 -- set Interface p0 type=patch options:peer=p1 \
           interface.
         </p>
         <p>
-          If this value is not set, the value is taken from the global
-          settings.
-        </p>
-        <p>
-          If this value is set, the global LSC interrupt settings are
-          overridden.
+          If this value is not set, poll mode is configured.
         </p>
         <p>
           This parameter has an effect only on netdev dpdk interfaces.



More information about the dev mailing list