The pinctrl would go to sleep if the lock wasn't available without
checking if there is any other update. However, we still might be
able to process packets without the lock (some packet processing
still requires a lock). This improves the pinctrl throughput a bit.
Fixes: d71c45199341 ("pinctrl: Use ovs_mutex_trylock() in the pinctrl thread.")
Signed-off-by: Ales Musil <[email protected]>
---
controller/pinctrl.c | 33 ++++++++++++++++-----------------
1 file changed, 16 insertions(+), 17 deletions(-)
diff --git a/controller/pinctrl.c b/controller/pinctrl.c
index 775d37601..35c42942f 100644
--- a/controller/pinctrl.c
+++ b/controller/pinctrl.c
@@ -4026,26 +4026,25 @@ pinctrl_handler(void *arg_)
}
if (lock_failed) {
- /* Wait for 5 msecs before waking to avoid degrading the
- * lock to a spinlock. */
+ /* Wait for 5 msecs before waking in case there isn't anything
+ * else to process. */
poll_timer_wait(5);
- } else {
- rconn_run_wait(swconn);
- rconn_recv_wait(swconn);
- if (rconn_is_connected(swconn)) {
- send_garp_rarp_wait(send_garp_rarp_time);
- send_arp_nd_wait(send_arp_nd_time);
- ipv6_ra_wait(send_ipv6_ra_time);
- ip_mcast_querier_wait(send_mcast_query_time);
- svc_monitors_wait(svc_monitors_next_run_time);
- ipv6_prefixd_wait(send_prefixd_time);
- bfd_monitor_wait(bfd_time);
- }
- seq_wait(pinctrl_handler_seq, new_seq);
-
- latch_wait(&pctrl->pinctrl_thread_exit);
}
+ rconn_run_wait(swconn);
+ rconn_recv_wait(swconn);
+ if (rconn_is_connected(swconn)) {
+ send_garp_rarp_wait(send_garp_rarp_time);
+ send_arp_nd_wait(send_arp_nd_time);
+ ipv6_ra_wait(send_ipv6_ra_time);
+ ip_mcast_querier_wait(send_mcast_query_time);
+ svc_monitors_wait(svc_monitors_next_run_time);
+ ipv6_prefixd_wait(send_prefixd_time);
+ bfd_monitor_wait(bfd_time);
+ }
+ seq_wait(pinctrl_handler_seq, new_seq);
+ latch_wait(&pctrl->pinctrl_thread_exit);
+
ovsrcu_quiesce_start();
poll_block();
}
--
2.53.0
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev