[ovs-dev] [PATCH v3] netdev-dpdk: add support for the RTE_ETH_EVENT_INTR_RESET event
Eelco Chaudron
echaudro at redhat.com
Tue Sep 24 13:15:09 UTC 2019
On 12 Sep 2019, at 12:24, Ilya Maximets wrote:
> On 12.09.2019 13:19, Ilya Maximets wrote:
>> On 12.09.2019 13:07, Eelco Chaudron wrote:
>>>
>>>
>>> On 12 Sep 2019, at 10:39, Ilya Maximets wrote:
>>>
>>>> On 11.09.2019 16:20, Eelco Chaudron wrote:
>>>>> Currently, OVS does not register and therefore not handle the
>>>>> interface reset event from the DPDK framework. This would cause a
>>>>> problem in cases where a VF is used as an interface, and its
>>>>> configuration changes.
>>>>>
>>>>> As an example in the following scenario the MAC change is not
>>>>> detected/acted upon until OVS is restarted without the patch
>>>>> applied:
>>>>>
>>>>> $ echo 1 > /sys/bus/pci/devices/0000:05:00.1/sriov_numvfs
>>>>> $ ovs-vsctl add-port ovs_pvp_br0 dpdk0 -- \
>>>>> set Interface dpdk0 type=dpdk -- \
>>>>> set Interface dpdk0
>>>>> options:dpdk-devargs=0000:05:0a.0
>>>>>
>>>>> $ ip link set p5p2 vf 0 mac 52:54:00:92:d3:33
>>>>>
>>>>> Signed-off-by: Eelco Chaudron <echaudro at redhat.com>
>>>>> ---
>>>>
>>>> <snip>
>>>>
>>>>> @@ -4180,13 +4223,19 @@ netdev_dpdk_reconfigure(struct netdev
>>>>> *netdev)
>>>>> && dev->rxq_size == dev->requested_rxq_size
>>>>> && dev->txq_size == dev->requested_txq_size
>>>>> && dev->socket_id == dev->requested_socket_id
>>>>> - && dev->started) {
>>>>> + && dev->started && !dev->reset_needed) {
>>>>> /* Reconfiguration is unnecessary */
>>>>>
>>>>> goto out;
>>>>> }
>>>>>
>>>>> - rte_eth_dev_stop(dev->port_id);
>>>>> + if (dev->reset_needed) {
>>>>> + rte_eth_dev_reset(dev->port_id);
>>>>
>>>> Thinking more about the change and looking at flow control
>>>> configuration,
>>>> it seems that on reset we'll lost configurations done in
>>>> set_config().
>>>> Device reset should return it to initial state, i.e. all the
>>>> default settings,
>>>> but set_config() will not be called after that.
>>>> I know, that VFs commonly doesn't support flow control, but if
>>>> we'll add like
>>>> real configuration of MAC address, it will be lost too.
>>>>
>>>> What do you think?
>>>
>>> Doesn’t the full bridge run sequence take care of this?
>>>
>>> So in callback we do netdev_request_reconfigure() which triggers the
>>> following sequence…
>>>
>>> bridge_run__()
>>> ...
>>> dpif_netdev_run()
>>> ...
>>> reconfigure_datapath()
>>> ...
>>> netdev_dpdk_reconfigure()
>>>
>>> But than also it will call in the next run
>>>
>>> bridge_run()
>>> ...
>>> bridge_delete_or_reconfigure_ports()
>>> ...
>>> netdev_set_config()
>>> netdev_dpdk_set_config()
>>>
>>>
>>> Or do I miss something?
>>
>> dpif_netdev_run() is called from ofproto_type_run() which is called
>> unconditionally from the bridge_run().
>> But bridge_delete_or_reconfigure_ports() only called from
>> bridge_reconfigure(),
>> which is protected by the following condition:
>>
>> if (ovsdb_idl_get_seqno(idl) != idl_seqno ||
>> if_notifier_changed(ifnotifier)) {
>>
>> i.e. if there will be no DB updates or there will be no netlink
>> notifications,
>> set_config() will not be called. I understand that in your scenario
>> there
>> might be netlink notification for interface changes since PF is
>> controlled
>> by the kernel, but it might be not the case if PF attached as a DPDK
>> port
>> to OVS or some other application.
>
> Hmm. Basically, dpdk_eth_event_callback() is an analogue of the
> if_notifier, but for DPDK application.
>
> Maybe we can add it as another trigger for above 'if' condition?
It sounds like a good idea, however, I see no clean way of doing this as
the if_notifier_changed()/if_notifier_create() is not data path
abstracted.
Any ideas for a nice clean solution here? Guess we could add a
dpdk_notifier_create() in if-notifier.c
Thoughts?
More information about the dev
mailing list