Port flush and offload uninit should be moved after the datapath has been reconfigured. That way, no other thread such as PMDs will find this port to poll and enqueue further offload requests.
After a flush, almost no further offload request for this port should be found in the queue. There will still be some issued by revalidators, but they will be catched when the offload thread fails to take a netdev ref. This change fixes the issue of datapath reference being improperly accessed by offload threads while it is being destroyed. Fixes: 5b0aa55776cb ("dpif-netdev: Execute flush from offload thread.") Fixes: 62d1c28e9ce0 ("dpif-netdev: Flush offload rules upon port deletion.") Signed-off-by: Ilya Maximets <i.maxim...@ovn.org> Signed-off-by: Gaetan Rivet <gr...@u256.net> --- lib/dpif-netdev.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index e28e0b554..b5702e6a1 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2313,13 +2313,22 @@ static void do_del_port(struct dp_netdev *dp, struct dp_netdev_port *port) OVS_REQ_WRLOCK(dp->port_rwlock) { - dp_netdev_offload_flush(dp, port); - netdev_uninit_flow_api(port->netdev); hmap_remove(&dp->ports, &port->node); seq_change(dp->port_seq); reconfigure_datapath(dp); + /* Flush and disable offloads only after 'port' has been made + * inaccessible through datapath reconfiguration. + * This prevents having PMDs enqueuing offload requests after + * the flush. + * When only this port is deleted instead of the whole datapath, + * revalidator threads are still active and can still enqueue + * offload modification or deletion. Managing those stray requests + * is done in the offload threads. */ + dp_netdev_offload_flush(dp, port); + netdev_uninit_flow_api(port->netdev); + port_destroy(port); } -- 2.31.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev