[ovs-dev] [urcu-fixes 1/4] timeval: Preserve quiescence across time_poll().
Alex Wang
alexw at nicira.com
Mon Apr 28 17:33:13 UTC 2014
This is a hard to notice one~,
Acked-by: Alex Wang <alexw at nicira.com>
On Mon, Apr 28, 2014 at 9:06 AM, Ben Pfaff <blp at nicira.com> wrote:
> Otherwise ovsrcu_synchronize() busy-waits in its loop because its
> poll_block() un-quiesces, causing the global_seqno to increase, which is
> what it waits for.
>
> Reported-by: Alex Wang <alexw at nicira.com>
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> lib/ovs-rcu.c | 7 +++++++
> lib/ovs-rcu.h | 1 +
> lib/timeval.c | 14 +++++++++-----
> 3 files changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/lib/ovs-rcu.c b/lib/ovs-rcu.c
> index 269f51b..b3c434d 100644
> --- a/lib/ovs-rcu.c
> +++ b/lib/ovs-rcu.c
> @@ -134,6 +134,13 @@ ovsrcu_quiesce(void)
> ovsrcu_quiesced();
> }
>
> +bool
> +ovsrcu_is_quiescent(void)
> +{
> + ovsrcu_init();
> + return pthread_getspecific(perthread_key) == NULL;
> +}
> +
> static void
> ovsrcu_synchronize(void)
> {
> diff --git a/lib/ovs-rcu.h b/lib/ovs-rcu.h
> index 710870a..4b451b2 100644
> --- a/lib/ovs-rcu.h
> +++ b/lib/ovs-rcu.h
> @@ -178,5 +178,6 @@ void ovsrcu_postpone__(void (*function)(void *aux),
> void *aux);
> void ovsrcu_quiesce_start(void);
> void ovsrcu_quiesce_end(void);
> void ovsrcu_quiesce(void);
> +bool ovsrcu_is_quiescent(void);
>
> #endif /* ovs-rcu.h */
> diff --git a/lib/timeval.c b/lib/timeval.c
> index ebbdb98..d2a4380 100644
> --- a/lib/timeval.c
> +++ b/lib/timeval.c
> @@ -263,6 +263,7 @@ time_poll(struct pollfd *pollfds, int n_pollfds,
> HANDLE *handles OVS_UNUSED,
> {
> long long int *last_wakeup = last_wakeup_get();
> long long int start;
> + bool quiescent;
> int retval = 0;
>
> time_init();
> @@ -274,6 +275,7 @@ time_poll(struct pollfd *pollfds, int n_pollfds,
> HANDLE *handles OVS_UNUSED,
> start = time_msec();
>
> timeout_when = MIN(timeout_when, deadline);
> + quiescent = ovsrcu_is_quiescent();
>
> for (;;) {
> long long int now = time_msec();
> @@ -287,10 +289,12 @@ time_poll(struct pollfd *pollfds, int n_pollfds,
> HANDLE *handles OVS_UNUSED,
> time_left = timeout_when - now;
> }
>
> - if (!time_left) {
> - ovsrcu_quiesce();
> - } else {
> - ovsrcu_quiesce_start();
> + if (!quiescent) {
> + if (!time_left) {
> + ovsrcu_quiesce();
> + } else {
> + ovsrcu_quiesce_start();
> + }
> }
>
> #ifndef _WIN32
> @@ -313,7 +317,7 @@ time_poll(struct pollfd *pollfds, int n_pollfds,
> HANDLE *handles OVS_UNUSED,
> }
> #endif
>
> - if (time_left) {
> + if (!quiescent && time_left) {
> ovsrcu_quiesce_end();
> }
>
> --
> 1.7.10.4
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20140428/98a8f284/attachment-0005.html>
More information about the dev
mailing list