diff options
author | Lorenzo Bianconi <lorenzo.bianconi@redhat.com> | 2019-05-15 15:33:08 +0200 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2019-06-07 12:59:49 -0700 |
commit | a187bd814adc7f560f0d0524889f2a297caa8abd (patch) | |
tree | 6f52217d86d2eee75c320fa79d65a4cbe04859cd /ovn | |
parent | 88a28bbe5959a09d99d15ee2e6ee4714f9682ce8 (diff) | |
download | openvswitch-a187bd814adc7f560f0d0524889f2a297caa8abd.tar.gz |
ovn: grab pinctrl_mutex before running pinctrl_handle_buffered_packets
pinctrl_handle_buffered_packets can insert new elements in
buffered_packets_map hasmap and it runs concurrently with pinctrl_run
starting from commit 3594ffab6b4b. Fix possible races grabbing
pinctrl_mutex before running pinctrl_handle_buffered_packets
Fixes: 3594ffab6b4b ("ovn-controller: Add a new thread in pinctrl module to handle packet-ins.")
Acked-by: Han Zhou <hzhou8@ebay.com>
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'ovn')
-rw-r--r-- | ovn/controller/pinctrl.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/ovn/controller/pinctrl.c b/ovn/controller/pinctrl.c index b7bb4c990..2ecefcf60 100644 --- a/ovn/controller/pinctrl.c +++ b/ovn/controller/pinctrl.c @@ -466,6 +466,7 @@ static int pinctrl_handle_buffered_packets(const struct flow *ip_flow, struct dp_packet *pkt_in, const struct match *md, bool is_arp) + OVS_REQUIRES(pinctrl_mutex) { struct buffered_packets *bp; struct dp_packet *clone; @@ -514,7 +515,9 @@ pinctrl_handle_arp(struct rconn *swconn, const struct flow *ip_flow, return; } + ovs_mutex_lock(&pinctrl_mutex); pinctrl_handle_buffered_packets(ip_flow, pkt_in, md, true); + ovs_mutex_unlock(&pinctrl_mutex); /* Compose an ARP packet. */ uint64_t packet_stub[128 / 8]; @@ -3139,7 +3142,9 @@ pinctrl_handle_nd_ns(struct rconn *swconn, const struct flow *ip_flow, return; } + ovs_mutex_lock(&pinctrl_mutex); pinctrl_handle_buffered_packets(ip_flow, pkt_in, md, false); + ovs_mutex_unlock(&pinctrl_mutex); uint64_t packet_stub[128 / 8]; struct dp_packet packet; |