Re: [PATCH] pid: remove redundant condition

From: Linus Torvalds
Date: Fri Apr 06 2012 - 02:26:26 EST


On Thu, Apr 5, 2012 at 11:16 PM, Liu Ping Fan <kernelfans@xxxxxxxxx> wrote:
> From: Liu Ping Fan <pingfank@xxxxxxxxxxxxxxxxxx>
>
> Signed-off-by: Liu Ping Fan <pingfank@xxxxxxxxxxxxxxxxxx>
> ---
>  kernel/pid.c |    3 +--
>  1 files changed, 1 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/pid.c b/kernel/pid.c
> index 9f08dfa..e4ca244 100644
> --- a/kernel/pid.c
> +++ b/kernel/pid.c
> @@ -248,8 +248,7 @@ void put_pid(struct pid *pid)
>                return;
>
>        ns = pid->numbers[pid->level].ns;
> -       if ((atomic_read(&pid->count) == 1) ||
> -            atomic_dec_and_test(&pid->count)) {
> +       if (atomic_dec_and_test(&pid->count) {
>                kmem_cache_free(ns->pid_cachep, pid);
>                put_pid_ns(ns);
>        }

No, this isn't necessarily redundant.

The atomic_dec_and_test() instruction can be very expensive. So if
count was 1 before, we're the last user, and we can free it without
the expensive atomic_dec_and_test().

However, if we are *not* the last user, then we can race with another
user decrementing the count, so now we need to use the expensive
version.

Now, whether that special case is really worth it or not, I don't
know. But it's not redundant.

Linus
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/