<feed xmlns='http://www.w3.org/2005/Atom'>
<title>delta/openvswitch.git, branch master</title>
<subtitle>github.com: openvswitch/ovs.git
</subtitle>
<link rel='alternate' type='text/html' href='http://trove.baserock.org/cgit/delta/openvswitch.git/'/>
<entry>
<title>test-stream: Add ssl tests for stream open block.</title>
<updated>2023-05-11T19:41:03+00:00</updated>
<author>
<name>Stefan Hoffmann</name>
<email>stefan.hoffmann@cloudandheat.com</email>
</author>
<published>2023-05-11T13:38:50+00:00</published>
<link rel='alternate' type='text/html' href='http://trove.baserock.org/cgit/delta/openvswitch.git/commit/?id=965c2955e6750f503b55d5c0af516cbb7b45f7ae'/>
<id>965c2955e6750f503b55d5c0af516cbb7b45f7ae</id>
<content type='text'>
This tests stream.c and stream.py with ssl connection at
CHECK_STREAM_OPEN_BLOCK.
For the tests, ovsdb needs to be build with libssl.

Signed-off-by: Stefan Hoffmann &lt;stefan.hoffmann@cloudandheat.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This tests stream.c and stream.py with ssl connection at
CHECK_STREAM_OPEN_BLOCK.
For the tests, ovsdb needs to be build with libssl.

Signed-off-by: Stefan Hoffmann &lt;stefan.hoffmann@cloudandheat.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>tests-ovsdb: Switch OVSDB_START_IDLTEST to macro.</title>
<updated>2023-05-11T19:41:03+00:00</updated>
<author>
<name>Stefan Hoffmann</name>
<email>stefan.hoffmann@cloudandheat.com</email>
</author>
<published>2023-05-11T13:35:15+00:00</published>
<link rel='alternate' type='text/html' href='http://trove.baserock.org/cgit/delta/openvswitch.git/commit/?id=f3f3be682dfaaf13cecb69a17767151d18787a57'/>
<id>f3f3be682dfaaf13cecb69a17767151d18787a57</id>
<content type='text'>
Define bash function as macro now. Later we can extend this macro for other
usecases.

Signed-off-by: Stefan Hoffmann &lt;stefan.hoffmann@cloudandheat.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Define bash function as macro now. Later we can extend this macro for other
usecases.

Signed-off-by: Stefan Hoffmann &lt;stefan.hoffmann@cloudandheat.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>AUTHORS: Add Zhiqi Chen.</title>
<updated>2023-05-11T19:13:29+00:00</updated>
<author>
<name>Ilya Maximets</name>
<email>i.maximets@ovn.org</email>
</author>
<published>2023-05-11T19:13:29+00:00</published>
<link rel='alternate' type='text/html' href='http://trove.baserock.org/cgit/delta/openvswitch.git/commit/?id=64e4cca5c4925f903386367848bc8ad5df10f417'/>
<id>64e4cca5c4925f903386367848bc8ad5df10f417</id>
<content type='text'>
Additionally re-sorted part of the list that was particularly
not ordered.

Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Additionally re-sorted part of the list that was particularly
not ordered.

Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>dpctl: Fix dereferencing null pointer in parse_ct_limit_zones().</title>
<updated>2023-05-11T19:11:36+00:00</updated>
<author>
<name>Zhiqi Chen</name>
<email>chenzhiqi.123@bytedance.com</email>
</author>
<published>2023-05-10T08:35:37+00:00</published>
<link rel='alternate' type='text/html' href='http://trove.baserock.org/cgit/delta/openvswitch.git/commit/?id=ffb8b743bb7706f6b33d0b329d011bf163976652'/>
<id>ffb8b743bb7706f6b33d0b329d011bf163976652</id>
<content type='text'>
Command with empty string following "dpctl/ct-get-limits zone="
such as "ovs-appctl dpctl/ct-get-limits zone=" will cause
parse_ct_limit_zones() dereferencing null.

Signed-off-by: Zhiqi Chen &lt;chenzhiqi.123@bytedance.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Command with empty string following "dpctl/ct-get-limits zone="
such as "ovs-appctl dpctl/ct-get-limits zone=" will cause
parse_ct_limit_zones() dereferencing null.

Signed-off-by: Zhiqi Chen &lt;chenzhiqi.123@bytedance.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>netdev-offload: Fix deadlock/recursive use of the netdev_hmap_rwlock rwlock.</title>
<updated>2023-05-10T19:57:05+00:00</updated>
<author>
<name>Eelco Chaudron</name>
<email>echaudro@redhat.com</email>
</author>
<published>2023-05-09T14:29:58+00:00</published>
<link rel='alternate' type='text/html' href='http://trove.baserock.org/cgit/delta/openvswitch.git/commit/?id=cd608cf96eb93ebc4aa44d1393b9cb00bfde46e5'/>
<id>cd608cf96eb93ebc4aa44d1393b9cb00bfde46e5</id>
<content type='text'>
When doing performance testing with OVS v3.1 we ran into a deadlock
situation with the netdev_hmap_rwlock read/write lock. After some
debugging, it was discovered that the netdev_hmap_rwlock read lock
was taken recursively. And well in the following sequence of events:

 netdev_ports_flow_get()
   It takes the read lock, while it walks all the ports
   in the port_to_netdev hmap and calls:
   - netdev_flow_get() which will call:
     - netdev_tc_flow_get() which will call:
       - netdev_ifindex_to_odp_port()
          This function also takes the same read lock to
          walk the ifindex_to_port hmap.

In OVS a read/write lock does not support recursive readers. For details
see the comments in ovs-thread.h. If you do this, it will lock up,
mainly due to OVS setting the PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
attribute to the lock.

The solution with this patch is to use two separate read/write
locks, with an order guarantee to avoid another potential deadlock.

Fixes: 9fe21a4fc12a ("netdev-offload: replace netdev_hmap_mutex to netdev_hmap_rwlock")
Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2182541
Reviewed-by: Simon Horman &lt;simon.horman@corigine.com&gt;
Signed-off-by: Eelco Chaudron &lt;echaudro@redhat.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When doing performance testing with OVS v3.1 we ran into a deadlock
situation with the netdev_hmap_rwlock read/write lock. After some
debugging, it was discovered that the netdev_hmap_rwlock read lock
was taken recursively. And well in the following sequence of events:

 netdev_ports_flow_get()
   It takes the read lock, while it walks all the ports
   in the port_to_netdev hmap and calls:
   - netdev_flow_get() which will call:
     - netdev_tc_flow_get() which will call:
       - netdev_ifindex_to_odp_port()
          This function also takes the same read lock to
          walk the ifindex_to_port hmap.

In OVS a read/write lock does not support recursive readers. For details
see the comments in ovs-thread.h. If you do this, it will lock up,
mainly due to OVS setting the PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP
attribute to the lock.

The solution with this patch is to use two separate read/write
locks, with an order guarantee to avoid another potential deadlock.

Fixes: 9fe21a4fc12a ("netdev-offload: replace netdev_hmap_mutex to netdev_hmap_rwlock")
Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2182541
Reviewed-by: Simon Horman &lt;simon.horman@corigine.com&gt;
Signed-off-by: Eelco Chaudron &lt;echaudro@redhat.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>ofproto-dpif-xlate: Fix use-after-free when xlate_actions().</title>
<updated>2023-05-10T19:40:41+00:00</updated>
<author>
<name>Yunjian Wang</name>
<email>wangyunjian@huawei.com</email>
</author>
<published>2023-05-06T10:00:09+00:00</published>
<link rel='alternate' type='text/html' href='http://trove.baserock.org/cgit/delta/openvswitch.git/commit/?id=14773af4b28fd3c30832cd1cb05711fd9b345fbf'/>
<id>14773af4b28fd3c30832cd1cb05711fd9b345fbf</id>
<content type='text'>
Currently, bundle-&gt;cvlans and xbundle-&gt;cvlans are pointing to the
same memory location. This can cause issues if the main thread
modifies bundle-&gt;cvlans and frees it while the revalidator thread
is still accessing xbundle-&gt;cvlans. This leads to use-after-free
error.

AddressSanitizer: heap-use-after-free on address 0x615000007b08 at
                        pc 0x0000004ede1e bp 0x7f3120ee0310 sp 0x7f3120ee0300
READ of size 8 at 0x615000007b08 thread T25 (revalidator25)
    0 0x4ede1d in bitmap_is_set lib/bitmap.h:91
    1 0x4fcb26 in xbundle_allows_cvlan ofproto/ofproto-dpif-xlate.c:2028
    2 0x4fe279 in input_vid_is_valid ofproto/ofproto-dpif-xlate.c:2294
    3 0x502abf in xlate_normal ofproto/ofproto-dpif-xlate.c:3051
    4 0x5164dc in xlate_output_action ofproto/ofproto-dpif-xlate.c:5361
    5 0x522576 in do_xlate_actions ofproto/ofproto-dpif-xlate.c:7047
    6 0x52a751 in xlate_actions ofproto/ofproto-dpif-xlate.c:8061
    7 0x4e2b66 in xlate_key ofproto/ofproto-dpif-upcall.c:2212
    8 0x4e2e13 in xlate_ukey ofproto/ofproto-dpif-upcall.c:2227
    9 0x4e345d in revalidate_ukey__ ofproto/ofproto-dpif-upcall.c:2276
    10 0x4e3f85 in revalidate_ukey ofproto/ofproto-dpif-upcall.c:2395
    11 0x4e7ac5 in revalidate ofproto/ofproto-dpif-upcall.c:2858
    12 0x4d9ed3 in udpif_revalidator ofproto/ofproto-dpif-upcall.c:1010
    13 0x7cd92e in ovsthread_wrapper lib/ovs-thread.c:423
    14 0x7f312ff01f3a  (/usr/lib64/libpthread.so.0+0x8f3a)
    15 0x7f312fc8f51f in clone (/usr/lib64/libc.so.6+0xf851f)

0x615000007b08 is located 8 bytes inside of 512-byte region
                                        [0x615000007b00,0x615000007d00)
freed by thread T0 here:
    0 0x7f3130378ad8 in free (/usr/lib64/libasan.so.4+0xe0ad8)
    1 0x49044e in bundle_set ofproto/ofproto-dpif.c:3431
    2 0x444f92 in ofproto_bundle_register ofproto/ofproto.c:1455
    3 0x40e6c9 in port_configure vswitchd/bridge.c:1300
    4 0x40bcfd in bridge_reconfigure vswitchd/bridge.c:921
    5 0x41f1a9 in bridge_run vswitchd/bridge.c:3313
    6 0x42d4fb in main vswitchd/ovs-vswitchd.c:132
    7 0x7f312fbbcc86 in __libc_start_main (/usr/lib64/libc.so.6+0x25c86)

previously allocated by thread T0 here:
    0 0x7f3130378e70 in __interceptor_malloc
    1 0x8757fe in xmalloc__ lib/util.c:140
    2 0x8758da in xmalloc lib/util.c:175
    3 0x875927 in xmemdup lib/util.c:188
    4 0x475f63 in bitmap_clone lib/bitmap.h:79
    5 0x47797c in vlan_bitmap_clone lib/vlan-bitmap.h:40
    6 0x49048d in bundle_set ofproto/ofproto-dpif.c:3433
    7 0x444f92 in ofproto_bundle_register ofproto/ofproto.c:1455
    8 0x40e6c9 in port_configure vswitchd/bridge.c:1300
    9 0x40bcfd in bridge_reconfigure vswitchd/bridge.c:921
    10 0x41f1a9 in bridge_run vswitchd/bridge.c:3313
    11 0x42d4fb in main vswitchd/ovs-vswitchd.c:132
    12 0x7f312fbbcc86 in __libc_start_main (/usr/lib64/libc.so.6+0x25c86)

Fixes: fed8962aff57 ("Add new port VLAN mode "dot1q-tunnel"")
Signed-off-by: Yunjian Wang &lt;wangyunjian@huawei.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Currently, bundle-&gt;cvlans and xbundle-&gt;cvlans are pointing to the
same memory location. This can cause issues if the main thread
modifies bundle-&gt;cvlans and frees it while the revalidator thread
is still accessing xbundle-&gt;cvlans. This leads to use-after-free
error.

AddressSanitizer: heap-use-after-free on address 0x615000007b08 at
                        pc 0x0000004ede1e bp 0x7f3120ee0310 sp 0x7f3120ee0300
READ of size 8 at 0x615000007b08 thread T25 (revalidator25)
    0 0x4ede1d in bitmap_is_set lib/bitmap.h:91
    1 0x4fcb26 in xbundle_allows_cvlan ofproto/ofproto-dpif-xlate.c:2028
    2 0x4fe279 in input_vid_is_valid ofproto/ofproto-dpif-xlate.c:2294
    3 0x502abf in xlate_normal ofproto/ofproto-dpif-xlate.c:3051
    4 0x5164dc in xlate_output_action ofproto/ofproto-dpif-xlate.c:5361
    5 0x522576 in do_xlate_actions ofproto/ofproto-dpif-xlate.c:7047
    6 0x52a751 in xlate_actions ofproto/ofproto-dpif-xlate.c:8061
    7 0x4e2b66 in xlate_key ofproto/ofproto-dpif-upcall.c:2212
    8 0x4e2e13 in xlate_ukey ofproto/ofproto-dpif-upcall.c:2227
    9 0x4e345d in revalidate_ukey__ ofproto/ofproto-dpif-upcall.c:2276
    10 0x4e3f85 in revalidate_ukey ofproto/ofproto-dpif-upcall.c:2395
    11 0x4e7ac5 in revalidate ofproto/ofproto-dpif-upcall.c:2858
    12 0x4d9ed3 in udpif_revalidator ofproto/ofproto-dpif-upcall.c:1010
    13 0x7cd92e in ovsthread_wrapper lib/ovs-thread.c:423
    14 0x7f312ff01f3a  (/usr/lib64/libpthread.so.0+0x8f3a)
    15 0x7f312fc8f51f in clone (/usr/lib64/libc.so.6+0xf851f)

0x615000007b08 is located 8 bytes inside of 512-byte region
                                        [0x615000007b00,0x615000007d00)
freed by thread T0 here:
    0 0x7f3130378ad8 in free (/usr/lib64/libasan.so.4+0xe0ad8)
    1 0x49044e in bundle_set ofproto/ofproto-dpif.c:3431
    2 0x444f92 in ofproto_bundle_register ofproto/ofproto.c:1455
    3 0x40e6c9 in port_configure vswitchd/bridge.c:1300
    4 0x40bcfd in bridge_reconfigure vswitchd/bridge.c:921
    5 0x41f1a9 in bridge_run vswitchd/bridge.c:3313
    6 0x42d4fb in main vswitchd/ovs-vswitchd.c:132
    7 0x7f312fbbcc86 in __libc_start_main (/usr/lib64/libc.so.6+0x25c86)

previously allocated by thread T0 here:
    0 0x7f3130378e70 in __interceptor_malloc
    1 0x8757fe in xmalloc__ lib/util.c:140
    2 0x8758da in xmalloc lib/util.c:175
    3 0x875927 in xmemdup lib/util.c:188
    4 0x475f63 in bitmap_clone lib/bitmap.h:79
    5 0x47797c in vlan_bitmap_clone lib/vlan-bitmap.h:40
    6 0x49048d in bundle_set ofproto/ofproto-dpif.c:3433
    7 0x444f92 in ofproto_bundle_register ofproto/ofproto.c:1455
    8 0x40e6c9 in port_configure vswitchd/bridge.c:1300
    9 0x40bcfd in bridge_reconfigure vswitchd/bridge.c:921
    10 0x41f1a9 in bridge_run vswitchd/bridge.c:3313
    11 0x42d4fb in main vswitchd/ovs-vswitchd.c:132
    12 0x7f312fbbcc86 in __libc_start_main (/usr/lib64/libc.so.6+0x25c86)

Fixes: fed8962aff57 ("Add new port VLAN mode "dot1q-tunnel"")
Signed-off-by: Yunjian Wang &lt;wangyunjian@huawei.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>ci: Separate DPDK from OVS build.</title>
<updated>2023-05-05T17:19:06+00:00</updated>
<author>
<name>David Marchand</name>
<email>david.marchand@redhat.com</email>
</author>
<published>2023-05-04T17:10:49+00:00</published>
<link rel='alternate' type='text/html' href='http://trove.baserock.org/cgit/delta/openvswitch.git/commit/?id=1a1b3106d90e517be416ae14eed625eee240517e'/>
<id>1a1b3106d90e517be416ae14eed625eee240517e</id>
<content type='text'>
Let's separate DPDK compilation from the rest of OVS build:
- this avoids multiple jobs building DPDK in parallel, which especially
  affects builds in the dpdk-latest branch,
- we separate concerns about DPDK build requirements from OVS build
  requirements, like python dependencies,
- building DPDK does not depend on how we will link OVS against it, so we
  can use a single cache entry regardless of DPDK_SHARED option,

Reviewed-by: Simon Horman &lt;simon.horman@corigine.com&gt;
Signed-off-by: David Marchand &lt;david.marchand@redhat.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Let's separate DPDK compilation from the rest of OVS build:
- this avoids multiple jobs building DPDK in parallel, which especially
  affects builds in the dpdk-latest branch,
- we separate concerns about DPDK build requirements from OVS build
  requirements, like python dependencies,
- building DPDK does not depend on how we will link OVS against it, so we
  can use a single cache entry regardless of DPDK_SHARED option,

Reviewed-by: Simon Horman &lt;simon.horman@corigine.com&gt;
Signed-off-by: David Marchand &lt;david.marchand@redhat.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>ovsdb-idl.at: Fix write-changed-only tests without change tracking.</title>
<updated>2023-05-04T16:17:39+00:00</updated>
<author>
<name>Ilya Maximets</name>
<email>i.maximets@ovn.org</email>
</author>
<published>2023-04-28T14:17:58+00:00</published>
<link rel='alternate' type='text/html' href='http://trove.baserock.org/cgit/delta/openvswitch.git/commit/?id=46240314ac483b93aef081d828b9e86fa9754feb'/>
<id>46240314ac483b93aef081d828b9e86fa9754feb</id>
<content type='text'>
The '-w' command line argument is not passed to test-ovsdb in the
OVSDB_CHECK_IDL_WRITE_CHANGED_ONLY_C, so it juts repeats normal
tests without testing the feature.

Adding the flag.  And using the long version of the flag to make
things more obvious and harder to overlook.  Swapping the argument
in the other working test as well, just for consistency.

Fixes: d94cd0d3eec3 ("ovsdb-idl: Support write-only-changed IDL monitor mode.")
Acked-by: Dumitru Ceara &lt;dceara@redhat.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The '-w' command line argument is not passed to test-ovsdb in the
OVSDB_CHECK_IDL_WRITE_CHANGED_ONLY_C, so it juts repeats normal
tests without testing the feature.

Adding the flag.  And using the long version of the flag to make
things more obvious and harder to overlook.  Swapping the argument
in the other working test as well, just for consistency.

Fixes: d94cd0d3eec3 ("ovsdb-idl: Support write-only-changed IDL monitor mode.")
Acked-by: Dumitru Ceara &lt;dceara@redhat.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>tc: Fix cleaning chains.</title>
<updated>2023-04-28T17:01:14+00:00</updated>
<author>
<name>Roi Dayan</name>
<email>roid@nvidia.com</email>
</author>
<published>2023-04-27T11:32:58+00:00</published>
<link rel='alternate' type='text/html' href='http://trove.baserock.org/cgit/delta/openvswitch.git/commit/?id=77d82289857f5cdcaaf4be06e17e750edcf0abd3'/>
<id>77d82289857f5cdcaaf4be06e17e750edcf0abd3</id>
<content type='text'>
Sometimes there is a need to clean empty chains as done in
delete_chains_from_netdev().  The cited commit doesn't remove
the chain completely which cause adding ingress_block later to fail.
This can be reproduced with adding bond as ovs port which makes ovs
use ingress_block for it.
While at it add the netdev name that fails to the log.

Fixes: e1e5eac5b016 ("tc: Add TCA_KIND flower to delete and get operation to avoid rtnl_lock().")
Signed-off-by: Roi Dayan &lt;roid@nvidia.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Sometimes there is a need to clean empty chains as done in
delete_chains_from_netdev().  The cited commit doesn't remove
the chain completely which cause adding ingress_block later to fail.
This can be reproduced with adding bond as ovs port which makes ovs
use ingress_block for it.
While at it add the netdev name that fails to the log.

Fixes: e1e5eac5b016 ("tc: Add TCA_KIND flower to delete and get operation to avoid rtnl_lock().")
Signed-off-by: Roi Dayan &lt;roid@nvidia.com&gt;
Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>AUTHORS: Add Stefan, Luca and Max.</title>
<updated>2023-04-26T12:54:41+00:00</updated>
<author>
<name>Ilya Maximets</name>
<email>i.maximets@ovn.org</email>
</author>
<published>2023-04-26T12:54:41+00:00</published>
<link rel='alternate' type='text/html' href='http://trove.baserock.org/cgit/delta/openvswitch.git/commit/?id=572e89f418e81f63053de7c284c4dcbf960ebaee'/>
<id>572e89f418e81f63053de7c284c4dcbf960ebaee</id>
<content type='text'>
Also, slightly re-sort the list to fix the order.

Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Also, slightly re-sort the list to fix the order.

Signed-off-by: Ilya Maximets &lt;i.maximets@ovn.org&gt;
</pre>
</div>
</content>
</entry>
</feed>
