Re: [PATCH iptables] xtables: use exponential delay when waiting for xtables lock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2016-04-08 11:07 GMT+08:00 Subash Abhinov Kasiviswanathan
<subashab@xxxxxxxxxxxxxx>:
> ip[6]tables currently waits for 1 second for the xtables lock to
> be freed if the -w option is used. We have seen that the lock is
> held much less than that resulting in unnecessary delay when
> trying to acquire the lock. This problem is even severe in case
> of latency sensitive applications.
>
> Introduce an exponential delay starting from 10ms (experimentally
> determined) up to a second.
>
> Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@xxxxxxxxxxxxxx>
> ---
>  iptables/xshared.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/iptables/xshared.c b/iptables/xshared.c
> index 81c2581..d90ac13 100644
> --- a/iptables/xshared.c
> +++ b/iptables/xshared.c
> @@ -247,6 +247,7 @@ void xs_init_match(struct xtables_match *match)
>  bool xtables_lock(int wait)
>  {
>         int fd, waited = 0, i = 0;
> +       useconds_t base_delay = 10000;
>
>         fd = open(XT_LOCK_NAME, O_CREAT, 0600);
>         if (fd < 0)
> @@ -257,10 +258,15 @@ bool xtables_lock(int wait)
>                         return true;
>                 else if (wait >= 0 && waited >= wait)
>                         return false;
> -               if (++i % 2 == 0)
> +               if ((++i % 2 == 0) && (base_delay >= 200000))
>                         fprintf(stderr, "Another app is currently holding the xtables lock; "
>                                 "waiting (%ds) for it to exit...\n", waited);
>                 waited++;
> -               sleep(1);

This break the "-w" option's semantic, i.e. if the user input
"iptables -w 1", and concurrency happen,
we will just only wait 10ms and return an error.

> +               if (base_delay > 1000000) {
> +                       sleep(1);
> +               } else {
> +                       usleep(base_delay);
> +                       base_delay *= 2;
> +               }
>         }
>  }
> --
> 1.8.2.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Netfitler Users]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux