diff options
author | Ophir Munk <ophirmu@mellanox.com> | 2019-12-08 14:29:14 +0000 |
---|---|---|
committer | Ilya Maximets <i.maximets@ovn.org> | 2019-12-08 15:48:23 +0100 |
commit | 1061dc7c85e780269697f7f8980f3b25cd3b1278 (patch) | |
tree | fbdd1cf1202a8dec8dda4890cf68e838ee1e3998 | |
parent | 164413156cf94d0f4dd1971cf0cc820f8b86055b (diff) | |
download | openvswitch-1061dc7c85e780269697f7f8980f3b25cd3b1278.tar.gz |
dpif-netdev: Retrieve dpif_class from struct dp_netdev.
In case a pmd pointer (struct dp_netdev_pmd_thread *) needs to retrieve
the dpif_class it points at - it can access it as: pmd->dp->class. A
second option is to access it as: pmd->dp->dpif->dpif_class. The first
option is safe since there is one dp netdev with a constant pointer to
the dpif class. The second option is not safe since the pointer
pmd->dp->dpif may be changed under the hood, for example, in case there
is a call to dpif_open(). One such scenario is when a netdev bridge is
running while dumping flows statistics with dpctl in parallel:
ovs-appctl dpctl/dump-flows. This commit makes usage of the first
safe option instead of the second option.
Fixes: 30115809da2e ("dpif-netdev: Use netdev-offload API for port lookup while offloading")
Signed-off-by: Ophir Munk <ophirmu@mellanox.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
-rw-r--r-- | lib/dpif-netdev.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 1e5493615..7ebf4ef87 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -2269,7 +2269,7 @@ mark_to_flow_disassociate(struct dp_netdev_pmd_thread *pmd, struct netdev *port; odp_port_t in_port = flow->flow.in_port.odp_port; - port = netdev_ports_get(in_port, pmd->dp->dpif->dpif_class); + port = netdev_ports_get(in_port, pmd->dp->class); if (port) { ret = netdev_flow_del(port, &flow->mega_ufid, NULL); netdev_close(port); @@ -2410,7 +2410,7 @@ dp_netdev_flow_offload_put(struct dp_flow_offload_item *offload) } info.flow_mark = mark; - port = netdev_ports_get(in_port, pmd->dp->dpif->dpif_class); + port = netdev_ports_get(in_port, pmd->dp->class); if (!port || netdev_vport_is_vport_class(port->netdev_class)) { netdev_close(port); goto err_free; |