Re: [ovs-dev] [PATCH v1] nedev-dpdk: Fix config with dpdk net_bonding offloads.

2024-04-30 Thread Ilya Maximets
On 4/13/24 06:56, Jun Wang wrote:
>>On 4/12/24 08:29, Jun Wang wrote:
>>> If it's a DPDK net_bonding, it may cause
>>> offload-related configurations to take effect,
>>> leading to offload failure.
>>>
>>> /usr/share/openvswitch/scripts/ovs-ctl restart --no-ovs-vswitchd \
>>> --system-id=test
>>> ovs-vsctl --no-wait set open . external-ids:ovn-bridge-datapath-type\
>>> =netdev
>>>ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
>>> ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=\
>>> "4096,4096"
>>> ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=\
>>> 0xff
>>> ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-extra=\
>>> "-a :ca:00.0  -a :ca:00.1 --vdev net_bonding2494589023,\
>>> mode=4,member=:ca:00.0,member=:ca:00.1,xmit_policy=l34,\
>>> lacp_rate=fast"
>>> ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer \
>>> -vsyslog:err -vfile:info --mlockall --no-chdir \
>>> --log-file=/var/log/openvswitch/ovs-vswitchd.log \
>>> --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
>>> ovs-vsctl  add-br br-tun -- set bridge br-tun datapath_type=netdev
>>> ovs-vsctl --may-exist add-port br-tun dpdk_tun_port -- set Interface \
>>> dpdk_tun_port type=dpdk options:dpdk-devargs="net_bonding2494589023"
>>>
>>> {bus_info="bus_name=vdev", driver_name=net_bonding,
>>>  if_descr="DPDK 23.11.0 net_bonding", if_type="6",link_speed="20Gbps",
>>>  max_hash_mac_addrs="0", max_mac_addrs="16", max_rx_pktlen="1618",
>>>  max_rx_queues="1023", max_tx_queues="1023", max_vfs="0",
>>>  max_vmdq_pools="0", min_rx_bufsize="0", n_rxq="4", n_txq="9",
>>>  numa_id="0", port_no="2", rx-steering=rss, rx_csum_offload="false",
>>>  tx_geneve_tso_offload="false", tx_ip_csum_offload="false",
>>>  tx_out_ip_csum_offload="false", tx_out_udp_csum_offload="false",
>>>  tx_sctp_csum_offload="false", tx_tcp_csum_offload="false",
>>>  tx_tcp_seg_offload="false", tx_udp_csum_offload="false",
>>>  tx_vxlan_tso_offload="false"}
>>>
>>> Fixes: 5d11c47d3ebe ("userspace: Enable IP checksum offloading by default.")
>>>
>>> Signed-off-by: Jun Wang 
>>> ---
>>>  lib/netdev-dpdk.c | 75 
>>>+--
>>>  1 file changed, 45 insertions(+), 30 deletions(-)
>>>
>>> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>>> index 2111f77..191c83d 100644
>>> --- a/lib/netdev-dpdk.c
>>> +++ b/lib/netdev-dpdk.c
>>> @@ -1294,15 +1294,10 @@ dpdk_eth_dev_init_rx_metadata(struct netdev_dpdk 
>>>*dev)
>>>      dev->rx_metadata_delivery_configured = true;
>>>  }
>>> 
>>> -static int
>>> -dpdk_eth_dev_init(struct netdev_dpdk *dev)
>>> -    OVS_REQUIRES(dev->mutex)
>>> +static void
>>> +dpdk_eth_offload_config(struct netdev_dpdk *dev,
>>> +   struct rte_eth_dev_info *info)
>>>  {
>>> -    struct rte_pktmbuf_pool_private *mbp_priv;
>>> -    struct rte_eth_dev_info info;
>>> -    struct rte_ether_addr eth_addr;
>>> -    int diag;
>>> -    int n_rxq, n_txq;
>>>      uint32_t rx_chksm_offload_capa = RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
>>>                                       RTE_ETH_RX_OFFLOAD_TCP_CKSUM |
>>>                                       RTE_ETH_RX_OFFLOAD_IPV4_CKSUM;
>>> @@ -1319,16 +1314,14 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
>>>          dpdk_eth_dev_init_rx_metadata(dev);
>>>      }
>>> 
>>> -    rte_eth_dev_info_get(dev->port_id, );
>>> -
>>> -    if (strstr(info.driver_name, "vf") != NULL) {
>>> +    if (strstr(info->driver_name, "vf") != NULL) {
>>>          VLOG_INFO("Virtual function detected, HW_CRC_STRIP will be 
>>>enabled");
>>>          dev->hw_ol_features |= NETDEV_RX_HW_CRC_STRIP;
>>>      } else {
>>>          dev->hw_ol_features &= ~NETDEV_RX_HW_CRC_STRIP;
>>>      }
>>> 
>>> -    if ((info.rx_offload_capa & rx_chksm_offload_capa) !=
>>> +    if ((info->rx_offload_capa & rx_chksm_offload_capa) !=
>>>              rx_chksm_offload_capa) {
>>>          VLOG_WARN("Rx checksum offload is not supported on port "
>>>                    DPDK_PORT_ID_FMT, dev->port_id);
>>> @@ -1337,66 +1330,66 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
>>>          dev->hw_ol_features |= NETDEV_RX_CHECKSUM_OFFLOAD;
>>>      }
>>> 
>>> -    if (info.rx_offload_capa & RTE_ETH_RX_OFFLOAD_SCATTER) {
>>> +    if (info->rx_offload_capa & RTE_ETH_RX_OFFLOAD_SCATTER) {
>>>          dev->hw_ol_features |= NETDEV_RX_HW_SCATTER;
>>>      } else {
>>>          /* Do not warn on lack of scatter support */
>>>          dev->hw_ol_features &= ~NETDEV_RX_HW_SCATTER;
>>>      }
>>> 
>>> -    if (!strcmp(info.driver_name, "net_tap")) {
>>> +    if (!strcmp(info->driver_name, "net_tap")) {
>>>          /* FIXME: L4 checksum offloading is broken in DPDK net/tap driver.
>>>           * This workaround can be removed once the fix makes it to a DPDK
>>>           * LTS release used by OVS. */
>>>          VLOG_INFO("%s: disabled Tx L4 checksum offloads for a net/tap 
>>>port.",
>>>                    

Re: [ovs-dev] [PATCH v1] nedev-dpdk: Fix config with dpdk net_bonding offloads.

2024-04-12 Thread Jun Wang
>On 4/12/24 08:29, Jun Wang wrote:
>> If it's a DPDK net_bonding, it may cause
>> offload-related configurations to take effect,
>> leading to offload failure.
>>
>> /usr/share/openvswitch/scripts/ovs-ctl restart --no-ovs-vswitchd \
>> --system-id=test
>> ovs-vsctl --no-wait set open . external-ids:ovn-bridge-datapath-type\
>> =netdev
>>ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
>> ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=\
>> "4096,4096"
>> ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=\
>> 0xff
>> ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-extra=\
>> "-a :ca:00.0  -a :ca:00.1 --vdev net_bonding2494589023,\
>> mode=4,member=:ca:00.0,member=:ca:00.1,xmit_policy=l34,\
>> lacp_rate=fast"
>> ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer \
>> -vsyslog:err -vfile:info --mlockall --no-chdir \
>> --log-file=/var/log/openvswitch/ovs-vswitchd.log \
>> --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
>> ovs-vsctl  add-br br-tun -- set bridge br-tun datapath_type=netdev
>> ovs-vsctl --may-exist add-port br-tun dpdk_tun_port -- set Interface \
>> dpdk_tun_port type=dpdk options:dpdk-devargs="net_bonding2494589023"
>>
>> {bus_info="bus_name=vdev", driver_name=net_bonding,
>>  if_descr="DPDK 23.11.0 net_bonding", if_type="6",link_speed="20Gbps",
>>  max_hash_mac_addrs="0", max_mac_addrs="16", max_rx_pktlen="1618",
>>  max_rx_queues="1023", max_tx_queues="1023", max_vfs="0",
>>  max_vmdq_pools="0", min_rx_bufsize="0", n_rxq="4", n_txq="9",
>>  numa_id="0", port_no="2", rx-steering=rss, rx_csum_offload="false",
>>  tx_geneve_tso_offload="false", tx_ip_csum_offload="false",
>>  tx_out_ip_csum_offload="false", tx_out_udp_csum_offload="false",
>>  tx_sctp_csum_offload="false", tx_tcp_csum_offload="false",
>>  tx_tcp_seg_offload="false", tx_udp_csum_offload="false",
>>  tx_vxlan_tso_offload="false"}
>>
>> Fixes: 5d11c47d3ebe ("userspace: Enable IP checksum offloading by default.")
>>
>> Signed-off-by: Jun Wang 
>> ---
>>  lib/netdev-dpdk.c | 75 
>> +--
>>  1 file changed, 45 insertions(+), 30 deletions(-)
>>
>> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>> index 2111f77..191c83d 100644
>> --- a/lib/netdev-dpdk.c
>> +++ b/lib/netdev-dpdk.c
>> @@ -1294,15 +1294,10 @@ dpdk_eth_dev_init_rx_metadata(struct netdev_dpdk 
>> *dev)
>>  dev->rx_metadata_delivery_configured = true;
>>  }
>> 
>> -static int
>> -dpdk_eth_dev_init(struct netdev_dpdk *dev)
>> -OVS_REQUIRES(dev->mutex)
>> +static void
>> +dpdk_eth_offload_config(struct netdev_dpdk *dev,
>> +   struct rte_eth_dev_info *info)
>>  {
>> -struct rte_pktmbuf_pool_private *mbp_priv;
>> -struct rte_eth_dev_info info;
>> -struct rte_ether_addr eth_addr;
>> -int diag;
>> -int n_rxq, n_txq;
>>  uint32_t rx_chksm_offload_capa = RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
>>   RTE_ETH_RX_OFFLOAD_TCP_CKSUM |
>>   RTE_ETH_RX_OFFLOAD_IPV4_CKSUM;
>> @@ -1319,16 +1314,14 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
>>  dpdk_eth_dev_init_rx_metadata(dev);
>>  }
>> 
>> -rte_eth_dev_info_get(dev->port_id, );
>> -
>> -if (strstr(info.driver_name, "vf") != NULL) {
>> +if (strstr(info->driver_name, "vf") != NULL) {
>>  VLOG_INFO("Virtual function detected, HW_CRC_STRIP will be 
>> enabled");
>>  dev->hw_ol_features |= NETDEV_RX_HW_CRC_STRIP;
>>  } else {
>>  dev->hw_ol_features &= ~NETDEV_RX_HW_CRC_STRIP;
>>  }
>> 
>> -if ((info.rx_offload_capa & rx_chksm_offload_capa) !=
>> +if ((info->rx_offload_capa & rx_chksm_offload_capa) !=
>>  rx_chksm_offload_capa) {
>>  VLOG_WARN("Rx checksum offload is not supported on port "
>>DPDK_PORT_ID_FMT, dev->port_id);
>> @@ -1337,66 +1330,66 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
>>  dev->hw_ol_features |= NETDEV_RX_CHECKSUM_OFFLOAD;
>>  }
>> 
>> -if (info.rx_offload_capa & RTE_ETH_RX_OFFLOAD_SCATTER) {
>> +if (info->rx_offload_capa & RTE_ETH_RX_OFFLOAD_SCATTER) {
>>  dev->hw_ol_features |= NETDEV_RX_HW_SCATTER;
>>  } else {
>>  /* Do not warn on lack of scatter support */
>>  dev->hw_ol_features &= ~NETDEV_RX_HW_SCATTER;
>>  }
>> 
>> -if (!strcmp(info.driver_name, "net_tap")) {
>> +if (!strcmp(info->driver_name, "net_tap")) {
>>  /* FIXME: L4 checksum offloading is broken in DPDK net/tap driver.
>>   * This workaround can be removed once the fix makes it to a DPDK
>>   * LTS release used by OVS. */
>>  VLOG_INFO("%s: disabled Tx L4 checksum offloads for a net/tap 
>> port.",
>>netdev_get_name(>up));
>> -info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_UDP_CKSUM;
>> -info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_TCP_CKSUM;

Re: [ovs-dev] [PATCH v1] nedev-dpdk: Fix config with dpdk net_bonding offloads.

2024-04-12 Thread Ilya Maximets
On 4/12/24 08:29, Jun Wang wrote:
> If it's a DPDK net_bonding, it may cause
> offload-related configurations to take effect,
> leading to offload failure.
> 
> /usr/share/openvswitch/scripts/ovs-ctl restart --no-ovs-vswitchd \
> --system-id=test
> ovs-vsctl --no-wait set open . external-ids:ovn-bridge-datapath-type\
> =netdev
> ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
> ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=\
> "4096,4096"
> ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=\
> 0xff
> ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-extra=\
> "-a :ca:00.0  -a :ca:00.1 --vdev net_bonding2494589023,\
> mode=4,member=:ca:00.0,member=:ca:00.1,xmit_policy=l34,\
> lacp_rate=fast"
> ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer \
> -vsyslog:err -vfile:info --mlockall --no-chdir \
> --log-file=/var/log/openvswitch/ovs-vswitchd.log \
> --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
> ovs-vsctl  add-br br-tun -- set bridge br-tun datapath_type=netdev
> ovs-vsctl --may-exist add-port br-tun dpdk_tun_port -- set Interface \
> dpdk_tun_port type=dpdk options:dpdk-devargs="net_bonding2494589023"
> 
> {bus_info="bus_name=vdev", driver_name=net_bonding,
>  if_descr="DPDK 23.11.0 net_bonding", if_type="6",link_speed="20Gbps",
>  max_hash_mac_addrs="0", max_mac_addrs="16", max_rx_pktlen="1618",
>  max_rx_queues="1023", max_tx_queues="1023", max_vfs="0",
>  max_vmdq_pools="0", min_rx_bufsize="0", n_rxq="4", n_txq="9",
>  numa_id="0", port_no="2", rx-steering=rss, rx_csum_offload="false",
>  tx_geneve_tso_offload="false", tx_ip_csum_offload="false",
>  tx_out_ip_csum_offload="false", tx_out_udp_csum_offload="false",
>  tx_sctp_csum_offload="false", tx_tcp_csum_offload="false",
>  tx_tcp_seg_offload="false", tx_udp_csum_offload="false",
>  tx_vxlan_tso_offload="false"}
> 
> Fixes: 5d11c47d3ebe ("userspace: Enable IP checksum offloading by default.")
> 
> Signed-off-by: Jun Wang 
> ---
>  lib/netdev-dpdk.c | 75 
> +--
>  1 file changed, 45 insertions(+), 30 deletions(-)
> 
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index 2111f77..191c83d 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -1294,15 +1294,10 @@ dpdk_eth_dev_init_rx_metadata(struct netdev_dpdk *dev)
>  dev->rx_metadata_delivery_configured = true;
>  }
>  
> -static int
> -dpdk_eth_dev_init(struct netdev_dpdk *dev)
> -OVS_REQUIRES(dev->mutex)
> +static void
> +dpdk_eth_offload_config(struct netdev_dpdk *dev,
> +   struct rte_eth_dev_info *info)
>  {
> -struct rte_pktmbuf_pool_private *mbp_priv;
> -struct rte_eth_dev_info info;
> -struct rte_ether_addr eth_addr;
> -int diag;
> -int n_rxq, n_txq;
>  uint32_t rx_chksm_offload_capa = RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
>   RTE_ETH_RX_OFFLOAD_TCP_CKSUM |
>   RTE_ETH_RX_OFFLOAD_IPV4_CKSUM;
> @@ -1319,16 +1314,14 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
>  dpdk_eth_dev_init_rx_metadata(dev);
>  }
>  
> -rte_eth_dev_info_get(dev->port_id, );
> -
> -if (strstr(info.driver_name, "vf") != NULL) {
> +if (strstr(info->driver_name, "vf") != NULL) {
>  VLOG_INFO("Virtual function detected, HW_CRC_STRIP will be enabled");
>  dev->hw_ol_features |= NETDEV_RX_HW_CRC_STRIP;
>  } else {
>  dev->hw_ol_features &= ~NETDEV_RX_HW_CRC_STRIP;
>  }
>  
> -if ((info.rx_offload_capa & rx_chksm_offload_capa) !=
> +if ((info->rx_offload_capa & rx_chksm_offload_capa) !=
>  rx_chksm_offload_capa) {
>  VLOG_WARN("Rx checksum offload is not supported on port "
>DPDK_PORT_ID_FMT, dev->port_id);
> @@ -1337,66 +1330,66 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
>  dev->hw_ol_features |= NETDEV_RX_CHECKSUM_OFFLOAD;
>  }
>  
> -if (info.rx_offload_capa & RTE_ETH_RX_OFFLOAD_SCATTER) {
> +if (info->rx_offload_capa & RTE_ETH_RX_OFFLOAD_SCATTER) {
>  dev->hw_ol_features |= NETDEV_RX_HW_SCATTER;
>  } else {
>  /* Do not warn on lack of scatter support */
>  dev->hw_ol_features &= ~NETDEV_RX_HW_SCATTER;
>  }
>  
> -if (!strcmp(info.driver_name, "net_tap")) {
> +if (!strcmp(info->driver_name, "net_tap")) {
>  /* FIXME: L4 checksum offloading is broken in DPDK net/tap driver.
>   * This workaround can be removed once the fix makes it to a DPDK
>   * LTS release used by OVS. */
>  VLOG_INFO("%s: disabled Tx L4 checksum offloads for a net/tap port.",
>netdev_get_name(>up));
> -info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_UDP_CKSUM;
> -info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_TCP_CKSUM;
> +info->tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_UDP_CKSUM;
> +info->tx_offload_capa &= 

Re: [ovs-dev] [PATCH v1] nedev-dpdk: Fix config with dpdk net_bonding offloads.

2024-04-12 Thread junwan...@cestc.cn

>Hello,
>
>On Fri, Apr 12, 2024 at 8:30 AM Jun Wang  wrote:
>>
>> If it's a DPDK net_bonding, it may cause
>> offload-related configurations to take effect,
>> leading to offload failure.
>
>I did not look at the patch for now.

>What is the interest of using a net/bonding DPDK port when there is
>native support of bonding in OVS?
>I am not familiar with OVN setups so maybe I am missing something on this side.

Yes, OVS itself has bonding capability. However, there are cases where DPDK
net/bonding is used. Specifically, we have compared the performance of the 
two methods in some scenarios and found some differences. Therefore,
in some scenarios, DPDK net/bonding is chosen. However, OVS did not 
consider the issue of DPDK net/bonding when modifying checksum offload.
___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


Re: [ovs-dev] [PATCH v1] nedev-dpdk: Fix config with dpdk net_bonding offloads.

2024-04-12 Thread David Marchand
Hello,

On Fri, Apr 12, 2024 at 8:30 AM Jun Wang  wrote:
>
> If it's a DPDK net_bonding, it may cause
> offload-related configurations to take effect,
> leading to offload failure.

I did not look at the patch for now.

What is the interest of using a net/bonding DPDK port when there is
native support of bonding in OVS?
I am not familiar with OVN setups so maybe I am missing something on this side.


-- 
David Marchand

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


[ovs-dev] [PATCH v1] nedev-dpdk: Fix config with dpdk net_bonding offloads.

2024-04-12 Thread Jun Wang
If it's a DPDK net_bonding, it may cause
offload-related configurations to take effect,
leading to offload failure.

/usr/share/openvswitch/scripts/ovs-ctl restart --no-ovs-vswitchd \
--system-id=test
ovs-vsctl --no-wait set open . external-ids:ovn-bridge-datapath-type\
=netdev
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=\
"4096,4096"
ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=\
0xff
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-extra=\
"-a :ca:00.0  -a :ca:00.1 --vdev net_bonding2494589023,\
mode=4,member=:ca:00.0,member=:ca:00.1,xmit_policy=l34,\
lacp_rate=fast"
ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer \
-vsyslog:err -vfile:info --mlockall --no-chdir \
--log-file=/var/log/openvswitch/ovs-vswitchd.log \
--pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
ovs-vsctl  add-br br-tun -- set bridge br-tun datapath_type=netdev
ovs-vsctl --may-exist add-port br-tun dpdk_tun_port -- set Interface \
dpdk_tun_port type=dpdk options:dpdk-devargs="net_bonding2494589023"

{bus_info="bus_name=vdev", driver_name=net_bonding,
 if_descr="DPDK 23.11.0 net_bonding", if_type="6",link_speed="20Gbps",
 max_hash_mac_addrs="0", max_mac_addrs="16", max_rx_pktlen="1618",
 max_rx_queues="1023", max_tx_queues="1023", max_vfs="0",
 max_vmdq_pools="0", min_rx_bufsize="0", n_rxq="4", n_txq="9",
 numa_id="0", port_no="2", rx-steering=rss, rx_csum_offload="false",
 tx_geneve_tso_offload="false", tx_ip_csum_offload="false",
 tx_out_ip_csum_offload="false", tx_out_udp_csum_offload="false",
 tx_sctp_csum_offload="false", tx_tcp_csum_offload="false",
 tx_tcp_seg_offload="false", tx_udp_csum_offload="false",
 tx_vxlan_tso_offload="false"}

Fixes: 5d11c47d3ebe ("userspace: Enable IP checksum offloading by default.")

Signed-off-by: Jun Wang 
---
 lib/netdev-dpdk.c | 75 +--
 1 file changed, 45 insertions(+), 30 deletions(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 2111f77..191c83d 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -1294,15 +1294,10 @@ dpdk_eth_dev_init_rx_metadata(struct netdev_dpdk *dev)
 dev->rx_metadata_delivery_configured = true;
 }
 
-static int
-dpdk_eth_dev_init(struct netdev_dpdk *dev)
-OVS_REQUIRES(dev->mutex)
+static void
+dpdk_eth_offload_config(struct netdev_dpdk *dev,
+   struct rte_eth_dev_info *info)
 {
-struct rte_pktmbuf_pool_private *mbp_priv;
-struct rte_eth_dev_info info;
-struct rte_ether_addr eth_addr;
-int diag;
-int n_rxq, n_txq;
 uint32_t rx_chksm_offload_capa = RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
  RTE_ETH_RX_OFFLOAD_TCP_CKSUM |
  RTE_ETH_RX_OFFLOAD_IPV4_CKSUM;
@@ -1319,16 +1314,14 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
 dpdk_eth_dev_init_rx_metadata(dev);
 }
 
-rte_eth_dev_info_get(dev->port_id, );
-
-if (strstr(info.driver_name, "vf") != NULL) {
+if (strstr(info->driver_name, "vf") != NULL) {
 VLOG_INFO("Virtual function detected, HW_CRC_STRIP will be enabled");
 dev->hw_ol_features |= NETDEV_RX_HW_CRC_STRIP;
 } else {
 dev->hw_ol_features &= ~NETDEV_RX_HW_CRC_STRIP;
 }
 
-if ((info.rx_offload_capa & rx_chksm_offload_capa) !=
+if ((info->rx_offload_capa & rx_chksm_offload_capa) !=
 rx_chksm_offload_capa) {
 VLOG_WARN("Rx checksum offload is not supported on port "
   DPDK_PORT_ID_FMT, dev->port_id);
@@ -1337,66 +1330,66 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev)
 dev->hw_ol_features |= NETDEV_RX_CHECKSUM_OFFLOAD;
 }
 
-if (info.rx_offload_capa & RTE_ETH_RX_OFFLOAD_SCATTER) {
+if (info->rx_offload_capa & RTE_ETH_RX_OFFLOAD_SCATTER) {
 dev->hw_ol_features |= NETDEV_RX_HW_SCATTER;
 } else {
 /* Do not warn on lack of scatter support */
 dev->hw_ol_features &= ~NETDEV_RX_HW_SCATTER;
 }
 
-if (!strcmp(info.driver_name, "net_tap")) {
+if (!strcmp(info->driver_name, "net_tap")) {
 /* FIXME: L4 checksum offloading is broken in DPDK net/tap driver.
  * This workaround can be removed once the fix makes it to a DPDK
  * LTS release used by OVS. */
 VLOG_INFO("%s: disabled Tx L4 checksum offloads for a net/tap port.",
   netdev_get_name(>up));
-info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_UDP_CKSUM;
-info.tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_TCP_CKSUM;
+info->tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_UDP_CKSUM;
+info->tx_offload_capa &= ~RTE_ETH_TX_OFFLOAD_TCP_CKSUM;
 }
 
-if (!strcmp(info.driver_name, "net_ice")
-|| !strcmp(info.driver_name, "net_i40e")) {
+if (!strcmp(info->driver_name, "net_ice")
+|| !strcmp(info->driver_name, "net_i40e")) {
 /* FIXME: